Fail fast 테스팅
Fail fast 테스팅
풀 테스트 스위트가 끝까지 도는 걸 기다리는 대신, 머지 리퀘스트에서 변경한 파일과 가장 관련 깊은 테스트 스펙만 먼저 돌리는 기법이 fail fast 테스팅이에요. 그 스펙이 실패하면 파이프라인이 즉시 멈추면서 시간과 컴퓨팅 리소스를 아껴요. 변경과 무관한 전체 스위트를 매번 돌릴 필요 없이, 빠르게 피드백을 얻고 싶을 때 쓰는 방식이죠.
출처: 문서
본문
Fail fast 테스팅은 머지 리퀘스트 변경 사항과 가장 관련 있는 테스트 스펙을 나머지 스위트보다 먼저 실행해요. 그 스펙이 실패하면 파이프라인이 즉시 멈춰서 시간과 컴퓨팅 리소스를 절약합니다.
RSpec을 쓰는 Ruby on Rails 프로젝트에서는 Verify/FailFast CI/CD 템플릿이 관련 스펙만 골라서 실행해요. 이 템플릿은 변경된 파일을 관련 스펙 파일로 매핑해 주는 test_file_finder(tff) 젬을 사용합니다.
기본적으로 이 템플릿은 다른 모든 파이프라인 스테이지보다 앞서는 .pre 스테이지에서 실행돼요.
Fail fast 테스팅 설정하기
전체 테스트 스위트를 돌리기 전에 머지 리퀘스트 변경 사항에 대한 피드백을 더 빨리 받고 싶다면, fail fast 테스팅을 설정하면 됩니다.
전제 조건:
- RSpec을 사용하는 Ruby on Rails 프로젝트.
- 프로젝트 설정에서 머지 결과 파이프라인이 활성화되어 있어야 해요. 이때 머지 리퀘스트 파이프라인도 활성화되어 있어야 합니다.
fail fast 테스팅을 설정하는 방법은 다음과 같아요.
- 머지 리퀘스트 파이프라인에서 전체 스위트를 실행할 RSpec 잡을 추가합니다.
rspec-complete:
stage: test
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
script:
- bundle install
- bundle exec rspec
- CI/CD 설정에
Verify/FailFast템플릿을 포함합니다.
include:
- template: Verify/FailFast.gitlab-ci.yml
- 선택 사항 — 다른 Docker 이미지를 쓰고 싶다면 CI/CD 설정 파일의
rspec-rails-modified-path-specs잡에 이미지를 지정합니다.
include:
- template: Verify/FailFast.gitlab-ci.yml
rspec-rails-modified-path-specs:
image: custom-docker-image-with-ruby
Fail fast 테스트 결과
아래 예시는 모델별로 스펙 100개, 모델 10개(총 1000개 스펙)가 있는 스위트를 가정해요.
| 변경된 파일 | rspec-rails-modified-path-specs |
rspec-complete |
|---|---|---|
| Ruby 파일 없음 | 실행하지 않음 | 1000개 스펙 모두 실행 |
app/models/example.rb (모든 스펙 통과) |
example.rb의 스펙 100개 실행 |
1000개 스펙 모두 실행 |
app/models/example.rb (스펙 하나라도 실패) |
example.rb의 스펙 100개 실행 |
건너뜀 |
더 알아보기
지금 단계에서는 Verify/FailFast 템플릿이 변경 파일을 관련 스펙으로 매핑해 먼저 실행하고, 실패하면 전체를 멈춘다는 흐름만 기억하면 돼요. 다음으로는 머지 리퀘스트 파이프라인과 머지 결과 파이프라인 설정을 함께 살펴보는 걸 추천해요. 실제 파이프라인에 적용하면 변경과 무관한 전체 스위트를 기다리지 않고 피드백을 받을 수 있어요.