InfoGrab Docs

코드 커버리지

요약

커버리지 데이터는 예측 테스트 선택, 커버리지 분석 대시보드, 불안정한 테스트 분석 등을 지원합니다. 커버리지는 다양한 도구를 사용하는 여러 테스트 스위트에서 수집됩니다. RSpec 테스트는 spec/simplecov_env.rb에 구성된 SimpleCov를 사용하여 커버리지를 수집합니다.

커버리지 데이터는 예측 테스트 선택, 커버리지 분석 대시보드, 불안정한 테스트 분석 등을 지원합니다.

데이터 수집#

커버리지는 다양한 도구를 사용하는 여러 테스트 스위트에서 수집됩니다.

백엔드 커버리지(RSpec)#

RSpec 테스트는 spec/simplecov_env.rb에 구성된 SimpleCov를 사용하여 커버리지를 수집합니다.

  • 출력: coverage/lcov/gitlab.lcov(LCOV 형식)
  • 테스트 매핑: Crystalball은 소스 파일에서 테스트 파일 매핑을 포함하는 crystalball/packed-mapping.json.gz를 생성

프론트엔드 커버리지(Jest)#

Jest 테스트는 jest.config.base.js에 구성된 Istanbul을 사용하여 커버리지를 수집합니다.

  • 출력: coverage-frontend/*/coverage-final.json(Istanbul JSON 형식)
  • 테스트 매핑: jest-test-mapping/jest-source-to-test.json

Workhorse 커버리지(Go)#

Workhorse 테스트는 Go의 내장 커버리지 도구를 사용하여 커버리지를 수집합니다.

  • 출력: workhorse/coverage.lcov(LCOV 형식으로 변환)
  • 테스트 매핑: workhorse-source-to-test.json

E2E 커버리지#

E2E 테스트는 실행 중인 GitLab 인스턴스에서 커버리지를 수집합니다.

백엔드 E2E(Coverband)#

coverband_formatter.rb는 각 테스트 전후에 GitLab 커버리지 API를 호출하여 백엔드 커버리지를 수집합니다.

  • 출력: tmp/coverband-coverage-*.jsontmp/test-code-paths-mapping-*.json
  • API 엔드포인트: 커버리지 데이터는 /-/coverband/coverage_data API를 통해 수집됩니다

프론트엔드 E2E(Istanbul)#

프론트엔드 E2E 커버리지는 실행 중인 GitLab 인스턴스의 Istanbul 계측을 통해 수집됩니다.

  • 출력: coverage-e2e-frontend/coverage-final.jsonjs-coverage-by-example-*.json

데이터 병합#

테스트가 완료된 후 병렬 작업 및 E2E 테스트의 커버리지가 병합됩니다.

백엔드 병합#

merge_backend_coverage.rb 스크립트가 병합합니다:

  • coverage/lcov/gitlab.lcov의 RSpec 커버리지
  • coverage-e2e-backend/coverband-*.json의 E2E Coverband 커버리지

출력: coverage-backend/coverage.lcov

백엔드 테스트 매핑 병합#

merge_e2e_backend_test_mapping.rb 스크립트가 병합합니다:

  • crystalball/packed-mapping.json.gz의 Crystalball 매핑(DescribedClassStrategyCoverageStrategy 매핑 모두 포함)
  • e2e-test-mapping/test-code-paths-mapping-*.json의 E2E 테스트 매핑

출력: crystalball/merged-mapping.json.gz

파일 경로는 병합 중에 일관된 상대 경로를 보장하기 위해 정규화됩니다(예: /builds/gitlab-org/gitlab/app/models/user.rbapp/models/user.rb가 됩니다).

프론트엔드 병합#

merge_coverage_frontend.js 스크립트가 병합합니다:

  • coverage-frontend/*/coverage-final.json의 Jest 커버리지
  • coverage-e2e-frontend/coverage-final.json의 E2E Istanbul 커버리지

