InfoGrab DocsInfoGrab Docs

커버리지 시각화

요약

- Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated artifacts:reports:coverage_report 키워드를 사용하여 머지 리퀘스트 diff에 라인별 커버리지 어노테이션을 표시합니다.


커버리지 시각화#

  - 
  Tier: Free, Premium, Ultimate

- Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated

artifacts:reports:coverage_report 키워드를 사용하여 머지 리퀘스트 diff에 라인별 커버리지 어노테이션을 표시합니다.

이 키워드는 diff 어노테이션만 표시합니다. MR 위젯에 커버리지 비율을 표시하거나 커버리지 히스토리 그래프를 채우지는 않습니다. 커버리지 비율을 표시하려면 coverage 키워드를 별도로 구성해야 합니다.

파이프라인이 완료된 후, GitLab은 백그라운드에서 리포트를 처리하고 MR diff의 라인에 어노테이션을 표시합니다:

  • 녹색: 테스트로 커버된 라인입니다.

  • 빨간색: 테스트로 커버되지 않은 라인입니다.

  • 주황색 (Cobertura 전용): 로드되었지만 한 번도 실행되지 않은 라인입니다.

어노테이션은 MR diff에서 변경된 파일에만 표시됩니다. MR에서 변경되지 않은 파일은 리포트에 해당 파일의 커버리지 데이터가 포함되어 있더라도 어노테이션이 표시되지 않습니다.

커버리지 시각화 구성#

커버리지 시각화를 구성하려면 job에 artifacts:reports:coverage_report를 추가합니다:

test:
  script:
    - run tests with coverage
  artifacts:
    reports:
      coverage_report:
        coverage_format: cobertura  # or jacoco
        path: coverage/coverage.xml

언어별 예시는 다음을 참고하세요:

여러 리포트를 수집하려면 아티팩트 경로에 와일드카드를 사용합니다. GitLab은 결과를 하나의 리포트로 병합합니다.

하위 파이프라인의 커버리지 리포트는 MR diff 어노테이션에 표시됩니다.

제한 사항#

제한
최대 Cobertura XML 파일 크기 10 MiB
Cobertura XML 파일 내 최대 <source> 노드 수 100

Cobertura 리포트가 100개의 <source> 노드를 초과하면, diff 뷰에서 어노테이션이 누락되거나 잘못 매칭될 수 있습니다. 대규모 프로젝트의 경우 리포트를 더 작은 파일로 분할하세요. 자세한 내용은 이슈 328772를 참고하세요.

시각화는 파이프라인이 완료된 후에만 표시됩니다. 파이프라인에 차단 수동 job이 있으면 해당 job이 실행될 때까지 시각화를 사용할 수 없습니다.

job 세부 정보 페이지에서 커버리지 리포트를 다운로드하려면 reports뿐만 아니라 아티팩트 paths에도 추가합니다:

artifacts:
  paths:
    - coverage/cobertura-coverage.xml
  reports:
    coverage_report:
      coverage_format: cobertura
      path: coverage/cobertura-coverage.xml

경로 해석#

커버리지 리포트는 상대 파일 경로를 사용합니다. GitLab은 MR에서 변경된 파일과 대조하여 이를 리포지터리의 절대 경로로 해석합니다.

JaCoCo의 경우 매칭 프로세스는 다음과 같습니다:

  • 동일한 파이프라인 ref에 대한 모든 머지 리퀘스트를 찾습니다.

  • 변경된 모든 파일에 대해 절대 경로를 수집합니다.

  • 리포트의 각 상대 경로에 대해 첫 번째로 매칭되는 절대 경로를 사용합니다.

Cobertura의 경우, GitLab은 <sources> 요소도 사용하여 경로를 재구성합니다:

  • <source> 항목에서 경로 세그먼트를 추출합니다.

  • 각 세그먼트를 각 <class> 요소의 filename 속성과 결합합니다.

  • 후보 경로가 리포지터리에 존재하는지 확인합니다.

  • 첫 번째 매칭 결과를 절대 경로로 사용합니다.

이 자동 수정은 <source> 경로가 //... 형식을 따를 때만 작동합니다.

경로 해석 예시#

프로젝트 전체 경로가 test-org/test-cs-project이고 프로젝트 루트를 기준으로 다음 파일이 있는 C# 프로젝트의 경우:

Auth/User.cs
Lib/Utils/User.cs

Cobertura XML에 다음 sources가 있을 때:

<sources>
  <source>/builds/test-org/test-cs-project/Auth</source>
  <source>/builds/test-org/test-cs-project/Lib/Utils</source>
</sources>

파서는 sources에서 AuthLib/Utils를 추출하고, 각각을 각 <class> 요소의 filename 속성과 결합합니다. filename="User.cs"인 클래스의 경우, 리포지터리의 파일과 매칭되는 첫 번째 후보는 Auth/User.cs입니다.

