実行コンテキストの選択
テストの中には、特定の環境、あるいは特定のパイプラインやジョブで実行するように設計されているものがあります。only
およびexcept
メタデータを使用して、テストの実行コンテキストを指定できます。
利用可能なスイッチ
スイッチ | 関数 | 種類 |
---|---|---|
tld | トップレベル・ドメイン・マッチャーの設定 | String |
subdomain | サブドメインマッチャーの設定 |
Array またはString
|
domain | ドメインマッチャーの設定 | String |
production | 本番環境に合わせる | Static |
pipeline | パイプラインに合わせる |
Array またはStatic
|
job | ジョブとのマッチング |
Array またはStatic
|
:production
と{ <switch>: 'value' }
を同時に指定することはできません。これらのオプションは相互に排他的です。プロダクションを指定する場合は、tld
とdomain
を個別に制御できます。使用例
のみ
指定したコンテキストのみでテストを実行します。
使用にマッチします:
- 環境に対する正規表現。
- パイプラインの文字列マッチング。
- ジョブの正規表現または文字列マッチング
- 一般的な条件に対するラムダまたは真理値/偽値
テスト実行コンテキスト | キー | マッチ |
---|---|---|
gitlab.com | only: :production | gitlab.com |
staging.gitlab.com | only: { subdomain: :staging } | (staging).+.com |
gitlab.com and staging.gitlab.com | only: { subdomain: /(staging.)?/, domain: 'gitlab' } | (staging.)?gitlab.com |
dev.gitlab.org | only: { tld: '.org', domain: 'gitlab', subdomain: 'dev' } | (dev).gitlab.org |
staging.gitlab.com and domain.gitlab.com | only: { subdomain: %i[staging domain] } | (staging\|domain).+.com |
nightly パイプライン | only: { pipeline: :nightly } | “毎晩スケジュールされるパイプライン” |
nightly とcanary パイプライン | 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.com | except: :production | gitlab.com |
staging.gitlab.com | except: { subdomain: :staging } | (staging).+.com |
gitlab.com and staging.gitlab.com | except: { subdomain: /(staging.)?/, domain: 'gitlab' } | (staging.)?gitlab.com |
dev.gitlab.org | except: { tld: '.org', domain: 'gitlab', subdomain: 'dev' } | (dev).gitlab.org |
staging.gitlab.com and domain.gitlab.com | except: { subdomain: %i[staging domain] } | (staging\|domain).+.com |
nightly パイプライン | only: { pipeline: :nightly } | “毎晩スケジュールされるパイプライン” |
nightly とcanary パイプライン | 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
環境変数で明示的に無効にすることができます。これは、ローカルでテストを実行する場合に便利です。