출력: coverage-frontend/lcov.info 및 Cobertura XML

프론트엔드 테스트 매핑 병합#

merge_e2e_frontend_test_mapping.js 스크립트는 Jest 및 E2E 테스트 매핑을 병합합니다.

출력: jest-test-mapping/merged-source-to-test.json

데이터 보강#

ClickHouse로 내보내기 전에 커버리지 데이터는 메타데이터로 보강됩니다.

소스 파일 분류#

소스 파일은 파일 경로 패턴을 기반으로 유형별로 분류됩니다:

  • frontend - JavaScript/Vue/CSS 파일
  • backend - Ruby 파일(모델, 컨트롤러, 서비스 등)
  • database - 마이그레이션 및 스키마 파일
  • infrastructure - CI 구성, Dockerfile
  • qa - QA 테스트 파일
  • workhorse - Go 파일
  • tooling - 도구 및 RuboCop 파일
  • configuration - 구성 파일
  • other - 패턴과 일치하지 않는 파일

전체 패턴 정의는 SourceFileClassifier를 참조하십시오.

테스트 책임 분류#

테스트는 다음 중 하나로 분류됩니다:

  • 책임: 소스 파일을 직접 테스트하는 테스트(예: app/models/user.rb에 대한 spec/models/user_spec.rb)
  • 종속: 소스 파일을 간접적으로 포함하는 테스트

분류는 .gitlab/coverage/responsibility_patterns.yml에 정의된 패턴을 사용합니다.

기능 범주 귀속#

각 소스 파일은 테스트 메타데이터를 기반으로 하나 이상의 기능 범주에 귀속됩니다. 이를 통해 팀별 커버리지 추적이 가능합니다.

여러 기능 범주가 있는 테스트에서 포함된 파일의 경우 여러 커버리지 레코드가 생성됩니다(범주당 하나).

조직 데이터 조회#

기능 범주는 category_owners 참조 테이블에서 조직 계층 구조(그룹, 스테이지, 섹션)로 보강됩니다.

데이터 저장(ClickHouse)#

커버리지 데이터는 분석 및 대시보드를 위해 ClickHouse로 내보내집니다.

테이블#

테이블 데이터베이스 설명
coverage_metrics code_coverage 조직 데이터가 있는 파일별 커버리지 백분율
test_file_mappings shared 소스 파일에서 테스트 파일 관계
category_owners shared 기능 범주에서 조직 계층 구조 매핑

내보내기 작업#

커버리지는 gitlab_quality-test_tooling gem에 의해 내보내집니다:

  • test-coverage:export-rspec-and-e2e - 백엔드 커버리지
  • test-coverage:export-jest-and-e2e - 프론트엔드 커버리지
  • test-coverage:export-workhorse - Workhorse 커버리지

구현 세부 정보는 gem의 코드 커버리지 README를 참조하십시오.

문제 해결#

누락된 커버리지 데이터#

커버리지 내보내기가 실패하면 다음을 확인하십시오:

  1. 누락된 아티팩트: 전제 조건 작업이 성공적으로 완료되고 아티팩트가 존재하는지 확인
  2. 유효하지 않은 JSON: 테스트 보고서나 커버리지 파일에 잘못된 형식의 JSON이 포함될 수 있음

경로 정규화 문제#

E2E 커버리지에는 절대 경로가 포함될 수 있습니다. 병합 스크립트가 경로를 정규화하지만, 경로 불일치가 보이면:

  1. 경로가 리포지토리 루트에서 시작되는지 확인하십시오(예: app/models/user.rb)
  2. 경로에 ./ 접두사나 /builds/gitlab-org/gitlab/과 같은 절대 경로가 없어야 합니다

NaN 커버리지 값#

파일에 포함할 줄이 없는 경우 커버리지 백분율이 NaN일 수 있습니다. 이러한 레코드는 내보내기 중에 필터링됩니다.

관련 주제#