<class> 요소에 대해 파서는 최대 100번의 반복을 시도합니다. 매칭이 없으면 해당 클래스는 최종 커버리지 리포트에 포함되지 않습니다.

문제 해결#

커버리지 시각화 작업 시 다음과 같은 문제가 발생할 수 있습니다.

Diff 어노테이션이 표시되지 않음#

다음과 같은 이유로 어노테이션이 표시되지 않을 수 있습니다:

파이프라인이 완료되지 않았습니다. 어노테이션은 파이프라인이 완료된 후 생성됩니다. 파이프라인이 완료될 때까지 기다린 후 MR diff를 새로 고침하세요.

파일이 MR diff에 없습니다. 어노테이션은 MR에서 변경된 파일에만 표시되며, 리포트에 다른 파일의 커버리지 데이터가 포함되어 있어도 마찬가지입니다.

리포트의 파일 경로가 리포지터리 경로와 일치하지 않습니다. 경로 해석이 실패하면 어노테이션은 자동으로 건너뜁니다. 진단하려면 커버리지 XML 아티팩트를 다운로드하고 <class> 요소의 filename 속성과 프로젝트 루트를 기준으로 한 리포지터리의 파일 경로를 비교하세요.

프로젝트에 중복된 상대 경로를 가진 여러 모듈이 있습니다. 경로가 모듈 전체에서 고유하지 않으면 GitLab은 어노테이션이 어느 파일에 속하는지 확인할 수 없습니다. 상대 경로가 모듈 전체에서 고유하도록 설정하세요:

    src/main/java/org/acme/DemoExample.java
  - src/main/other-module/org/acme/DemoExample.java
  + src/main/other-module/org/acme/OtherDemoExample.java

coverage 키워드가 구성되지 않았습니다. artifacts:reports:coverage_report는 MR 위젯에 비율을 표시하지 않습니다. 커버리지 비율을 표시하려면 coverage 키워드를 별도로 구성하세요.

변경된 모든 파일에 메트릭이 표시되지 않음#

이 문제는 동일한 소스 브랜치에서 다른 타깃 브랜치로 새 머지 리퀘스트를 생성할 때 발생합니다. 파이프라인이 이전 머지 리퀘스트의 diff를 사용하고 해당 diff에 없는 파일에 대한 어노테이션을 표시하지 않습니다.

이 문제를 해결하려면 새 머지 리퀘스트가 생성될 때까지 기다린 후 파이프라인을 다시 실행하세요.

커버리지 시각화

GitLab v19.1
원문 보기
요약

- Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated artifacts:reports:coverage_report 키워드를 사용하여 머지 리퀘스트 diff에 라인별 커버리지 어노테이션을 표시합니다.


커버리지 시각화#

  - 
  Tier: Free, Premium, Ultimate

- Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated

artifacts:reports:coverage_report 키워드를 사용하여 머지 리퀘스트 diff에 라인별 커버리지 어노테이션을 표시합니다.

이 키워드는 diff 어노테이션만 표시합니다. MR 위젯에 커버리지 비율을 표시하거나 커버리지 히스토리 그래프를 채우지는 않습니다. 커버리지 비율을 표시하려면 coverage 키워드를 별도로 구성해야 합니다.

파이프라인이 완료된 후, GitLab은 백그라운드에서 리포트를 처리하고 MR diff의 라인에 어노테이션을 표시합니다:

  • 녹색: 테스트로 커버된 라인입니다.

  • 빨간색: 테스트로 커버되지 않은 라인입니다.

  • 주황색 (Cobertura 전용): 로드되었지만 한 번도 실행되지 않은 라인입니다.

어노테이션은 MR diff에서 변경된 파일에만 표시됩니다. MR에서 변경되지 않은 파일은 리포트에 해당 파일의 커버리지 데이터가 포함되어 있더라도 어노테이션이 표시되지 않습니다.

커버리지 시각화 구성#

커버리지 시각화를 구성하려면 job에 artifacts:reports:coverage_report를 추가합니다:

test:
  script:
    - run tests with coverage
  artifacts:
    reports:
      coverage_report:
        coverage_format: cobertura  # or jacoco
        path: coverage/coverage.xml

언어별 예시는 다음을 참고하세요:

여러 리포트를 수집하려면 아티팩트 경로에 와일드카드를 사용합니다. GitLab은 결과를 하나의 리포트로 병합합니다.

하위 파이프라인의 커버리지 리포트는 MR diff 어노테이션에 표시됩니다.

제한 사항#

제한
최대 Cobertura XML 파일 크기 10 MiB
Cobertura XML 파일 내 최대 <source> 노드 수 100

Cobertura 리포트가 100개의 <source> 노드를 초과하면, diff 뷰에서 어노테이션이 누락되거나 잘못 매칭될 수 있습니다. 대규모 프로젝트의 경우 리포트를 더 작은 파일로 분할하세요. 자세한 내용은 이슈 328772를 참고하세요.

