実行コンテキストの選択

テストの中には、特定の環境、あるいは特定のパイプラインやジョブで実行するように設計されているものがあります。only およびexcept メタデータを使用して、テストの実行コンテキストを指定できます。

利用可能なスイッチ

スイッチ関数種類
tldトップレベル・ドメイン・マッチャーの設定String
subdomainサブドメインマッチャーの設定 Array またはString
domainドメインマッチャーの設定String
production本番環境に合わせるStatic
pipelineパイプラインに合わせる Array またはStatic
jobジョブとのマッチング Array またはStatic
caution
:production{ <switch>: 'value' } を同時に指定することはできません。これらのオプションは相互に排他的です。プロダクションを指定する場合は、tlddomain を個別に制御できます。

使用例

のみ

指定したコンテキストのみでテストを実行します。

使用にマッチします:

  • 環境に対する正規表現。
  • パイプラインの文字列マッチング。
  • ジョブの正規表現または文字列マッチング
  • 一般的な条件に対するラムダまたは真理値/偽値
テスト実行コンテキストキーマッチ
gitlab.comonly: :productiongitlab.com
staging.gitlab.comonly: { subdomain: :staging }(staging).+.com
gitlab.com and staging.gitlab.comonly: { subdomain: /(staging.)?/, domain: 'gitlab' }(staging.)?gitlab.com
dev.gitlab.orgonly: { tld: '.org', domain: 'gitlab', subdomain: 'dev' }(dev).gitlab.org
staging.gitlab.com and domain.gitlab.comonly: { subdomain: %i[staging domain] }(staging\|domain).+.com
nightly パイプラインonly: { pipeline: :nightly }“毎晩スケジュールされるパイプライン”
nightlycanary パイプラインonly: { pipeline: [:nightly, :canary] } “夜間スケジュールパイプライン “と “カナリア”
ee:instance ジョブonly: { job: 'ee:instance' }あらゆるパイプラインにおけるee:instance ジョブ
任意のquarantine ジョブonly: { job: '.*quarantine' }パイプライン内部でquarantine で終わるすべてのジョブ
条件が真理値として評価されるすべての実行only: { condition: -> { ENV['TEST_ENV'] == 'true' } } TEST_ENV が真に設定されるすべての実行
RSpec.describe 'Area' do
  it 'runs in any environment or pipeline' do; end
  it 'runs only in production environment', only: :production do; end

  it 'runs only in staging environment', only: { subdomain: :staging } do; end

  it 'runs in dev environment', only: { tld: '.org', domain: 'gitlab', subdomain: 'dev' } do; end

  it 'runs in prod and staging environments', only: { subdomain: /(staging.)?/, domain: 'gitlab' } {}

  it 'runs only in nightly pipeline', only: { pipeline: :nightly } do; end

  it 'runs in nightly and canary pipelines', only: { pipeline: [:nightly, :canary] } do; end

  it 'runs in specific environment matching condition', only: { condition: -> { ENV['TEST_ENV'] == 'true' } } do; end
end

ただし

指定された場合を_除き_、通常のコンテキストでテストを実行します。

使用にマッチします:

  • 環境に対する正規表現。
  • パイプラインの文字列マッチング。
  • ジョブの正規表現または文字列マッチング
  • 一般的な条件に対するラムダまたは真理値/偽値
テスト実行コンテキストキーマッチ
gitlab.comexcept: :productiongitlab.com
staging.gitlab.comexcept: { subdomain: :staging }(staging).+.com
gitlab.com and staging.gitlab.comexcept: { subdomain: /(staging.)?/, domain: 'gitlab' }(staging.)?gitlab.com
dev.gitlab.orgexcept: { tld: '.org', domain: 'gitlab', subdomain: 'dev' }(dev).gitlab.org
staging.gitlab.com and domain.gitlab.comexcept: { subdomain: %i[staging domain] }(staging\|domain).+.com
nightly パイプラインonly: { pipeline: :nightly }“毎晩スケジュールされるパイプライン”
nightlycanary パイプラインonly: { pipeline: [:nightly, :canary] } “夜間スケジュールパイプライン “と “カナリア”
ee:instance ジョブexcept: { job: 'ee:instance' }あらゆるパイプラインにおけるee:instance ジョブ
任意のquarantine ジョブexcept: { job: '.*quarantine' }パイプライン内部でquarantine で終わるすべてのジョブ
条件が真理値として評価される場合を除くすべての実行except: { condition: -> { ENV['TEST_ENV'] == 'true' } } TEST_ENV が真に設定されないすべての実行
RSpec.describe 'Area' do
  it 'runs in any execution context except the production environment', except: :production do; end

  it 'runs in any execution context except the staging environment', except: { subdomain: :staging } do; end

  it 'runs in any execution context except the nightly pipeline', except: { pipeline: :nightly } do; end

  it 'runs in any execution context except the ee:instance job', except: { job: 'ee:instance' } do; end

  it 'runs in specific environment not matching condition', except: { condition: -> { ENV['TEST_ENV'] == 'true' } } do; end
end

使用上の注意

テストにbefore またはafter ブロックがある場合、only またはexcept メタデータをRSpec.describe ブロックの外側に追加する必要があります。

only でタグ付けされたテストをローカルの GitLab インスタンスで実行するには、次のいずれかを行います:

  • CI_PROJECT_NAME あるいはCI_JOB_NAME 環境変数が設定されていないことを確認します。
  • メタデータに合わせて適切な変数を設定してください。例えば、メタデータがonly: { pipeline: :nightly } の場合はCI_PROJECT_NAME=nightly を設定します。メタデータがonly: { job: 'ee:instance' } の場合はCI_JOB_NAME=ee:instance を設定します。
  • メタデータを一時的に削除します。

except でタグ付けされたテストを内部で実行するには、以下のいずれかの方法があります:

  • CI_PROJECT_NAME あるいはCI_JOB_NAME 環境変数が設定されていないことを確認します。
  • メタデータを一時的に削除します。

特定の環境に対するテストの隔離

テストが特定の環境に対してのみ実行されるように指定するのと同様に、テストが特定の環境に対してのみ実行されるように隔離することも可能です。構文はまったく同じですが、only: { ... } ハッシュがquarantine: { ... } ハッシュにネストされている点が異なります。たとえば、quarantine: { only: { subdomain: :staging } } は、staging に対して実行されたときのみテストを隔離します。

検疫機能は、DISABLE_QUARANTINE 環境変数で明示的に無効にすることができます。これは、ローカルでテストを実行する場合に便利です。