빠른 실패 테스트

Tier: 프리미엄, 얼티메이트 Offering: GitLab.com, Self-managed, GitLab Dedicated

테스트를 실행하는 데 RSpec를 사용하는 애플리케이션을 위해 변경 내용에 기반한 테스트 스위트의 하위 집합을 실행하는 Verify/Failfast 템플릿을 소개했습니다.

해당 템플릿은 입력 파일 목록을 허용하고 해당 파일이 관련된 것으로 여겨지는 spec (테스트) 파일 목록을 반환하는 test_file_finder (tff) gem를 사용합니다.

tff는 루비 온 레일즈 프로젝트를 위해 설계되었으며 Verify/FailFast 템플릿은 루비 파일의 변경 사항이 감지되었을 때 실행되도록 구성되어 있습니다. 기본적으로 다른 모든 단계보다 .pre 스테이지에서 GitLab CI/CD 파이프라인을 실행합니다.

사용 사례 예

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

프로젝트에는 수천 개의 테스트가 있을 수 있으며 이러한 테스트는 완료하는 데 오랜 시간이 소요될 수 있습니다. 새 테스트가 통과되기를 기대할 수 있지만 모든 테스트가 완료될 때까지 기다려야 합니다. 이 작업은 병렬화를 사용하더라도 1시간 이상 소요될 수 있습니다.

빠른 실패 테스트를 통해 파이프라인으로부터 더 빠른 피드백 루프를 제공받을 수 있습니다. 새 테스트가 통과되고 새 기능이 다른 테스트를 망가뜨리지 않았음을 빨리 알 수 있습니다.

사전 요구 사항

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

빠른 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

예제 테스트 실행

설명을 위해, 우리의 레일즈 앱 스펙 스위트가 각 모델에 대해 100개의 스펙으로 이루어져 있다고 가정해 봅시다.

루비 파일이 변경되지 않은 경우:

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

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

  • 이 100개 테스트 중 모두가 통과되면, 전체 rspec-complete 스위트 1000개를 실행할 수 있습니다.
  • 이 100개 테스트 중 어느 것이라도 실패한다면, 그것들은 빠르게 실패하고 rspec-complete는 어떤 테스트도 실행하지 않습니다.

최종적으로 전체 1000개의 테스트 스위트가 실행되지 않아 리소스와 시간을 절약할 수 있습니다.