Testing Files Generator
Nederlands

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 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:

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