DiffDaily

Deep & Concise - OSS変更の定点観測

[Rails] テスト並列実行時の情報ハンドラ復元による出力制御の修正

rails/rails

背景

Rails 8.0の開発中、コミット ec62932 でテスト並列実行に関するリファクタリングが行われた際、with_info_handler の呼び出しが誤って削除されていました。この削除により、並列実行されるテストの出力制御が正しく機能しなくなる可能性がありました。

この問題は @gstokkink によって #56434 のレビュー中に発見され、Rails 8.0の安定版ブランチに対して修正が適用されました。

技術的な変更内容

問題のあったコード

変更前のコードでは、with_info_handler によるラップが欠落していました:

result = if Minitest.respond_to? :run_one_method then
  Minitest.run_one_method klass, method
else
  klass.new(method).run
end

修正後のコード

with_info_handler を使用してテスト実行を適切にラップするように修正されました:

result = klass.with_info_handler reporter do
  if Minitest.respond_to? :run_one_method
    Minitest.run_one_method klass, method
  else
    klass.new(method).run
  end
end

技術的な意義

with_info_handler は、Minitestのテスト実行中に発生する情報メッセージ(info メソッドで出力されるメッセージ)を適切なレポーターに転送するための重要な仕組みです。

並列テスト実行環境では、複数のワーカープロセスが同時にテストを実行するため、各ワーカーの出力を適切に制御・集約する必要があります。with_info_handler がないと:

  • テストの進捗情報が正しいレポーターに送られない
  • 並列実行中のテスト出力が混在し、デバッグが困難になる
  • テストフレームワークの出力制御機構が機能しない

この修正により、Rails 8.0の並列テスト実行機能が再び正常に動作するようになりました。

影響範囲

この変更は、rails test コマンドで --parallel オプションを使用してテストを並列実行する際の動作に影響します。特に、テスト実行中の進捗表示やエラーメッセージの出力が関係する部分で改善が見られます。