CI पाइपलाइन में टेस्ट फ़ाइलें कैसे बनाएँ
रिपॉज़िटरी में बाइनरी फ़िक्स्चर उसके इतिहास में हमेशा के लिए रह जाता है, diff में उसकी समीक्षा नहीं हो सकती, और फ़ाइल बड़ी हो तो वह संभव ही नहीं रहता। इसके बजाय फ़ाइलें पाइपलाइन के भीतर रेसिपी से बनाएँ। रेसिपी पाठ है, बाइट हर बार एक जैसे निकलते हैं, और आख़िरी कदम साबित करता है कि कुछ नहीं खिसका।
छोटा जवाब
tfg इंस्टॉल करें, टेस्ट से पहले tfg generate fixtures.yaml --out
./fixtures चलाएँ और उनके बाद tfg verify ./fixtures/manifest.json। दोनों कदम
अपने आप बिल्ड को विफल करते हैं, एक ऐसे एग्ज़िट कोड के साथ जो कारण बताता है।
कमिट क्यों न करें
फ़िक्स्चर रिपॉज़िटरी में क्यों नहीं रहना चाहिए
- यह इतिहास में रह जाता है। बाद में बाइनरी हटाने से क्लोन छोटा नहीं होता, क्योंकि उसका हर संस्करण अब भी वहीं है।
- diff नहीं दिखाता कि क्या बदला। समीक्षक को बस दिखता है कि PDF अलग है, और कुछ नहीं। रेसिपी एक पंक्ति से बदलती है।
- बड़ी फ़ाइलें समाती नहीं। GitHub 100 MB से बड़ी फ़ाइल वाले पुश को ठुकरा देता है, इसलिए 500 MB की अपलोड सीमा के टेस्ट के पास कमिट करने को कुछ नहीं है।
कमिट करने की चीज़ रेसिपी है। वही रेसिपी और वही सीड हर मशीन पर वही बाइट लिखते हैं, इसलिए पाइपलाइन में बनी फ़ाइल वही फ़ाइल है जो आपके लैपटॉप पर थी।
रेसिपी
टेस्ट के बगल में रहने वाली रेसिपी
यह पच्चीस चालान लिखती है जिन्हें स्वीकार होना चाहिए और सीमा से ऊपर की दो छवियाँ जिन्हें अस्वीकार होना चाहिए, और मैनिफ़ेस्ट दोनों अपेक्षाएँ दर्ज करता है:
version: 1
seed: 7741
targets:
- id: invoices
format: pdf
count: 25
size: 300kb
expected: accept
- id: over_the_limit
format: png
count: 2
size: 12mb
expected:
outcome: reject
reason: size_limit
tfg validate fixtures.yaml उसे बिना कुछ लिखे जाँचता है और सारी समस्याएँ एक साथ बता देता
है।
GitHub Actions
एक वर्कफ़्लो जो टूल इंस्टॉल करता है और फ़िक्स्चर बनाता है
jobs:
test:
runs-on: ubuntu-latest
env:
TFG_VERSION: "0.4.0"
steps:
- uses: actions/checkout@v4
- name: install tfg
run: |
base=https://github.com/donislawdev/TestingFilesGenerator/releases/download/v$TFG_VERSION
curl -fsSLO "$base/tfg_${TFG_VERSION}_linux_amd64.tar.gz"
curl -fsSLO "$base/verify-SHA256SUMS.txt"
sha256sum --check --ignore-missing verify-SHA256SUMS.txt
tar -xzf "tfg_${TFG_VERSION}_linux_amd64.tar.gz" ./tfg
sudo mv tfg /usr/local/bin/
- name: build the fixtures
run: tfg generate fixtures.yaml --out ./fixtures
- name: run the tests
run: pytest tests/
- name: nothing moved
run: tfg verify ./fixtures/manifest.json
चेकसम वाली पंक्ति संग्रह को उसी रिलीज़ की verify-SHA256SUMS.txt से मिलाती है। संस्करण
तय कर दिया गया है, इसलिए नई रिलीज़ कभी ऐसे बिल्ड को नहीं बदलती जिसे आपने छुआ नहीं।
GitLab CI
वही बात GitLab जॉब के रूप में
fixtures:
image: ubuntu:24.04
variables:
TFG_VERSION: "0.4.0"
script:
- apt-get update -qq && apt-get install -y -qq curl ca-certificates
- base=https://github.com/donislawdev/TestingFilesGenerator/releases/download/v$TFG_VERSION
- curl -fsSLO "$base/tfg_${TFG_VERSION}_linux_amd64.tar.gz"
- curl -fsSLO "$base/verify-SHA256SUMS.txt"
- sha256sum --check --ignore-missing verify-SHA256SUMS.txt
- tar -xzf "tfg_${TFG_VERSION}_linux_amd64.tar.gz" ./tfg
- ./tfg generate fixtures.yaml --out ./fixtures
- pytest tests/
- ./tfg verify ./fixtures/manifest.json
जब यह लाल हो जाए
क्या किसी कदम को विफल करता है, और क्यों
हर अंत का अपना एग्ज़िट कोड है, इसलिए कदम अपने आप विफल होता है और लॉग बताता है कि कौन-सा था। जो पाइपलाइन को मिलते हैं:
3- रेसिपी मान्य नहीं है। कुछ नहीं लिखा गया, और हर समस्या का नाम लिया गया है4- फ़ॉर्मैट वह नहीं कर सकता जो माँगा गया, जैसे अपने न्यूनतम से नीचे का आकार6- डिस्क पर पर्याप्त जगह नहीं है7-tfg verifyको एक फ़ाइल मिली जो अपने मैनिफ़ेस्ट से मेल नहीं खाती8- रन पूरा हुआ, पर सब कुछ बना नहीं
विफल रन स्टैंडर्ड आउटपुट पर कुछ नहीं छापता, इसलिए लॉग पार्सर कभी किसी त्रुटि को डेटा नहीं समझता। पूरी तालिका दस्तावेज़ के पेज पर है।
PowerShell
PowerShell स्क्रिप्ट को एक पंक्ति और चाहिए
PowerShell किसी प्रोग्राम का एग्ज़िट कोड .ps1 फ़ाइल से बाहर नहीं ले जाता। एक को
-File से चलाएँ तो स्क्रिप्ट 0 देती है, चाहे भीतर के टूल ने काम से
इनकार कर दिया हो, और जो बिल्ड लाल होना चाहिए वह हरा हो जाता है। आख़िरी पंक्ति ही पूरा सुधार है:
tfg generate fixtures.yaml --out ./fixtures
exit $LASTEXITCODE
PowerShell ऐसा ही बरतता है, यह इस टूल की बात नहीं है। cmd, bash और
zsh को कुछ अतिरिक्त नहीं चाहिए।
कई जॉब
जॉब के बीच फ़िक्स्चर साझा करना
आम तौर पर उन्हें अपलोड करने की ज़रूरत नहीं होती। क्योंकि वही रेसिपी वही बाइट लिखती है, हर जॉब अपना
tfg generate चला सकता है, जो अपलोड और डाउनलोड से तेज़ है। जब किसी जॉब को दूसरे से
फ़ाइलें लेनी हों, तो ट्रांसफ़र के बाद मैनिफ़ेस्ट पर tfg verify चलाएँ, और वह बताएगा
कि जो पहुँचा वही है जो लिखा गया था।
आगे
यहाँ से कहाँ जाएँ
- खराब टेस्ट फ़ाइलें उसी रेसिपी में जानबूझकर बिगाड़ी गई फ़ाइलें जोड़ती हैं।
- उपयोग के मामले दिखाते हैं कि पाइपलाइन में एक रन और क्या जाँच सकता है।
- दस्तावेज़ में हर कमांड, हर रेसिपी कुंजी और हर एग्ज़िट कोड है।