Testing Files Generator
日本語

CIパイプラインでテストファイルを生成する方法

リポジトリ内のバイナリのフィクスチャは履歴に永遠に残り、diffでレビューできず、ファイルが大きくなると成り立たなくなります。代わりに、パイプラインの中でレシピからファイルを生成してください。レシピはテキストで、バイトは毎回同じになり、最後のステップで何も動いていないことを証明できます。

短い答え

tfgをインストールし、テストの前にtfg generate fixtures.yaml --out ./fixturesを、テストの後にtfg verify ./fixtures/manifest.jsonを実行します。どちらのステップも自らビルドを失敗させ、理由を示す終了コードを返します。

コミットしない理由

フィクスチャをリポジトリに置くべきでない理由

コミットするのはレシピです。同じレシピと同じシードは、どのマシンでも同じバイトを書き出すので、パイプラインで生成したファイルは、ノートPCで使っていたファイルと同じものです。

レシピ

テストの隣に置くレシピ

このレシピは、受け入れられるべき請求書を25件と、上限を超えて拒否されるべき画像を2枚書き出し、マニフェストが両方の期待を記録します。

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は何も書き込まずにレシピを検査し、すべての問題を一度に挙げます。

GitHub Actions

ツールをインストールしてフィクスチャを作るワークフロー

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

チェックサムの行は、アーカイブを同じリリースのverify-SHA256SUMS.txtと照合します。バージョンは固定されているので、新しいリリースが、手を付けていないビルドを変えることはありません。

GitLab CI

同じことを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

赤くなったとき

ステップを失敗させるものとその理由

終わり方ごとに専用の終了コードがあるので、ステップは自ら失敗し、ログがどれかを示します。パイプラインが出会うのは次のものです。

失敗した実行は標準出力に何も出力しないので、ログパーサーがエラーをデータと取り違えることはありません。表の全体はドキュメントのページにあります。

PowerShell

PowerShellのスクリプトにはもう1行必要です

PowerShellは、プログラムの終了コードを.ps1ファイルの外に持ち出しません。-Fileで実行すると、中のツールが作業を拒否した場合でもスクリプトは0を返し、赤になるはずのビルドが緑になります。最後の1行が修正のすべてです。

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

これはPowerShellの挙動であり、このツールの話ではありません。cmd、bash、zshには余分な手当ては要りません。

複数のジョブ

ジョブ間でフィクスチャを共有する

たいていアップロードは不要です。同じレシピは同じバイトを書き出すので、各ジョブが自分でtfg generateを実行でき、アップロードしてダウンロードするより速くなります。あるジョブが別のジョブからファイルを受け取る必要があるときは、転送の後にマニフェストに対してtfg verifyを実行すると、届いたものが書き出されたものと同じかどうかが分かります。

次へ

ここからどこへ