빠른 실패 테스트
테스트 실행에 RSpec을 사용하는 애플리케이션의 경우, 우리는 Verify/Failfast
템플릿을 도입했습니다. 이를 통해 당신의 병합 요청에서의 변경 사항을 기반으로 테스트 스위트의 일부를 실행할 수 있습니다.
이 템플릿은 입력 파일 목록을 받아들이고 해당 파일들과 관련이 있다고 생각되는 spec (테스트) 파일 목록을 반환하는 test_file_finder
(tff
) gem을 사용합니다.
tff
는 루비 온 레일 프로젝트를 위해 설계되었으며, Verify/FailFast
템플릿은 루비 파일에 변경 사항이 감지될 때 실행되도록 구성되어 있습니다. 기본적으로 그것은 GitLab CI/CD 파이프라인의 .pre
스테이지에서 다른 모든 스테이지보다 먼저 실행됩니다.
사용 사례 예제
빠른 실패 테스트는 프로젝트에 새 기능을 추가하거나 새 자동화 테스트를 추가할 때 유용합니다.
당신의 프로젝트에는 오랜 시간이 소요되는 수십만 개의 테스트가 있을 수 있습니다. 새 테스트가 통과될 것으로 예상하지만 테스트가 완료될 때까지 기다려야 합니다. 이는 병렬화를 사용할 때라도 1시간 이상이 소요될 수 있습니다.
빠른 실패 테스트는 파이프라인으로부터 더 빠른 피드백 루프를 제공합니다. 이를 통해 새로운 테스트가 통과되었고 새 기능이 다른 테스트를 망가뜨리지 않았음을 빠르게 알 수 있습니다.
전제 조건
이 템플릿을 사용하려면:
- RSpec을 사용하는 Rails 프로젝트가 구축되어 있어야 합니다.
- 다음과 같이 CI/CD가 구성되어 있어야 합니다:
- Ruby가 있는 Docker 이미지를 사용해야 합니다.
- 병합 요청 파이프라인을 사용해야 합니다.
- 프로젝트 설정에서 병합된 결과 파이프라인이 활성화되어 있어야 합니다.
- Ruby가 있는 Docker 이미지가 필요합니다. 이 템플릿은 기본적으로
image: ruby:2.6
을 사용하지만, 이를 재정의할 수 있습니다.
빠른 RSpec 실패 구성
우리는 다음의 일반적인 RSpec 구성을 시작점으로 사용합니다. 이는 모든 프로젝트 gem을 설치하고 rspec
을 실행하여, 병합 요청 파이프라인에서만 실행합니다.
rspec-complete:
stage: test
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
script:
- bundle install
- bundle exec rspec
전체 스위트 대신 가장 관련있는 spec을 먼저 실행하려면, 다음을 CI/CD 구성에 추가하여 템플릿을 include
합니다.
include:
- template: Verify/FailFast.gitlab-ci.yml
작업을 사용자 정의하려면, 템플릿을 덮어쓰기 위해 특정 옵션을 설정할 수 있습니다. 예를 들어, 기본 Docker 이미지를 덮어쓰려면:
include:
- template: Verify/FailFast.gitlab-ci.yml
rspec-rails-modified-path-specs:
image: custom-docker-image-with-ruby
예제 테스트 로드
이론상으로, 우리의 Rails 앱 spec 스위트는 각 모델당 100개의 스펙으로 구성되어 있다고 가정해 봅시다.
만약 루비 파일에 변경 사항이 없다면:
-
rspec-rails-modified-paths-specs
는 어떠한 테스트도 실행하지 않습니다. -
rspec-complete
는 1000개의 테스트 전체 스위트를 실행합니다.
만약 한 개의 루비 모델이 변경된다면, 예를 들어 app/models/example.rb
, 그러면 rspec-rails-modified-paths-specs
는 example.rb
의 100개의 테스트를 실행합니다:
- 만약 이 100개의 테스트가 모두 통과된다면, 1000개의 테스트 전체 스위트가 실행됩니다.
- 만약 이 100개의 테스트 중 어떤 것이라도 실패한다면, 그것들은 빠르게 실패하고,
rspec-complete
는 어떠한 테스트도 실행하지 않습니다.
마지막 경우는 리소스와 시간을 절약하며, 1000개의 테스트 스위트가 실행되지 않습니다.