本物のバグを隠さずにflakyなテストをquarantineする方法
quarantineとは、既知のflakyなテストを削除せずにmergeをブロックするパスから引き離す規律です - こうしてbuildの信頼性を保ちながら、修正すべきテストとして記録に残しておきます。
テストが明らかにflakyだと分かったとき、悪い選択肢が3つ(無視する、削除する、mergeをブロックさせる)と、良い選択肢が1つあります: quarantineです。正しく行えば、coverageを失わずにノイズを取り除けます。
削除や永久retryではなくquarantineする理由
flakyなテストを削除すると、flakyでないときに提供していたcoverageを失います。一律のretryは本物の回帰を隠します。mergeをブロックさせ続けると、赤いbuildを無視するようチームを慣らしてしまいます。quarantineはその針の穴を通します: テストは依然として実行されレポートしますが、その結果はもはやmergeのgateにはなりません。
quarantineの方法
- テストにタグを付け(例えば
quarantine/flakyマーカー)、runnerが分離できるようにします。 - quarantineされたテストは、レポートはするがbuildを落とさない非ブロッキングのレーンで実行します。
- quarantineした瞬間に、そのテストに紐づく追跡チケットを起票します。
- テストを実行し続けて、どれくらいの頻度でまだflakyになるかのデータを収集します。
誠実さを保つ
quarantineは一時的で可視でなければ、死んだcoverageの墓場になってしまいます。テストがquarantineに留まれる期間に上限を設け、quarantineリストをdashboardに表示し、期限が切れたら修正か削除かの判断を必須にしましょう。flake管理の原則が当てはまります: ノイズは封じ込め、シグナルは決して黙らせないこと。
戻すか削除するか
根本の非決定性が修正されたら、テストをブロッキングスイートに戻し、多数の実行にわたって安定していることを確認します。決定論的にできず、かつ固有のものを何もテストしていないなら、意図的に削除しましょう - 永久にquarantineされた亡霊よりも、誠実な削除のほうがましです。
重要なポイント
- quarantineは既知のflakyなテストをブロッキングパスから外しつつ、実行は続けます。
- ノイズがmergeのgateになったり回帰を隠したりさせずに、coverageを保ちます。
- quarantineは必ず追跡チケットと期限とセットにしましょう。
- 修正できたら戻し、そうでなければ意図的に削除しましょう - 永久的な亡霊を決して残さないこと。
関連ガイド
Flaky Tests in CI: Causes, Detection, and ContainmentWhat makes tests flaky, how to detect flakiness, and how to contain it with quarantines and bounded retries w…
Retries and Idempotency in CI: Retry Safely Without Side EffectsRetrying a failed step only helps if the step is idempotent - safe to run twice. Learn what idempotency means…
Pipeline Observability Basics: Seeing Why CI FailsPipeline observability is the ability to answer why a build failed, slowed, or flaked from data you already c…