CIパイプラインでテストファイルを生成する方法
リポジトリ内のバイナリのフィクスチャは履歴に永遠に残り、diffでレビューできず、ファイルが大きくなると成り立たなくなります。代わりに、パイプラインの中でレシピからファイルを生成してください。レシピはテキストで、バイトは毎回同じになり、最後のステップで何も動いていないことを証明できます。
短い答え
tfgをインストールし、テストの前にtfg generate fixtures.yaml --out
./fixturesを、テストの後にtfg verify
./fixtures/manifest.jsonを実行します。どちらのステップも自らビルドを失敗させ、理由を示す終了コードを返します。
コミットしない理由
フィクスチャをリポジトリに置くべきでない理由
- 履歴に残ります。バイナリをあとで削除しても、すべてのバージョンが残っているのでクローンは小さくなりません。
- diffでは何が変わったかが分かりません。レビューする人にはPDFが違うことしか見えません。レシピなら変更は1行です。
- 大きなファイルは収まりません。GitHubは100 MBを超えるファイルを含むプッシュを拒否するので、500 MBのアップロード上限のテストにはコミットできるものがありません。
コミットするのはレシピです。同じレシピと同じシードは、どのマシンでも同じバイトを書き出すので、パイプラインで生成したファイルは、ノート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
赤くなったとき
ステップを失敗させるものとその理由
終わり方ごとに専用の終了コードがあるので、ステップは自ら失敗し、ログがどれかを示します。パイプラインが出会うのは次のものです。
3- レシピが正しくありません。何も書き込まれず、すべての問題が示されます4- 形式が求められたことをできません。たとえば最小サイズを下回るサイズです6- ディスクの空き容量が足りません7-tfg verifyがマニフェストと一致しないファイルを見つけました8- 実行は終わりましたが、すべてが作られたわけではありません
失敗した実行は標準出力に何も出力しないので、ログパーサーがエラーをデータと取り違えることはありません。表の全体はドキュメントのページにあります。
PowerShell
PowerShellのスクリプトにはもう1行必要です
PowerShellは、プログラムの終了コードを.ps1ファイルの外に持ち出しません。-Fileで実行すると、中のツールが作業を拒否した場合でもスクリプトは0を返し、赤になるはずのビルドが緑になります。最後の1行が修正のすべてです。
tfg generate fixtures.yaml --out ./fixtures
exit $LASTEXITCODE
これはPowerShellの挙動であり、このツールの話ではありません。cmd、bash、zshには余分な手当ては要りません。
複数のジョブ
ジョブ間でフィクスチャを共有する
たいていアップロードは不要です。同じレシピは同じバイトを書き出すので、各ジョブが自分でtfg
generateを実行でき、アップロードしてダウンロードするより速くなります。あるジョブが別のジョブからファイルを受け取る必要があるときは、転送の後にマニフェストに対してtfg
verifyを実行すると、届いたものが書き出されたものと同じかどうかが分かります。
次へ
ここからどこへ
- 破損したテストファイルは、同じレシピに意図的に壊したファイルを加えます。
- ユースケースは、パイプラインでの実行がほかに何を確かめられるかを示します。
- ドキュメントには、すべてのコマンド、レシピのキー、終了コードが載っています。