Railtiesテストの実行時間を再調整
RailsのCI環境におけるrailtiesテストの並列実行を最適化するため、各テストファイルの推定実行時間が再調整されました。この変更により、テストの分散配置が改善され、CI全体の実行時間短縮が期待できます。
背景
RailsのCI環境では、テストを複数のワーカーに分散して並列実行していますが、各テストの実行時間を事前に推定し、負荷を均等に分散する仕組みを採用しています。railties/Rakefile の estimated_duration Hashが、この推定時間を管理しています。
従来の推定値と実際の実行時間に乖離が生じていたため、特定のワーカーに処理が集中し、全体の実行時間が伸びる問題が発生していました。#56822 は、実際の実行時間に基づいて推定値を更新しています。
技術的な変更
railties/Rakefile の estimated_duration Hashの値が、実測値に基づいて大幅に調整されました。
データベース関連テストの推定時間短縮
データベース関連のテストファイルの推定時間が大幅に短縮されています:
# 変更前
"test/application/rake/dbs_test.rb" => 300,
"test/application/rake/dbs_schema_test.rb" => 500,
"test/application/rake/dbs_setup_test.rb" => 350,
"test/application/rake/dbs_postgresql_test.rb" => 150,
# 変更後
"test/application/rake/dbs_test.rb" => 20,
"test/application/rake/dbs_schema_test.rb" => 45,
"test/application/rake/dbs_setup_test.rb" => 45,
"test/application/rake/dbs_postgresql_test.rb" => 15,
PR本文によると、CI環境で約5分(300秒)かかるケースはほとんど観測されておらず、過去に単一テストがハングアップして実行時間が異常に長くなった事例があった可能性が指摘されています。実際の実行時間に合わせて、より現実的な値に修正されました。
設定・コンソール関連テストの推定時間延長
configuration_test.rb と console_test.rb の推定時間が大幅に延長されました:
# 変更前
"test/application/configuration_test.rb" => 106,
"test/application/console_test.rb" => 20,
# 変更後
"test/application/configuration_test.rb" => 200,
"test/application/console_test.rb" => 150,
これらのテストが過小評価されていたため、他の多数のテストと同じワーカーに詰め込まれ、そのワーカーの実行時間が突出して長くなっていました。推定時間を引き上げることで、これらのテストが独立したワーカーに配置されやすくなります。
新規テストの推定時間追加
実行時間が30秒を超える2つのテストファイルが、デフォルト値(1秒)から適切な推定値に更新されました:
"test/application/query_logs_test.rb" => 45,
"test/application/sprockets_assets_test.rb" => 30,
これらのテストはこれまでデフォルト値で扱われていたため、実際の実行時間との差が45倍・30倍に達していました。
設計判断
実測値ベースの継続的な調整 というアプローチが採用されています。
estimated_duration の値は固定された理論値ではなく、CI環境での実測値に基づいて定期的に更新される運用値として扱われています。PR本文では特定のテストについて「consistently take > 30s」(一貫して30秒を超える)という表現が使われており、複数回の実行結果から安定した傾向を確認した上で値を決定していることがわかります。
データベーステストの推定時間を1/10以下に短縮する一方で、設定・コンソールテストを2〜7倍に延長するという大胆な調整は、過去のハングアップ事例に引きずられていた過大評価を是正し、実態に即した分散を実現するための判断です。
まとめ
本PRは、railtiesテストの並列実行における負荷分散を改善した変更です。実測値に基づいて推定時間を大幅に再調整することで、特定のワーカーへの処理集中を解消し、CI全体の実行時間短縮につなげています。特に、過小評価されていた重量級テストと過大評価されていた軽量級テストの両方を是正した点が特徴的です。