外部ツール未インストール時にActive Storageのテストを自動スキップ
Active Storageのテストスイートに、ffprobe・ffmpeg・mutoolといった外部ツールが存在しない環境では対象テストを自動スキップする仕組みが追加されました。これにより、依存ツールを全てインストールしなくても、Active Storageに対する小さな変更を手軽に検証できるようになります。
背景
Active Storageは動画解析・プレビュー・PDF変換などのために複数の外部コマンドラインツールに依存しており、これらが未インストールの環境でテストを実行するとエラーで失敗していました。ffprobe(動画メタデータ解析)、ffmpeg(動画プレビュー生成)、mutool(PDFプレビュー生成)はいずれもOSレベルのインストールが必要で、Active Storage本体のロジックに手を入れるだけの小規模な変更時にも、これら全ての依存ツールを用意しなければテストが通らない状態でした。
CI環境(Buildkite)ではこれらのツールが揃っているため問題になりませんでしたが、ローカル開発環境ではツールの有無がコントリビューションの障壁となっていました。
技術的な変更
対象の3テストファイルそれぞれに、setup ブロックを追加してツールの存在確認を行うようにしました。チェックには system("command", "-v", <tool>) を利用しており、ツールが見つからない場合は skip を呼び出してテストケース全体をスキップします。
変更されたファイルと対応するツールは以下の通りです:
-
activestorage/test/analyzer/video_analyzer_test.rb→ffprobe(ActiveStorage.paths[:ffprobe]にフォールバック) -
activestorage/test/previewer/video_previewer_test.rb→ffmpeg(ActiveStorage.paths[:ffmpeg]にフォールバック) -
activestorage/test/previewer/mupdf_previewer_test.rb→mutool(ActiveStorage.paths[:mutool]にフォールバック)
各ファイルへの追加内容はいずれも同じパターンに従っています。video_analyzer_test.rb を例に示します:
変更後:
setup do
if !ENV["BUILDKITE"] && !system("command", "-v", ActiveStorage.paths[:ffprobe] || "ffprobe")
skip("ffprobe isn't available")
end
end
ENV["BUILDKITE"] の条件によってCI環境ではチェックをバイパスし、ローカル環境でのみツール存在確認を実施します。ツールのパスは ActiveStorage.paths で上書きできるため、非標準パスにインストールされている場合も正しく検出されます。
設計判断
setup ブロックにスキップロジックを配置するアプローチが採用されています。skip をテストメソッドの先頭に個別に置くのではなく setup に集約することで、テストクラスに新しいテストケースが追加された場合でも自動的に同じチェックが適用されます。
CI環境向けに !ENV["BUILDKITE"] のガードを設けている点も重要です。CI上では依存ツールが必ず用意されているため、スキップが起きた場合に「テストが意図せず素通りしている」状況を防ぐ安全弁として機能しています。ローカルでのスキップを許容しつつ、CI上での網羅性は維持するというトレードオフが明示的に設計に組み込まれています。
まとめ
本PRは、Active Storageのテスト実行に対する環境依存の障壁を、最小限のコード追加で解消しています。外部ツールのチェックを setup に一元化し、CI環境では無条件に実行するガードを入れることで、ローカルでの開発体験を改善しつつCIの信頼性を損なわない設計を実現しています。