단위 테스트 보고서

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

CI/CD 파이프라인에는 코드를 검증하는 테스트 작업이 포함되는 것이 매우 흔합니다. 테스트가 실패하면 파이프라인이 실패하고 사용자에게 알림이 전송됩니다. Merge Request을 처리하는 사람은 작업 로그를 확인하여 테스트가 실패한 위치를 파악하고 수정해야 합니다.

작업을 구성하여 단위 테스트 보고서를 사용할 수 있으며, GitLab은 Merge Request에 보고서를 표시하여 전체 로그를 확인하지 않고도 실패를 쉽고 빠르게 식별할 수 있게 합니다. 현재 단위 테스트 보고서는 JUnit 보고서 형식의 테스트 보고서만 지원합니다.

Merge Request을 사용하지 않더라도 작업 로그를 검색하지 않고 단위 테스트 보고서 출력을 보고 싶다면 파이프라인 상세 보기에서 전체 단위 테스트 보고서를 볼 수 있습니다.

다음 워크플로를 고려해보세요:

  1. 기본 브랜치가 매우 안정적이고, 프로젝트가 GitLab CI/CD를 사용하며, 파이프라인에서 아무 문제도 없음을 나타내고 있을 때
  2. 팀원 중 한 명이 Merge Request을 제출하고, 테스트가 실패하여 파이프라인에 알려진 빨간 아이콘을 얻을 때
  3. 실패한 테스트의 원인을 파악하기 위해 수천 개의 라인을 포함하는 작업 로그를 살펴봐야 할 때
  4. 단위 테스트 보고서를 구성하면 즉시 GitLab이 보고서를 수집하여 Merge Request에 노출시킵니다. 더 이상 작업 로그에서 찾을 필요가 없습니다.
  5. 개발 및 디버깅 워크플로가 더 쉬워지고, 더 빠르고 효율적으로 작동합니다.

작동 방식

먼저, GitLab Runner는 JUnit 보고서 형식 XML 파일아티팩트로 GitLab에 업로드합니다. 그런 다음 Merge Request을 방문하면 GitLab이 헤드 브랜치와 베이스 브랜치의 JUnit 보고서 형식 XML 파일을 비교하기 시작합니다. 이 때:

  • 베이스 브랜치는 대상 브랜치(일반적으로 기본 브랜치)입니다.
  • 헤드 브랜치는 소스 브랜치(각 Merge Request에서 최신 파이프라인)입니다.

테스트 요약 패널은 얼마나 많은 테스트가 실패했는지, 얼마나 많은 테스트가 오류가 발생했는지, 그리고 얼마나 많은 테스트가 수정되었는지를 보여줍니다. 베이스 브랜치에 대한 데이터가 없는 경우, 패널은 소스 브랜치의 실패한 테스트 디렉터리만 표시합니다.

결과 유형은 다음과 같습니다.

  • 새로운 실패한 테스트: 베이스 브랜치에서 통과했고 헤드 브랜치에서 실패한 테스트 케이스.
  • 새로운 오류: 베이스 브랜치에서 통과했지만 헤드 브랜치에서 테스트 오류로 실패한 테스트 케이스.
  • 기존 실패: 베이스 브랜치에서 실패했고 헤드 브랜치에서 실패한 테스트 케이스.
  • 해결된 실패: 베이스 브랜치에서 실패했지만 헤드 브랜치에서 통과한 테스트 케이스.

실패한 테스트 보기

테스트 요약 패널의 각 항목은 테스트 이름과 결과 유형을 표시합니다. 테스트 이름을 선택하면 실행 시간 및 오류 출력과 같은 세부 정보가 포함된 모달 창이 열립니다.

테스트 보고서 위젯

실패한 테스트 이름 복사

테스트 요약 패널에 실패한 테스트가 나열된 경우, 실패한 테스트의 이름과 경로를 복사할 수 있습니다. 이름과 경로를 사용하여 테스트를 찾아 로컬에서 확인하고 다시 실행할 수 있습니다.

모든 실패한 테스트의 이름을 복사하려면 테스트 요약 세부 정보 표시()를 상단에서 선택합니다. 실패한 테스트는 공백으로 구분된 문자열로 나열됩니다. 이 옵션은 JUnit 보고서가 실패한 테스트의 <file> 속성을 채우는 경우에만 사용할 수 있습니다.

개별적인 실패한 테스트의 이름을 복사하려면:

  1. 테스트 요약 패널을 확장하려면 테스트 요약 세부 정보 표시를 선택합니다().
  2. 검토하려는 테스트를 선택합니다.
  3. 로컬에서 다시 실행할 테스트 이름 복사를 선택합니다().

최근 실패 횟수

프로젝트의 기본 브랜치에서 지난 14일 동안 테스트가 실패하면 지난 14일 동안 {default_branch}에서 {n}회 실패함과 같은 메시지가 표시됩니다.