코드 커버리지

원문 보기
요약

커버리지 데이터는 예측 테스트 선택, 커버리지 분석 대시보드, 불안정한 테스트 분석 등을 지원합니다. 커버리지는 다양한 도구를 사용하는 여러 테스트 스위트에서 수집됩니다. RSpec 테스트는 spec/simplecov_env.rb에 구성된 SimpleCov를 사용하여 커버리지를 수집합니다.

커버리지 데이터는 예측 테스트 선택, 커버리지 분석 대시보드, 불안정한 테스트 분석 등을 지원합니다.

데이터 수집#

커버리지는 다양한 도구를 사용하는 여러 테스트 스위트에서 수집됩니다.

백엔드 커버리지(RSpec)#

RSpec 테스트는 spec/simplecov_env.rb에 구성된 SimpleCov를 사용하여 커버리지를 수집합니다.

  • 출력: coverage/lcov/gitlab.lcov(LCOV 형식)
  • 테스트 매핑: Crystalball은 소스 파일에서 테스트 파일 매핑을 포함하는 crystalball/packed-mapping.json.gz를 생성

프론트엔드 커버리지(Jest)#

Jest 테스트는 jest.config.base.js에 구성된 Istanbul을 사용하여 커버리지를 수집합니다.

  • 출력: coverage-frontend/*/coverage-final.json(Istanbul JSON 형식)
  • 테스트 매핑: jest-test-mapping/jest-source-to-test.json

Workhorse 커버리지(Go)#

Workhorse 테스트는 Go의 내장 커버리지 도구를 사용하여 커버리지를 수집합니다.

  • 출력: workhorse/coverage.lcov(LCOV 형식으로 변환)
  • 테스트 매핑: workhorse-source-to-test.json

E2E 커버리지#

E2E 테스트는 실행 중인 GitLab 인스턴스에서 커버리지를 수집합니다.

백엔드 E2E(Coverband)#

coverband_formatter.rb는 각 테스트 전후에 GitLab 커버리지 API를 호출하여 백엔드 커버리지를 수집합니다.

  • 출력: tmp/coverband-coverage-*.jsontmp/test-code-paths-mapping-*.json
  • API 엔드포인트: 커버리지 데이터는 /-/coverband/coverage_data API를 통해 수집됩니다

프론트엔드 E2E(Istanbul)#

프론트엔드 E2E 커버리지는 실행 중인 GitLab 인스턴스의 Istanbul 계측을 통해 수집됩니다.

  • 출력: coverage-e2e-frontend/coverage-final.jsonjs-coverage-by-example-*.json

데이터 병합#

테스트가 완료된 후 병렬 작업 및 E2E 테스트의 커버리지가 병합됩니다.

백엔드 병합#

merge_backend_coverage.rb 스크립트가 병합합니다:

  • coverage/lcov/gitlab.lcov의 RSpec 커버리지
  • coverage-e2e-backend/coverband-*.json의 E2E Coverband 커버리지

출력: coverage-backend/coverage.lcov

백엔드 테스트 매핑 병합#

merge_e2e_backend_test_mapping.rb 스크립트가 병합합니다:

  • crystalball/packed-mapping.json.gz의 Crystalball 매핑(DescribedClassStrategyCoverageStrategy 매핑 모두 포함)
  • e2e-test-mapping/test-code-paths-mapping-*.json의 E2E 테스트 매핑

출력: crystalball/merged-mapping.json.gz

파일 경로는 병합 중에 일관된 상대 경로를 보장하기 위해 정규화됩니다(예: /builds/gitlab-org/gitlab/app/models/user.rbapp/models/user.rb가 됩니다).

프론트엔드 병합#

merge_coverage_frontend.js 스크립트가 병합합니다:

  • coverage-frontend/*/coverage-final.json의 Jest 커버리지
  • coverage-e2e-frontend/coverage-final.json의 E2E Istanbul 커버리지