시각화는 파이프라인이 완료된 후에만 표시됩니다. 파이프라인에 차단 수동 job이 있으면 해당 job이 실행될 때까지 시각화를 사용할 수 없습니다.

job 세부 정보 페이지에서 커버리지 리포트를 다운로드하려면 reports뿐만 아니라 아티팩트 paths에도 추가합니다:

artifacts:
  paths:
    - coverage/cobertura-coverage.xml
  reports:
    coverage_report:
      coverage_format: cobertura
      path: coverage/cobertura-coverage.xml

경로 해석#

커버리지 리포트는 상대 파일 경로를 사용합니다. GitLab은 MR에서 변경된 파일과 대조하여 이를 리포지터리의 절대 경로로 해석합니다.

JaCoCo의 경우 매칭 프로세스는 다음과 같습니다:

  • 동일한 파이프라인 ref에 대한 모든 머지 리퀘스트를 찾습니다.

  • 변경된 모든 파일에 대해 절대 경로를 수집합니다.

  • 리포트의 각 상대 경로에 대해 첫 번째로 매칭되는 절대 경로를 사용합니다.

Cobertura의 경우, GitLab은 <sources> 요소도 사용하여 경로를 재구성합니다:

  • <source> 항목에서 경로 세그먼트를 추출합니다.

  • 각 세그먼트를 각 <class> 요소의 filename 속성과 결합합니다.

  • 후보 경로가 리포지터리에 존재하는지 확인합니다.

  • 첫 번째 매칭 결과를 절대 경로로 사용합니다.

이 자동 수정은 <source> 경로가 //... 형식을 따를 때만 작동합니다.

경로 해석 예시#

프로젝트 전체 경로가 test-org/test-cs-project이고 프로젝트 루트를 기준으로 다음 파일이 있는 C# 프로젝트의 경우:

Auth/User.cs
Lib/Utils/User.cs

Cobertura XML에 다음 sources가 있을 때:

<sources>
  <source>/builds/test-org/test-cs-project/Auth</source>
  <source>/builds/test-org/test-cs-project/Lib/Utils</source>
</sources>

파서는 sources에서 AuthLib/Utils를 추출하고, 각각을 각 <class> 요소의 filename 속성과 결합합니다. filename="User.cs"인 클래스의 경우, 리포지터리의 파일과 매칭되는 첫 번째 후보는 Auth/User.cs입니다.

<class> 요소에 대해 파서는 최대 100번의 반복을 시도합니다. 매칭이 없으면 해당 클래스는 최종 커버리지 리포트에 포함되지 않습니다.

문제 해결#

커버리지 시각화 작업 시 다음과 같은 문제가 발생할 수 있습니다.

Diff 어노테이션이 표시되지 않음#

다음과 같은 이유로 어노테이션이 표시되지 않을 수 있습니다:

파이프라인이 완료되지 않았습니다. 어노테이션은 파이프라인이 완료된 후 생성됩니다. 파이프라인이 완료될 때까지 기다린 후 MR diff를 새로 고침하세요.

파일이 MR diff에 없습니다. 어노테이션은 MR에서 변경된 파일에만 표시되며, 리포트에 다른 파일의 커버리지 데이터가 포함되어 있어도 마찬가지입니다.

리포트의 파일 경로가 리포지터리 경로와 일치하지 않습니다. 경로 해석이 실패하면 어노테이션은 자동으로 건너뜁니다. 진단하려면 커버리지 XML 아티팩트를 다운로드하고 <class> 요소의 filename 속성과 프로젝트 루트를 기준으로 한 리포지터리의 파일 경로를 비교하세요.

프로젝트에 중복된 상대 경로를 가진 여러 모듈이 있습니다. 경로가 모듈 전체에서 고유하지 않으면 GitLab은 어노테이션이 어느 파일에 속하는지 확인할 수 없습니다. 상대 경로가 모듈 전체에서 고유하도록 설정하세요:

    src/main/java/org/acme/DemoExample.java
  - src/main/other-module/org/acme/DemoExample.java
  + src/main/other-module/org/acme/OtherDemoExample.java

coverage 키워드가 구성되지 않았습니다. artifacts:reports:coverage_report는 MR 위젯에 비율을 표시하지 않습니다. 커버리지 비율을 표시하려면 coverage 키워드를 별도로 구성하세요.

변경된 모든 파일에 메트릭이 표시되지 않음#

이 문제는 동일한 소스 브랜치에서 다른 타깃 브랜치로 새 머지 리퀘스트를 생성할 때 발생합니다. 파이프라인이 이전 머지 리퀘스트의 diff를 사용하고 해당 diff에 없는 파일에 대한 어노테이션을 표시하지 않습니다.

이 문제를 해결하려면 새 머지 리퀘스트가 생성될 때까지 기다린 후 파이프라인을 다시 실행하세요.