Testing Files Generator
Čeština

Jak generovat testovací soubory v CI pipeline

Binární fixture v repozitáři zůstává navždy v jeho historii, nedá se posoudit v diffu a při velkém souboru přestává být možný. Generujte soubory raději v pipeline z receptu. Recept je text, bajty vycházejí pokaždé stejné a poslední krok dokáže, že se nic nepohnulo.

Stručná odpověď

Nainstalujte tfg, před testy spusťte tfg generate fixtures.yaml --out ./fixtures a po nich tfg verify ./fixtures/manifest.json. Oba kroky shodí build samy, s návratovým kódem, který říká proč.

Proč je necommitovat

Proč fixture nepatří do repozitáře

Commitovat je třeba recept. Stejný recept a stejný seed zapíší na každém počítači stejné bajty, takže soubor vygenerovaný v pipeline je soubor, který jste měli na notebooku.

Recept

Recept, který leží vedle testů

Tento zapíše pětadvacet faktur, které se mají přijmout, a dva obrázky nad limitem, které se mají odmítnout, a manifest zaznamená obě očekávání:

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 ho zkontroluje, aniž cokoli zapíše, a pojmenuje všechny problémy najednou.

GitHub Actions

Workflow, které nainstaluje nástroj a postaví fixtures

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

Řádek s kontrolním součtem porovná archiv se souborem verify-SHA256SUMS.txt ze stejného vydání. Verze je pevně daná, takže nové vydání nikdy nezmění build, na který jste nesáhli.

GitLab CI

Totéž jako job v GitLabu

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

Když se to zbarví načerveno

Co shodí krok, a proč

Každý konec má vlastní návratový kód, takže krok selže sám a log řekne který. Ty, které pipeline potká:

Neúspěšný běh nevypíše nic na standardní výstup, takže parser logů nikdy nevezme chybu za data. Celá tabulka je na stránce dokumentace.

PowerShell

Skript PowerShellu potřebuje ještě jeden řádek

PowerShell nevynese návratový kód programu ze souboru .ps1. Spusťte ho s -File a skript odpoví 0, i když nástroj uvnitř práci odmítl, takže build, který měl být červený, zezelená. Poslední řádek je celá oprava:

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

Tak se PowerShell chová, nejde o vlastnost tohoto nástroje. cmd, bash a zsh nepotřebují nic navíc.

Více jobů

Sdílení fixtures mezi joby

Nahrávat je obvykle není třeba. Protože stejný recept zapisuje stejné bajty, může každý job spustit vlastní tfg generate, což je rychlejší než nahrání a stažení. Když má job přijmout soubory od jiného, spusťte po přenosu tfg verify nad manifestem a řekne vám, zda to, co dorazilo, je to, co bylo zapsáno.

Dál

Kam jít odtud