빠른 실패 테스트

Tier: Premium, Ultimate Offering: GitLab.com, Self-managed, GitLab Dedicated

RSpec을 사용하여 테스트를 실행하는 응용 프로그램의 경우,
병합 요청의 변경 사항을 기반으로 테스트 스위트의 하위 집합을 실행하기 위해
Verify/Failfast 템플릿을 도입했습니다.

이 템플릿은 입력으로 파일 목록을 수용하고
입력 파일과 관련이 있을 것으로 판단되는 스펙(테스트) 파일 목록을 반환하는
test_file_finder (tff) gem을 사용합니다.

tff는 Ruby on Rails 프로젝트에 맞게 설계되어 있으며,
Verify/FailFast 템플릿은 Ruby 파일의 변경 사항이 감지되면 실행되도록 구성되어 있습니다.
기본적으로 GitLab CI/CD 파이프라인의 .pre 단계에서
모든 다른 단계보다 먼저 실행됩니다.

예제 사용 사례

빠른 실패 테스트는 프로젝트에 새로운 기능을 추가하고
새로운 자동화된 테스트를 추가할 때 유용합니다.

귀하의 프로젝트는 수십만 개의 테스트를 포함하고 있어 완료하는 데 오랜 시간이 걸릴 수 있습니다.
새로운 테스트가 통과할 것으로 예상되지만, 모든 테스트가 완료될 때까지 기다려야
이를 확인할 수 있습니다. 이는 병렬 처리를 사용하더라도 한 시간 이상 걸릴 수 있습니다.

빠른 실패 테스트는 파이프라인에서 더 빠른 피드백 루프를 제공합니다.
새로운 테스트가 통과하고 새로운 기능이 다른 테스트를 깨뜨리지 않았음을
신속하게 알려줍니다.

전제 조건

이 템플릿은 다음을 요구합니다:

  • RSpec을 사용하여 테스트하는 Rails로 구축된 프로젝트.
  • CI/CD가 다음과 같이 구성됨:
  • 병합 결과 파이프라인
    프로젝트 설정에서 활성화되어 있어야 합니다.
  • Ruby가 포함된 Docker 이미지. 템플릿은 기본적으로 image: ruby:2.6을 사용하지만,
    이를 재정의할 수 있습니다.

빠른 RSpec 실패 구성

우리는 다음의 일반 RSpec 구성을 출발점으로 사용합니다.
이 구성은 모든 프로젝트 젬을 설치하고, 병합 요청 파이프라인에서만 rspec을 실행합니다.

rspec-complete:  
  stage: test  
  rules:  
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"  
  script:  
    - bundle install  
    - bundle exec rspec  

전체 스위트 대신 가장 관련성이 높은 스펙을 먼저 실행하려면,
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 앱 스펙 스위트가
모델당 100개의 스펙으로 구성되어 있다고 가정해 보겠습니다.

Ruby 파일이 변경되지 않은 경우:

  • rspec-rails-modified-paths-specs는 테스트를 실행하지 않습니다.
  • rspec-complete는 전체 1000개의 테스트를 실행합니다.

하나의 Ruby 모델이 변경된 경우, 예를 들어 app/models/example.rb,
그럼 rspec-rails-modified-paths-specsexample.rb에 대한 100 테스트를 실행합니다:

  • 이 100개의 테스트가 모두 통과하면 전체 rspec-complete
    1000개의 테스트가 실행될 수 있습니다.
  • 이 100개의 테스트 중 하나라도 실패하면, 빠르게 실패하며
    rspec-complete는 테스트를 실행하지 않습니다.

최종적으로 이 경우는 전체 1000 테스트 스위트가 실행되지 않아
리소스와 시간을 절약합니다.