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-metadata
とupdate-tests-metadata
ジョブ) の JSON レポートファイルに、flaky な例を記録する自作のRspecFlaky::Listener
リスナーも使用しています。
これはもともと次のように実装されていました:https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/13021。
内部でリトライを有効にしたい場合は、RETRIES
環境変数を使用します。インスタンスンスRETRIES=1 bin/rspec ...
、失敗したサンプルを1回リトライします。
GitLabで過去に起こった問題
-
rspec-retry
は、いくつかのAPI仕様が失敗したときに私たちを噛む:https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/9825 -
PG::UniqueViolation
による散発的な RSpec の失敗:https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/9846 - FFakerは、テストが扱えないようなファンキーなデータを生成します(テストは予測可能であるべきなので、それは悪いことです!):
-
spec/mailers/notify_spec.rb
をより堅牢に :https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/10015 -
spec/requests/api/commits_spec.rb
における一過性の故障:https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/9944 - FFakerのファクトリーデータをシーケンスに置き換えます:https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/10184
- spec/finders/issues_finder_spec.rbの一時的な失敗:https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/10404
-
時間依存の欠陥テスト
- https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/10046
- https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/10306
配列順序の期待値
機能テスト
- 演習を開始する前に、テストに必要なすべてのデータを作成してください:https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/12059
- ビス:https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/12604
- ビス:https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/12664
- ページのコンテンツに対してではなく、基礎となるデータベースの状態に対してアサートします:https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/10934
- JSテストでは、カピバラがクリックを送信したタイミングで要素が移動すると、要素の移動によってカピバラが誤クリックすることがあります。
- イベントハンドラが設定される前にJSイベントをトリガー
- Markdown画像の
src
属性にアサートする際、画像が遅延ロードされるのを待ちます。
カピバラのビューポートサイズに関するイシュー
- spec/features/issues/filtered_search/filter_issues_spec.rb の一時的な失敗:https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/10411
カピバラJSドライバ関連のイシュー
- AJAXリクエストが発生していないときは、AJAXを待ちません:https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/10454
- ビス:https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/12626
PhantomJS / WebKit関連のイシュー
- メモリは屋根を突き破っています!(TL;DR:画像をロードするが、画像の要求をブロックする!):https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/12003
カピバラ期待タイムアウト
リソース
- 欠陥のあるテスト:本当に再実行しますか?
- 欠陥のあるテストに対処し、排除する方法
- Railsのテストスイートにおける脆弱性の扱い方のヒント
- 欠陥テスト:ショートストーリー
- インサイトを使用して、欠陥のあるテスト、遅いテスト、失敗したテストを発見します。