Hoe genereer je testbestanden in een CI-pipeline
Een binaire fixture in een repository blijft voorgoed in de geschiedenis, kan niet in een diff worden beoordeeld en wordt onmogelijk zodra het bestand groot is. Genereer de bestanden in plaats daarvan in de pipeline uit een recept. Het recept is tekst, de bytes komen elke keer hetzelfde uit en een laatste stap bewijst dat er niets is veranderd.
Het korte antwoord
Installeer tfg, voer vóór de tests tfg generate fixtures.yaml --out
./fixtures uit en erna tfg verify ./fixtures/manifest.json. Beide stappen
laten de build vanzelf mislukken, met een afsluitcode die zegt waarom.
Waarom niet committen
Waarom een fixture niet in de repository hoort
- Het blijft in de geschiedenis. Een binair bestand later verwijderen maakt een kloon niet kleiner, want elke versie ervan staat er nog.
- Een diff laat niet zien wat er veranderde. De reviewer ziet dat een PDF anders is en verder niets. Een recept verandert met één regel.
- Grote bestanden passen niet. GitHub weigert een push met een bestand van meer dan 100 MB, dus voor een test van een uploadlimiet van 500 MB valt er niets te committen.
Het recept is wat je commit. Hetzelfde recept en dezelfde seed schrijven op elke machine dezelfde bytes, dus het bestand dat in de pipeline wordt gegenereerd is het bestand dat je op je laptop had.
Het recept
Een recept dat naast de tests staat
Dit schrijft vijfentwintig facturen die geaccepteerd moeten worden en twee afbeeldingen boven een limiet die geweigerd moeten worden, en het manifest legt beide verwachtingen vast:
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 controleert het zonder iets te schrijven en noemt alle
problemen tegelijk.
GitHub Actions
Een workflow die de tool installeert en de fixtures bouwt
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
De regel met de controlesom vergelijkt het archief met verify-SHA256SUMS.txt uit
dezelfde release. De versie is vastgezet, dus een nieuwe release verandert nooit een build die
je niet hebt aangeraakt.
GitLab CI
Hetzelfde als GitLab-job
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
Wanneer het rood wordt
Wat een stap laat mislukken, en waarom
Elk einde heeft zijn eigen afsluitcode, dus de stap mislukt vanzelf en het log zegt welke. De codes die een pipeline tegenkomt:
3- het recept is niet geldig. Er is niets geschreven en elk probleem wordt genoemd4- het formaat kan niet wat er gevraagd werd, bijvoorbeeld een grootte onder zijn minimum6- er is niet genoeg schijfruimte7-tfg verifyvond een bestand dat niet bij zijn manifest past8- de run is klaar, maar niet alles is gemaakt
Een mislukte run drukt niets af op de standaarduitvoer, zodat een logparser een fout nooit voor data aanziet. De hele tabel staat op de documentatiepagina.
PowerShell
Een PowerShell-script heeft nog één regel nodig
PowerShell neemt de afsluitcode van een programma niet mee uit een .ps1-bestand. Start
er een met -File en het script antwoordt 0, ook als de tool erin het
werk weigerde, waardoor een build die rood hoort te zijn groen wordt. De laatste regel is de
hele oplossing:
tfg generate fixtures.yaml --out ./fixtures
exit $LASTEXITCODE
Zo gedraagt PowerShell zich, het ligt niet aan deze tool. cmd, bash en
zsh hebben niets extra nodig.
Meerdere jobs
De fixtures delen tussen jobs
Uploaden is meestal niet nodig. Omdat hetzelfde recept dezelfde bytes schrijft, kan elke job zijn
eigen tfg generate uitvoeren, wat sneller is dan uploaden en downloaden. Moet een
job bestanden van een andere ontvangen, voer dan na de overdracht tfg verify uit op
het manifest, en het zegt of wat aankwam is wat werd geschreven.
Verder
Waar je vandaar heen kunt
- Beschadigde testbestanden voegt met opzet kapotte bestanden toe aan hetzelfde recept.
- De toepassingen laten zien wat een run in een pipeline nog meer kan controleren.
- De documentatie bevat elk commando, elke receptsleutel en elke afsluitcode.