フェイルファストテスト
- プラン: Premium、Ultimate
- 提供形態: GitLab.com、GitLab Self-Managed、GitLab Dedicated
テストの実行にRSpecを使用するアプリケーション向けに、Verify/Failfastマージリクエストの変更に基づいて、テストスイートのサブセットを実行するテンプレートを導入しました。
test_file_finder(tff)gemは、ファイルのリストを入力として受け入れ、入力ファイルに関連すると考えられる仕様(テスト)ファイルのリストを返します。
tffはRuby on Railsプロジェクト向けに設計されているため、Verify/FailFastテンプレートは、Rubyファイルへの変更が検出されたときに実行されるように設定されています。デフォルトでは、すべてのステージより前のGitLab CI/CDパイプラインの.preステージで実行されます。
ユースケースの例
フェイルファストテストは、プロジェクトに新しい機能を追加したり、新しい自動テストを追加したりする場合に役立ちます。
プロジェクトには、完了に時間がかかる数十万のテストがある可能性があります。新しいテストが合格することを期待するかもしれませんが、それを検証するには、すべてのテストが完了するのを待つ必要があります。並列化を使用している場合でも、これには1時間以上かかる可能性があります。
フェイルファストテストにより、パイプラインからのフィードバックループが高速化されます。新しいテストが合格し、新しい機能が他のテストを失敗させなかったことをすぐに知ることができます。
前提要件
このテンプレートには、以下が必要です:
- RSpecをテストに使用するRailsでビルドされたプロジェクト。
- 設定されたCI/CD:
- 利用可能なRubyを備えたDockerイメージを使用します。
- マージリクエストパイプラインを使用
- プロジェクト設定で有効になっているマージ結果パイプライン。
- 利用可能なRubyを備えたDockerイメージ。このテンプレートは、デフォルトで
image: ruby:2.6を使用しますが、これをオーバーライドできます。
高速RSpec失敗の設定
開始ポイントとして、次のプレーンなRSpec設定を使用します。プロジェクトのすべてのgemをインストールし、マージリクエストパイプラインでのみrspecを実行します。
rspec-complete:
stage: test
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
script:
- bundle install
- bundle exec rspecスイート全体ではなく、最初に関連性の高い仕様を実行するには、include CI/CDの設定に以下を追加してテンプレートを読み込む:
include:
- template: Verify/FailFast.gitlab-ci.ymlジョブをカスタマイズするには、テンプレートをオーバーライドするために特定のオプションを設定できます。たとえば、デフォルトのDockerイメージをオーバーライドするには、次のようにします:
include:
- template: Verify/FailFast.gitlab-ci.yml
rspec-rails-modified-path-specs:
image: custom-docker-image-with-rubyテスト読み込みの例
説明のために、当社のRailsアプリの仕様スイートは、10個のモデルに対してモデルごとに100個の仕様で構成されています。
Rubyファイルが変更されていない場合:
rspec-rails-modified-paths-specsはテストを実行しません。rspec-completeは、1000件のテストのフルスイートを実行します。
1つのRubyモデルが変更された場合(たとえば、app/models/example.rb)、rspec-rails-modified-paths-specsはexample.rbの100件のテストを実行します:
- これらの100件のテストがすべて合格した場合、1000件のテストのフル
rspec-completeスイートの実行が許可されます。 - これらの100件のテストのいずれかが失敗した場合、それらはすぐに失敗し、
rspec-completeはテストを実行しません。
最後のケースでは、完全な1000テストスイートが実行されないため、リソースと時間が節約されます。