Flakyなテスト

欠陥テストとは?

失敗することもあるテストですが、何度もやり直せば、最終的には合格します。

隔離されたテスト

masterでテストが頻繁に失敗する場合、~”master:broken”イシューを作成する必要があります。 もしそのテストがタイムリーに修正できない場合、すべての開発者の生産性に影響するため、:quarantine メタデータを割り当てて隔離する必要があります。

これは、--tag quarantineで実行しない限りスキップされることを意味します:

bin/rspec --tag quarantine

テストを隔離する前に、そのテストに~”master:broken “イシューが存在することを確認すべきです。

検査が隔離されると、3つの選択肢があります:

  • テストは修正されるべきでしょうか?
  • このテストは、より低いレベルのテストに移されるべきですか?
  • そのテストは完全に削除されるべきでしょうか(例えば、既に下位レベルのテストがある、別の同レベルのテストと重複している、テストが多すぎる、など)。

CIでの検疫テスト

隔離されたテストは、失敗が許される専用のジョブでCI上で実行されます:

  • rspec-pg-quarantine (CEおよびEE)
  • rspec-pg-quarantine-ee (EEのみ)

自動再試行とフレークテストの検出

私たちのCIでは、RSpec::Retryを使用して、失敗したサンプルを自動的に数回リトライしています(正確なリトライ回数はspec/spec_helper.rb )。

また、master (retrieve-tests-metadataupdate-tests-metadata ジョブ) の JSON レポートファイルに、flaky な例を記録する自作のRspecFlaky::Listener リスナーも使用しています。

これはもともと次のように実装されていました:https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/13021

内部でリトライを有効にしたい場合は、RETRIES 環境変数を使用します。インスタンスンスRETRIES=1 bin/rspec ... 、失敗したサンプルを1回リトライします。

GitLabで過去に起こった問題

時間依存の欠陥テスト

配列順序の期待値

機能テスト

カピバラ期待タイムアウト

リソース


テストドキュメントに戻る