Testing Files Generator
Deutsch

So erzeugen Sie Testdateien in einer CI-Pipeline

Ein binäres Fixture in einem Repository bleibt für immer in dessen Verlauf, lässt sich in einem Diff nicht prüfen und geht bei großen Dateien gar nicht mehr. Erzeugen Sie die Dateien stattdessen in der Pipeline aus einem Rezept. Das Rezept ist Text, die Bytes sind jedes Mal dieselben, und ein letzter Schritt beweist, dass sich nichts verändert hat.

Die kurze Antwort

Installieren Sie tfg, führen Sie vor den Tests tfg generate fixtures.yaml --out ./fixtures aus und danach tfg verify ./fixtures/manifest.json. Beide Schritte lassen den Build von selbst scheitern, mit einem Exit-Code, der sagt, warum.

Warum nicht einchecken

Warum ein Fixture nicht im Repository liegen sollte

Einzuchecken ist das Rezept. Dasselbe Rezept mit demselben Seed schreibt auf jeder Maschine dieselben Bytes, die in der Pipeline erzeugte Datei ist also die Datei, die Sie auf dem Laptop hatten.

Das Rezept

Ein Rezept, das neben den Tests liegt

Dieses schreibt fünfundzwanzig Rechnungen, die angenommen werden sollen, und zwei Bilder über einem Limit, die abgewiesen werden sollen, und das Manifest hält beide Erwartungen fest:

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 prüft es, ohne etwas zu schreiben, und nennt jedes Problem auf einmal.

GitHub Actions

Ein Workflow, der das Tool installiert und die Fixtures erzeugt

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

Die Prüfsummenzeile vergleicht das Archiv mit verify-SHA256SUMS.txt aus demselben Release. Die Version ist festgelegt, ein neues Release ändert also nie einen Build, den Sie nicht angefasst haben.

GitLab CI

Dasselbe 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

Wenn es rot wird

Was einen Schritt scheitern lässt, und warum

Jedes Ende hat seinen eigenen Exit-Code, der Schritt scheitert also von selbst, und das Log sagt, welcher es war. Die, denen eine Pipeline begegnet:

Ein fehlgeschlagener Lauf gibt nichts auf der Standardausgabe aus, sodass ein Log-Parser nie einen Fehler für Daten hält. Die ganze Tabelle steht auf der Dokumentationsseite.

PowerShell

Ein PowerShell-Skript braucht eine Zeile mehr

PowerShell trägt den Exit-Code eines Programms nicht aus einer .ps1-Datei heraus. Starten Sie eine mit -File, und das Skript antwortet 0, auch wenn das Tool darin die Arbeit verweigert hat, sodass ein Build, der rot sein sollte, grün wird. Die letzte Zeile ist die ganze Lösung:

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

So verhält sich PowerShell, es liegt nicht an diesem Tool. cmd, bash und zsh brauchen nichts zusätzlich.

Mehrere Jobs

Fixtures zwischen Jobs teilen

Hochladen ist meist nicht nötig. Weil dasselbe Rezept dieselben Bytes schreibt, kann jeder Job sein eigenes tfg generate ausführen, und das geht schneller als Hoch- und Herunterladen. Muss ein Job Dateien von einem anderen erhalten, führen Sie nach der Übertragung tfg verify auf dem Manifest aus, und es sagt, ob das Angekommene dem Geschriebenen entspricht.

Weiter

Wohin es von hier geht