CIテストのフレーク対策: `sleep 0.1` でステップ実行時間を調整

rails/rails

CI の並列実行テスト ContinuousIntegrationTest#test_parallel_group_stops_launching_new_steps_with_*_flag が、--fail-fast-f の両フラグで間欠的に失敗していた問題を、ステップ実行時間を意図的に遅延させることで安定化した。

背景

このテストは parallel: 2 のグループ内で最初に失敗したステップ (Fail) が出た後、残りのステップが実行されないことを確認するものだが、従来の step "Should not run X", "true" は即時成功を返すため、スレッドが失敗を検知する前に次のステップがデキューされ、稀に「Should not run 3」が実行されテストがフレークした。

技術的な変更

テストコードの step 定義true から sleep 0.1 に置き換え、各ステップの実行時間を約 0.1 秒に延長した。これにより失敗ステップの完了 (false が約 0.02 秒で失敗) よりも後続ステップの実行が遅れ、ワーカーが失敗を認識した時点でキューからタスクが取り除かれ、期待どおりにスキップされるようになる。

@@ -311,9 +311,9 @@ class ContinuousIntegrationTest < ActiveSupport::TestCase
             @CI.run("CI", nil) do
               group "Checks", parallel: 2 do
                 step "Fail", "false"
-                step "Should not run 1", "true"
-                step "Should not run 2", "true"
-                step "Should not run 3", "true"
+                step "Should not run 1", "sleep", "0.1"
+                step "Should not run 2", "sleep", "0.1"
+                step "Should not run 3", "sleep", "0.1"
               end
             end
           end

設計判断

この修正は テストコードのみ に対する変更であり、実装ロジックや公開 API への影響はない。sleep を利用した遅延はテストの時間的特性を制御するシンプルな手段で、他のテストケースへの副作用を回避しつつフレークを除去できる点が採用された判断基準となっている。また、true ステップを残すと非決定的なスレッドスケジューリングに依存するため、明示的な遅延で deterministic にする方針が取られた。

まとめ

step "Should not run X"sleep 0.1 に変更したことで、CI の並列テストにおける失敗後のステップスキップが確実になり、フレークが解消された。生産コードへの影響はなく、テストの信頼性向上という目的に特化した最小限の変更である。

記事メタデータ

Generated by:
gpt-oss-120b for DiffDaily
LLM Trace:
840ef010

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
gpt-oss-120b for DiffDaily

Review Criteria:

記事構成 ✓ PASS

Title, Context, Technical Detailの存在と明確さ

リード文、背景、技術的変更、設計判断(任意)、まとめの構成が明確に存在し、総論→各論→結論の流れが保たれています。

カスタムMarkdown構文 ⚠ WARNING

シンタックスハイライト・GitHubリンク記法の正確性

コードブロックのファイル名付きシンタックスハイライトは正しい形式ですが、GitHubリンクが "PR #57899" という表記で、要求される "[#57899](URL)" 形式になっていません。リンク形式の修正が必要です。

対象読者への適合性 ✓ PASS

エンジニア向けの適切な技術レベルと表現

Rails の開発者向けに技術的な説明が中心で、初心者向けの過度な解説はありません。対象読者に適しています。

パラグラフ・ライティング ✓ PASS

トピックセンテンス・1段落1トピック・段落長

各セクションは総論パラグラフ、各論パラグラフ、結論パラグラフで構成され、段落はトピックセンテンスで開始し、1段落1トピック・6文以内に収まっています。段落間も空行で区切られています。

Diff内容との照合 ✓ PASS

コードブロックとDiff内容の一致

記事内のコードブロックは提供された Diff と完全に一致し、ファイル名・変更内容・行番号が正確に反映されています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

"flaky", "parallel", "step", "sleep" などの用語は PR で使用されているものと一致し、誤用はありません。

説明の技術的正確性 ✓ PASS

技術的主張の正確性と論理性

技術的な主張は PR の記述と一致し、因果関係(sleep による遅延でフレーク除去)が論理的に説明されています。

事実の突合 ✓ PASS

PR情報による主張の裏付け(ハルシネーション検出)

記事の全ての事実は PR のタイトル、説明、Diff で裏付けられており、推測や捏造は見当たりません。

数値・固有名詞の確認 ✓ PASS

PR番号・コミットID・バージョン等の正確性

0.1 秒、0.02 秒、PR 番号 #57899 などの数値・固有名詞は正確です。

タイトル・説明との一致 ✓ PASS

記事タイトル・説明とPR内容の一致

記事タイトルは PR の内容(フレーク対策として sleep 0.1 を導入)を的確に要約しており、矛盾はありません。

外部知識の正確性 ✓ PASS

PRに記載のない外部知識(LTS、サポート状況など)の不使用

記事は PR に記載された情報以外のバージョンサポートやリリーススケジュール等の外部知識を含んでいません。

時間表現の正確性 ✓ PASS

時間表現がPR情報と一致しているか

時間表現の歪曲はなく、PR の記述と一致しています。