테스트 격리
GitLab v19.2이 페이지는 GitLab에서 테스트 격리를 구현하기 위한 기술 참조를 제공합니다. 테스트를 격리한다는 것은 코드베이스에서 보존하면서 향후 수정을 위해 CI에서 건너뛰도록 표시한다는 것을 의미합니다. 테스트 실패 이슈의 URL과 함께 quarantine 메타데이터를 사용하십시오:
이 페이지는 GitLab에서 테스트 격리를 구현하기 위한 기술 참조를 제공합니다. 격리 시기, 소유권 및 타임라인에 대한 프로세스 정보는 테스트 격리 프로세스 핸드북 페이지를 참조하십시오.
테스트 격리란 무엇인가?#
테스트를 격리한다는 것은 코드베이스에서 보존하면서 향후 수정을 위해 CI에서 건너뛰도록 표시한다는 것을 의미합니다. 격리된 테스트는 기본적으로 로컬에서 실행되지만 다른 개발자가 차단되는 것을 방지하기 위해 CI 파이프라인에서 제외됩니다.
RSpec 격리#
기본 구문#
테스트 실패 이슈의 URL과 함께 quarantine 메타데이터를 사용하십시오:
# 단일 사양 격리
it 'succeeds', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/12345' do
expect(response).to have_gitlab_http_status(:ok)
end
# describe/context 블록 격리
describe '#flaky-method', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/12345' do
[...]
end
격리 메타데이터 유형#
격리 유형을 지정하여 이유를 분류하십시오:
it 'is flaky', quarantine: {
issue: 'https://gitlab.com/gitlab-org/quality/test-failure-issues/-/issues/12345',
type: :flaky
}
it 'is due to a bug', quarantine: {
issue: 'https://gitlab.com/gitlab-org/quality/test-failure-issues/-/issues/12345',
type: :bug
}
context 'when these tests rely on another MR', quarantine: {
type: :waiting_on,
issue: 'https://gitlab.com/gitlab-org/gitlab/-/merge_requests/12345'
}
사용 가능한 격리 유형:
| 유형 | 설명 |
|---|---|
:flaky |
테스트가 간헐적으로 실패 |
:bug |
애플리케이션 버그로 인해 테스트 실패 |
:stale |
기능 변경으로 인해 테스트가 오래됨 |
:broken |
테스트 코드 또는 프레임워크 변경으로 인해 테스트 실패 |
:waiting_on |
테스트가 다른 이슈 또는 MR에 의존 |
:investigating |
조사 중인 불안정한 테스트 |
:test_environment |
환경 문제로 인해 테스트 실패 |
:dependency |
외부 종속성으로 인해 테스트 실패 |
중첩된 컨텍스트#
관련 태그가 있는 가장 바깥쪽 describe 또는 context 블록에 격리를 적용하십시오:
# 좋은 예
RSpec.describe 'Plan', :smoke, quarantine: {
issue: 'https://gitlab.com/gitlab-org/quality/test-failure-issues/-/issues/12345',
type: :flaky
} do
describe 'Feature' do
before(:context) do
# 이 before(:context) 블록은 smoke 격리 작업에서만 실행됩니다
end
end
end
# 나쁜 예
RSpec.describe 'Plan', :smoke do
describe 'Feature', quarantine: {
issue: 'https://gitlab.com/gitlab-org/quality/test-failure-issues/-/issues/12345',
type: :flaky
} do
before(:context) do
# 이 before(:context) 블록은 smoke 태그가 없는 격리 작업에서
# 실수로 실행될 수 있습니다
end
end
end
로컬에서 격리된 테스트 실행#
기본적으로 격리된 테스트는 로컬 개발에서 실행됩니다. 건너뛰려면:
# Bash
bin/rspec --tag ~quarantine
# ZSH
bin/rspec --tag \~quarantine
격리된 테스트 찾기#
기능 범주에 대한 모든 격리된 테스트를 찾으려면 ripgrep을 사용하십시오:
rg -l --multiline -w "(?s)feature_category:\s+:global_search.+quarantine:"
기술적 제약#
공유 예시 또는 it_behaves_like/include_examples 호출을 격리할 수 없습니다:
# RuboCop이 경고합니다
shared_examples 'loads all the users when opened', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/12345' do
[...]
end
# 작동하지 않습니다
it_behaves_like 'a shared example', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/12345'
# 작동하지 않습니다
include_examples 'a shared example', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/12345'
자세한 내용은 다음을 참조하십시오:
전제 조건#
테스트를 격리하기 전에:
- 적절한 귀속을 위해 테스트 파일에
feature_category메타데이터가 있는지 확인 - 테스트 실패 이슈 프로젝트에서 테스트 실패 이슈를 생성하거나 식별
- 머지 요청에
~"quarantine"레이블 추가 - 표준 링크 용어를 사용하여 MR을 테스트 실패 이슈에 연결
- 이슈에
~"quarantined test"레이블 추가
격리 시기와 소유권 책임에 대한 프로세스 정보는 테스트 격리 프로세스 핸드북을 참조하십시오.
빠른 격리#
즉각적인 격리가 필요한 경우 빠른 격리 프로세스를 사용하십시오.
빠른 격리로 실패한 작업 재실행:
- RSpec 테스트(단위/통합/시스템):
retrieve-tests-metadata작업을 다시 트리거한 다음 실패한 RSpec 작업을 재시도하십시오. 단순히 작업을 재시작하면 새 빠른 격리 업데이트가 적용되지 않습니다. - E2E 테스트: 실패한 E2E 작업을 단순히 재시도하십시오 - E2E 테스트는 최신 빠른 격리 파일을 자동으로 다운로드합니다.
- 대안: 새 파이프라인을 실행하면 모든 테스트 유형에 대한 최신 빠른 격리가 적용됩니다.
빠른 격리 타임라인 및 후속 요구사항에 대한 전체 프로세스 정보는 핸드북의 빠른 격리 섹션을 참조하십시오.
Jest 격리#
기본 구문#
ESLint 비활성화 주석과 함께 .skip 메서드를 사용하십시오:
// quarantine: https://gitlab.com/gitlab-org/gitlab/-/issues/56789
// eslint-disable-next-line jest/no-disabled-tests
it.skip('should throw an error', () => {
expect(response).toThrowError(expected_error)
});
격리된 테스트 실행#
격리된 Jest 테스트는 --runInBand 옵션으로 실행하지 않는 한 건너뜁니다:
jest --runInBand
격리된 테스트 찾기#
격리된 Jest 사양이 있는 모든 파일을 나열하려면:
yarn jest:quarantine
관련 주제#
- 테스트 격리 프로세스(핸드북) - 프로세스, 워크플로, 소유권 및 타임라인
- 비정상 테스트 - 불안정한 테스트 이해 및 디버깅
- 불안정한 테스트(핸드북) - 감지, 추적 및 긴급성 타임라인