이 계산에는 완료된 파이프라인에서 실패한 테스트가 포함되지만 차단된 파이프라인은 포함되지 않습니다. 이슈 431265에서 차단된 파이프라인도 포함하도록 제안되었습니다.

설정 방법

Merge Request에서 단위 테스트 보고서를 활성화하려면 .gitlab-ci.ymlartifacts:reports:junit를 추가하고 생성된 테스트 보고서의 경로를 지정해야 합니다. 보고서는 .xml 파일이어야 하며, 그렇지 않으면 GitLab에서 오류 500을 반환합니다.

다음 Ruby 예제에서는 test 단계의 작업에서 작업이 실행되고, GitLab이 해당 작업에서 단위 테스트 보고서를 수집합니다. 작업 실행 후에 XML 보고서가 아티팩트로 GitLab에 저장되고 결과가 Merge Request 위젯에 표시됩니다.

## rspec을 사용하여 JUnit 보고서 형식 XML 파일을 생성하는 https://github.com/sj26/rspec_junit_formatter 사용
ruby:
  stage: test
  script:
    - bundle install
    - bundle exec rspec --format progress --format RspecJunitFormatter --out rspec.xml
  artifacts:
    when: always
    paths:
      - rspec.xml
    reports:
      junit: rspec.xml

단위 테스트 보고서 출력 파일을 탐색할 수 있도록 하려면 artifacts:paths 키워드와 함께 해당 파일을 포함해야 합니다. 테스트가 통과하지 않을 경우(예: 테스트가 통과되지 않는 경우)에도 보고서를 업로드하려면 artifacts:when:always 키워드를 사용하세요.

동일한 이름과 클래스를 가진 여러 테스트를 JUnit 보고서 형식 XML 파일에 포함할 수 없습니다.

GitLab 15.0 이전에는 parallel:matrix 작업에서의 테스트 보고서가 집계되어 일부 보고서 정보가 표시되지 않을 수 있습니다. 그러나 GitLab 15.1부터는 이 버그가 수정되었습니다 그리고 모든 보고서 정보가 표시됩니다.

GitLab에서 단위 테스트 보고서 보기

파이프라인의 일부로 생성되고 업로드된 JUnit 보고서 형식 XML 파일은 파이프라인 세부 정보 페이지 내에서 볼 수 있습니다. 이 페이지의 테스트 탭은 XML 파일에서 보고된 테스트 스위트 및 케이스 디렉터리을 표시합니다.

테스트 보고서 위젯

알려진 테스트 스위트를 모두 볼 수 있으며 각각을 선택하여 해당 스위트를 구성하는 케이스를 표시할 수 있습니다.

또한 GitLab API를 통해 보고서를 검색할 수도 있습니다.

단위 테스트 보고서 구문 분석 오류

JUnit 보고서 XML 구문 분석이 오류를 일으키면 작업 이름 옆에 표시기가 표시됩니다. 아이콘 위로 마우스를 올리면 툴팁에 구문 분석기 오류가 표시됩니다. 다수의 구문 분석 오류가 그룹화된 작업에서 오는 경우, GitLab은 그룹에서 첫 번째 오류만 표시합니다.

오류가 포함된 테스트 보고서

테스트 케이스 파싱 제한 사항에 대해서는 단위 테스트 보고서 당 최대 테스트 케이스를 참조하십시오.

GitLab은 JUnit 보고서의 매우 큰 노드를 구문 분석하지 않습니다. 이를 선택적으로 만들 수 있는 이슈가 있습니다.

GitLab에서 JUnit 스크린샷 보기

artifacts로 스크린샷을 GitLab에 업로드할 수 있습니다. JUnit 보고서 형식의 XML 파일에 attachment 태그가 포함되어 있다면, GitLab은 해당 첨부 파일을 구문 분석합니다. 스크린샷 artifacts를 업로드할 때:

  • attachment 태그는 반드시 $CI_PROJECT_DIR을 기준으로 업로드한 스크린샷의 경로를 포함해야 합니다. 예를 들어:

    <testcase time="1.00" name="Test">
      <system-out>[[ATTACHMENT|/path/to/some/file]]</system-out>
    </testcase>
    
  • 스크린샷을 업로드하는 작업은 테스트가 실패해도 스크린샷을 여전히 업로드하도록 artifacts:when: always로 설정해야 합니다.

첨부 파일을 업로드한 후, 파이프라인 테스트 보고서에 스크린샷에 대한 링크가 포함됩니다. 예를 들어:

Unit test report screenshot example

문제 해결

테스트 보고서가 비어 보입니다

테스트 보고서는 GitLab에서 볼 때 보고서가 포함된 artifact가 만료되었을 때 비어 보일 수 있습니다. 만료가 너무 빠르게 발생한다면, 보고서 artifact에 대한 더 긴 expire_in 값을 설정하세요.

또는, 새로운 보고서를 생성하기 위해 새 파이프라인을 실행할 수 있습니다.