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 테스팅을 설정하면 됩니다.

전제 조건:

fail fast 테스팅을 설정하는 방법은 다음과 같아요.

  1. 머지 리퀘스트 파이프라인에서 전체 스위트를 실행할 RSpec 잡을 추가합니다.
rspec-complete:
  stage: test
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
  script:
    - bundle install
    - bundle exec rspec
  1. CI/CD 설정에 Verify/FailFast 템플릿을 포함합니다.
include:
  - template: Verify/FailFast.gitlab-ci.yml
  1. 선택 사항 — 다른 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 템플릿이 변경 파일을 관련 스펙으로 매핑해 먼저 실행하고, 실패하면 전체를 멈춘다는 흐름만 기억하면 돼요. 다음으로는 머지 리퀘스트 파이프라인과 머지 결과 파이프라인 설정을 함께 살펴보는 걸 추천해요. 실제 파이프라인에 적용하면 변경과 무관한 전체 스위트를 기다리지 않고 피드백을 받을 수 있어요.