Comment générer des fichiers de test dans un pipeline CI
Une fixture binaire dans un dépôt reste à jamais dans son historique, ne se relit pas dans un diff et devient impossible dès que le fichier est gros. Générez plutôt les fichiers dans le pipeline à partir d'une recette. La recette est du texte, les octets sortent identiques à chaque fois, et une dernière étape prouve que rien n'a bougé.
La réponse courte
Installez tfg, lancez tfg generate fixtures.yaml --out ./fixtures avant
les tests et tfg verify ./fixtures/manifest.json après. Les deux étapes font
échouer le build d'elles-mêmes, avec un code de sortie qui dit pourquoi.
Pourquoi ne pas les commiter
Pourquoi une fixture ne doit pas vivre dans le dépôt
- Elle reste dans l'historique. Supprimer un binaire plus tard ne rend pas un clone plus petit, car chacune de ses versions est toujours là.
- Un diff ne montre pas ce qui a changé. Le relecteur voit qu'un PDF est différent, et rien de plus. Une recette change d'une ligne.
- Les gros fichiers ne tiennent pas. GitHub refuse un push qui contient un fichier de plus de 100 Mo, donc un test d'une limite d'envoi de 500 Mo n'a rien à commiter.
C'est la recette qu'il faut commiter. La même recette et la même graine écrivent les mêmes octets sur toute machine, donc le fichier généré dans le pipeline est celui que vous aviez sur votre portable.
La recette
Une recette qui vit à côté des tests
Celle-ci écrit vingt-cinq factures qui doivent être acceptées et deux images au-dessus d'une limite qui doivent être refusées, et le manifeste note les deux attentes :
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 la vérifie sans rien écrire et nomme tous les problèmes d'un
coup.
GitHub Actions
Un workflow qui installe l'outil et construit les 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
La ligne de somme de contrôle compare l'archive à verify-SHA256SUMS.txt de la même
version. La version est épinglée, donc une nouvelle version ne change jamais un build que vous
n'avez pas touché.
GitLab CI
La même chose en job 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
Quand ça passe au rouge
Ce qui fait échouer une étape, et pourquoi
Chaque fin a son propre code de sortie, donc l'étape échoue d'elle-même et le journal dit lequel. Ceux que rencontre un pipeline :
3- la recette n'est pas valide. Rien n'a été écrit, et chaque problème est nommé4- le format ne sait pas faire ce qui a été demandé, par exemple une taille sous son minimum6- il n'y a pas assez d'espace disque7-tfg verifya trouvé un fichier qui ne correspond pas à son manifeste8- l'exécution est terminée, mais tout n'a pas été produit
Une exécution échouée n'écrit rien sur la sortie standard, donc un analyseur de journaux ne prend jamais une erreur pour des données. Le tableau complet est sur la page de documentation.
PowerShell
Un script PowerShell demande une ligne de plus
PowerShell ne fait pas sortir le code de sortie d'un programme d'un fichier .ps1.
Lancez-en un avec -File et le script répond 0 même quand l'outil à
l'intérieur a refusé le travail, si bien qu'un build qui devrait être rouge passe au vert. La
dernière ligne est toute la correction :
tfg generate fixtures.yaml --out ./fixtures
exit $LASTEXITCODE
C'est ainsi que se comporte PowerShell, pas une particularité de cet outil. cmd,
bash et zsh n'ont besoin de rien de plus.
Plusieurs jobs
Partager les fixtures entre les jobs
Il n'y a généralement pas besoin de les envoyer. Comme la même recette écrit les mêmes octets,
chaque job peut lancer son propre tfg generate, ce qui est plus rapide qu'un envoi
suivi d'un téléchargement. Quand un job doit recevoir des fichiers d'un autre, lancez tfg
verify sur le manifeste après le transfert, et il dit si ce qui est arrivé est ce qui a
été écrit.
Suite
Où aller ensuite
- Fichiers de test corrompus ajoute à la même recette des fichiers cassés volontairement.
- Les cas d'usage montrent ce qu'une exécution dans un pipeline peut vérifier d'autre.
- La documentation donne chaque commande, chaque clé de recette et chaque code de sortie.