正式なドキュメントは英語版であり、この日本語訳はAI支援翻訳により作成された参考用のものです。日本語訳の一部の内容は人間によるレビューがまだ行われていないため、翻訳のタイミングにより英語版との間に差異が生じることがあります。最新かつ正確な情報については、英語版をご参照ください。

フェイルファストテスト

  • プラン: Premium、Ultimate
  • 提供形態: GitLab.com、GitLab Self-Managed、GitLab Dedicated

テストの実行にRSpecを使用するアプリケーション向けに、Verify/Failfastマージリクエストの変更に基づいて、テストスイートのサブセットを実行するテンプレートを導入しました。

test_file_findertff)gemは、ファイルのリストを入力として受け入れ、入力ファイルに関連すると考えられる仕様(テスト)ファイルのリストを返します。

tffはRuby on Railsプロジェクト向けに設計されているため、Verify/FailFastテンプレートは、Rubyファイルへの変更が検出されたときに実行されるように設定されています。デフォルトでは、すべてのステージより前のGitLab CI/CDパイプラインの.preステージで実行されます。

ユースケースの例

フェイルファストテストは、プロジェクトに新しい機能を追加したり、新しい自動テストを追加したりする場合に役立ちます。

プロジェクトには、完了に時間がかかる数十万のテストがある可能性があります。新しいテストが合格することを期待するかもしれませんが、それを検証するには、すべてのテストが完了するのを待つ必要があります。並列化を使用している場合でも、これには1時間以上かかる可能性があります。

フェイルファストテストにより、パイプラインからのフィードバックループが高速化されます。新しいテストが合格し、新しい機能が他のテストを失敗させなかったことをすぐに知ることができます。

前提要件

このテンプレートには、以下が必要です:

  • RSpecをテストに使用するRailsでビルドされたプロジェクト。
  • 設定されたCI/CD:
  • プロジェクト設定で有効になっているマージ結果パイプライン
  • 利用可能な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-specsexample.rbの100件のテストを実行します:

  • これらの100件のテストがすべて合格した場合、1000件のテストのフルrspec-completeスイートの実行が許可されます。
  • これらの100件のテストのいずれかが失敗した場合、それらはすぐに失敗し、rspec-completeはテストを実行しません。

最後のケースでは、完全な1000テストスイートが実行されないため、リソースと時間が節約されます。