GitHub Actionsで画像生成プログラムの簡単な自動テストをする
CIにGitHub Actionsを利用しているプロジェクト内に画像生成をしているプログラムがありました。画像生成プログラムには自動テストが無く、依存ライブラリのバージョンを上げる(DependabotのPRを処理する)際に不安を感じたので、成果物に差分があるかをチェックする簡単なテストを追加してみました。
方針
- 期待される生成物として、事前に生成した画像をリポジトリに入れておく
 - GitHub Actionsで画像を生成し、変化がないことをテストする
- 画像の比較にはImageMagickのCompareコマンドを使う(追加の依存なし)
 - テストが失敗した場合には差分の画像をartifactとして出力する
 
 
具体的な設定
# ...
    steps:
      # ...
      - name: "Image Generation Test"
        run: |
          mkdir -p tmp/artifacts
          compare "$EXPECTED_IMAGE" <(generate-image) tmp/artifacts/diff.png
      - name: "Upload Failed Tests' Diffs"
        uses: actions/upload-artifact@v3
        if: failure()
        with:
          name: failed-tests-diffs
          path: tmp/artifacts
          retention-days: 5
          if-no-files-found: ignore
 "Image Generation Test" について
$EXPECTED_IMAGE には事前にリポジトリに追加しておいた、期待される生成結果の画像パスを入れます。意図して画像生成プログラムに変更を加えた場合には、この画像も更新する必要があります。
generate-image も自分のプロジェクトにあったものを入れます。ここでは、標準出力に出力するものを想定しています。入力が必要な場合には $EXPECTED_IMAGE を生成した時と同じ入力を渡します。例えばHTTPサーバとして動いているなら、事前に立ち上げておいて curl --silent -X POST --data "$IMAGE_INPUT" "$IMAGE_GENERATOR_URL"するなど。
compareコマンドはGitHub Actionsでruns-on: ubuntu-latest している場合デフォルトで入っており、インストールは不要でした。使い方は、比較したい入力画像input1.png, input2.pngがあるとき
$ compare input1.png input2.png diff.png
とすると、差分が強調された画像がdiff.pngに出力されます。設定では後でアップロードするtmp/artifactsに出力しています。
compareのexit statusは差分がないときには0、あるときには1になります。そのため差分があったときは "Image Generation Test"は失敗します。
 "Upload Failed Tests' Diffs"について
actions/upload-artifact@v3を使い、にテストが失敗した時のみtmp/artifactsをアップロードしているだけです。
詳しくはactions/upload-artifactをご覧ください。
Discussion