Testing Files Generator
हिन्दी

CI पाइपलाइन में टेस्ट फ़ाइलें कैसे बनाएँ

रिपॉज़िटरी में बाइनरी फ़िक्स्चर उसके इतिहास में हमेशा के लिए रह जाता है, diff में उसकी समीक्षा नहीं हो सकती, और फ़ाइल बड़ी हो तो वह संभव ही नहीं रहता। इसके बजाय फ़ाइलें पाइपलाइन के भीतर रेसिपी से बनाएँ। रेसिपी पाठ है, बाइट हर बार एक जैसे निकलते हैं, और आख़िरी कदम साबित करता है कि कुछ नहीं खिसका।

छोटा जवाब

tfg इंस्टॉल करें, टेस्ट से पहले tfg generate fixtures.yaml --out ./fixtures चलाएँ और उनके बाद tfg verify ./fixtures/manifest.json। दोनों कदम अपने आप बिल्ड को विफल करते हैं, एक ऐसे एग्ज़िट कोड के साथ जो कारण बताता है।

कमिट क्यों न करें

फ़िक्स्चर रिपॉज़िटरी में क्यों नहीं रहना चाहिए

कमिट करने की चीज़ रेसिपी है। वही रेसिपी और वही सीड हर मशीन पर वही बाइट लिखते हैं, इसलिए पाइपलाइन में बनी फ़ाइल वही फ़ाइल है जो आपके लैपटॉप पर थी।

रेसिपी

टेस्ट के बगल में रहने वाली रेसिपी

यह पच्चीस चालान लिखती है जिन्हें स्वीकार होना चाहिए और सीमा से ऊपर की दो छवियाँ जिन्हें अस्वीकार होना चाहिए, और मैनिफ़ेस्ट दोनों अपेक्षाएँ दर्ज करता है:

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

जब यह लाल हो जाए

क्या किसी कदम को विफल करता है, और क्यों

हर अंत का अपना एग्ज़िट कोड है, इसलिए कदम अपने आप विफल होता है और लॉग बताता है कि कौन-सा था। जो पाइपलाइन को मिलते हैं:

विफल रन स्टैंडर्ड आउटपुट पर कुछ नहीं छापता, इसलिए लॉग पार्सर कभी किसी त्रुटि को डेटा नहीं समझता। पूरी तालिका दस्तावेज़ के पेज पर है।

PowerShell

PowerShell स्क्रिप्ट को एक पंक्ति और चाहिए

PowerShell किसी प्रोग्राम का एग्ज़िट कोड .ps1 फ़ाइल से बाहर नहीं ले जाता। एक को -File से चलाएँ तो स्क्रिप्ट 0 देती है, चाहे भीतर के टूल ने काम से इनकार कर दिया हो, और जो बिल्ड लाल होना चाहिए वह हरा हो जाता है। आख़िरी पंक्ति ही पूरा सुधार है:

tfg generate fixtures.yaml --out ./fixtures
exit $LASTEXITCODE

PowerShell ऐसा ही बरतता है, यह इस टूल की बात नहीं है। cmd, bash और zsh को कुछ अतिरिक्त नहीं चाहिए।

कई जॉब

जॉब के बीच फ़िक्स्चर साझा करना

आम तौर पर उन्हें अपलोड करने की ज़रूरत नहीं होती। क्योंकि वही रेसिपी वही बाइट लिखती है, हर जॉब अपना tfg generate चला सकता है, जो अपलोड और डाउनलोड से तेज़ है। जब किसी जॉब को दूसरे से फ़ाइलें लेनी हों, तो ट्रांसफ़र के बाद मैनिफ़ेस्ट पर tfg verify चलाएँ, और वह बताएगा कि जो पहुँचा वही है जो लिखा गया था।

आगे

यहाँ से कहाँ जाएँ