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
- Zůstává v historii. Pozdější smazání binárního souboru klon nezmenší, protože každá jeho verze je tam pořád.
- Diff neukáže, co se změnilo. Recenzent vidí, že PDF je jiné, a nic víc. Recept se změní o jeden řádek.
- Velké soubory se nevejdou. GitHub odmítne push, který obsahuje soubor větší než 100 MB, takže test limitu nahrávání 500 MB nemá co commitovat.
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á:
3- recept není platný. Nic se nezapsalo a každý problém je pojmenován4- formát neumí, co se chtělo, například velikost pod svým minimem6- na disku není dost místa7-tfg verifynašel soubor, který nesedí s manifestem8- běh skončil, ale ne všechno se vytvořilo
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
- Poškozené testovací soubory přidají do téhož receptu soubory záměrně rozbité.
- Případy použití ukazují, co dalšího může zkontrolovat běh v pipeline.
- Dokumentace obsahuje každý příkaz, klíč receptu a návratový kód.