CIにおけるFlakyテスト: 原因、検出、封じ込め
flakyなテストは同じコードでpassしたりfailしたりします。管理されないまま放置すると、不安定さはCIへの信頼を蝕み、やがて赤いbuildが何も意味しなくなります。
flakyなテストは非決定的です。その結果はテスト対象のコード以外の何かに依存します。これらは腐食的です。なぜならチームに失敗を無視するよう仕向けるからです - CIの目的とは正反対です。
よくある原因
- race conditionとタイミングの前提(sleepベースの待機)。
- テストの順序への依存と共有された可変状態。
- 実際のネットワーク、時計、外部サービスへの依存。
- リソースの逼迫(遅く負荷のかかったrunnerがtimeoutを超過する)。
不安定さの検出
run全体にわたってテストごとのpass/failの履歴を追跡します。同じcommitでfailしてからpassするテストは、定義上flakyです。既知の良好なcommitでスイート全体を繰り返し再実行すると、最悪の要因が浮かび上がります。
バグを隠さずに封じ込める
既知のflakyなテストをquarantineしてmergeをブロックしないようにし、根本の非決定性を修正するチケットを起票し、既知のflakyなテストにのみ制限付きretryを適用します。原則は、ノイズをretryし、決してシグナルをretryしないこと - 一貫して再現する失敗は常に表面化しなければなりません。
重要なポイント
- flaky = 非決定的。結果はコード以外の何かに依存する。
- テストごとの履歴で検出する。同じcommitでのfail-then-passがその兆候。
- quarantine + 対象を絞ったretryで封じ込め、根本原因を修正する。
- 決してすべてを一律にretryしない - それは本物のリグレッションを隠す。
関連ガイド
Self-Healing CI: Containing Flaky Tests Without Hiding Real BugsFlaky tests fail intermittently with no code change. Learn how to identify them and how self-healing CI retri…
What Is a CI Runner? Managed vs Self-Hosted ExplainedA CI runner is the machine that executes your pipeline jobs. Learn how runners work, the difference between h…
Self-Healing CI: Handling Network Timeouts and Flaky ConnectionsNetwork timeouts during dependency downloads and API calls are transient. Learn the manual mitigations and ho…