출력: coverage-frontend/lcov.info 및 Cobertura XML

프론트엔드 테스트 매핑 병합#

merge_e2e_frontend_test_mapping.js 스크립트는 Jest 및 E2E 테스트 매핑을 병합합니다.

출력: jest-test-mapping/merged-source-to-test.json

데이터 보강#

ClickHouse로 내보내기 전에 커버리지 데이터는 메타데이터로 보강됩니다.

소스 파일 분류#

소스 파일은 파일 경로 패턴을 기반으로 유형별로 분류됩니다:

  • frontend - JavaScript/Vue/CSS 파일
  • backend - Ruby 파일(모델, 컨트롤러, 서비스 등)
  • database - 마이그레이션 및 스키마 파일
  • infrastructure - CI 구성, Dockerfile
  • qa - QA 테스트 파일
  • workhorse - Go 파일
  • tooling - 도구 및 RuboCop 파일
  • configuration - 구성 파일
  • other - 패턴과 일치하지 않는 파일

전체 패턴 정의는 SourceFileClassifier를 참조하십시오.

테스트 책임 분류#

테스트는 다음 중 하나로 분류됩니다:

  • 책임: 소스 파일을 직접 테스트하는 테스트(예: app/models/user.rb에 대한 spec/models/user_spec.rb)
  • 종속: 소스 파일을 간접적으로 포함하는 테스트

분류는 .gitlab/coverage/responsibility_patterns.yml에 정의된 패턴을 사용합니다.

기능 범주 귀속#

각 소스 파일은 테스트 메타데이터를 기반으로 하나 이상의 기능 범주에 귀속됩니다. 이를 통해 팀별 커버리지 추적이 가능합니다.

여러 기능 범주가 있는 테스트에서 포함된 파일의 경우 여러 커버리지 레코드가 생성됩니다(범주당 하나).

조직 데이터 조회#

기능 범주는 category_owners 참조 테이블에서 조직 계층 구조(그룹, 스테이지, 섹션)로 보강됩니다.

데이터 저장(ClickHouse)#

커버리지 데이터는 분석 및 대시보드를 위해 ClickHouse로 내보내집니다.

테이블#

테이블 데이터베이스 설명
coverage_metrics code_coverage 조직 데이터가 있는 파일별 커버리지 백분율
test_file_mappings shared 소스 파일에서 테스트 파일 관계
category_owners shared 기능 범주에서 조직 계층 구조 매핑

내보내기 작업#

커버리지는 gitlab_quality-test_tooling gem에 의해 내보내집니다:

  • test-coverage:export-rspec-and-e2e - 백엔드 커버리지
  • test-coverage:export-jest-and-e2e - 프론트엔드 커버리지
  • test-coverage:export-workhorse - Workhorse 커버리지

구현 세부 정보는 gem의 코드 커버리지 README를 참조하십시오.

문제 해결#

누락된 커버리지 데이터#

커버리지 내보내기가 실패하면 다음을 확인하십시오:

  1. 누락된 아티팩트: 전제 조건 작업이 성공적으로 완료되고 아티팩트가 존재하는지 확인
  2. 유효하지 않은 JSON: 테스트 보고서나 커버리지 파일에 잘못된 형식의 JSON이 포함될 수 있음

경로 정규화 문제#

E2E 커버리지에는 절대 경로가 포함될 수 있습니다. 병합 스크립트가 경로를 정규화하지만, 경로 불일치가 보이면:

  1. 경로가 리포지토리 루트에서 시작되는지 확인하십시오(예: app/models/user.rb)
  2. 경로에 ./ 접두사나 /builds/gitlab-org/gitlab/과 같은 절대 경로가 없어야 합니다

NaN 커버리지 값#

파일에 포함할 줄이 없는 경우 커버리지 백분율이 NaN일 수 있습니다. 이러한 레코드는 내보내기 중에 필터링됩니다.

관련 주제#