단위 테스트 보고서
Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
단위 테스트 보고서는 머지 리퀘스트 및 파이프라인 세부 정보에 테스트 결과를 직접 표시하므로 job 로그를 검색하지 않고 실패를 식별할 수 있습니다. 단위 테스트 보고서는 다음과 같은 경우에 사용합니다: 단위 테스트 보고서는 JUnit XML 형식이 필요하며 job 상태에 영향을 미치지 않습니다.
단위 테스트 보고서는 머지 리퀘스트 및 파이프라인 세부 정보에 테스트 결과를 직접 표시하므로 job 로그를 검색하지 않고 실패를 식별할 수 있습니다.
단위 테스트 보고서는 다음과 같은 경우에 사용합니다:
- 머지 리퀘스트에서 즉시 테스트 실패를 확인합니다.
- 브랜치 간 테스트 결과를 비교합니다.
- 오류 세부 정보와 스크린샷으로 실패한 테스트를 디버그합니다.
- 시간 경과에 따른 테스트 실패 패턴을 추적합니다.
단위 테스트 보고서는 JUnit XML 형식이 필요하며 job 상태에 영향을 미치지 않습니다. 테스트가 실패할 때 job을 실패하게 하려면 job의 스크립트가 0이 아닌 상태 코드로 종료되어야 합니다.
GitLab Runner는 테스트 결과를 JUnit XML 형식으로 아티팩트로 업로드합니다. 머지 리퀘스트로 이동하면 소스 브랜치(head)와 타겟 브랜치(base) 간 테스트 결과가 비교되어 변경된 사항이 표시됩니다.
파일 형식 및 크기 제한#
단위 테스트 보고서는 적절한 파싱과 표시를 위한 특정 요구 사항이 있는 JUnit XML 형식을 사용해야 합니다.
파일 요구 사항#
테스트 보고서 파일은:
.xml파일 확장자가 있는 JUnit XML 형식을 사용해야 합니다.- 개별 파일당 30 MB 미만이어야 합니다.
- job의 모든 JUnit 파일 총 크기가 100 MB 미만이어야 합니다.
중복된 테스트 이름이 있는 경우 첫 번째 테스트만 사용되고 동일한 이름의 다른 테스트는 무시됩니다.
테스트 케이스 제한에 대해서는 단위 테스트 보고서당 최대 테스트 케이스를 참조하세요.
JUnit XML 형식 사양#
GitLab은 UI에서 테스트 결과를 표시하기 위해 JUnit XML 요소 및 속성의 일부를 파싱합니다.
| XML 요소 | XML 속성 | 설명 |
|---|---|---|
testsuites |
time |
모든 테스트 스위트의 총 실행 시간. 테스트 실행 시간 계산에 사용됩니다. |
testsuite |
name |
테스트 스위트 이름. 내부 그룹화를 위해 파싱됩니다. |
testsuite |
time |
개별 테스트 스위트의 실행 시간. 테스트 실행 시간 계산에 사용됩니다. |
testcase |
classname |
테스트 클래스 또는 카테고리 이름. UI에서 스위트 이름으로 표시됩니다. |
testcase |
name |
개별 테스트 이름. |
testcase |
file |
테스트가 정의된 파일 경로. |
testcase |
time |
초 단위 테스트 실행 시간. |
failure |
요소 콘텐츠 | 실패 메시지 및 스택 추적. |
error |
요소 콘텐츠 | 오류 메시지 및 스택 추적. |
skipped |
요소 콘텐츠 | 테스트를 건너뛴 이유. |
system-out |
요소 콘텐츠 | 시스템 출력 및 첨부 태그. testcase 요소에서만 파싱됩니다. |
system-err |
요소 콘텐츠 | 시스템 오류 출력. testcase 요소에서만 파싱됩니다. |
다음 요소와 속성은 파싱되지 않습니다:
testsuite속성 (tests, failures, errors, timestamp)testcase속성 (assertions, line, status)properties요소testsuite수준의system-out및system-err
XML 구조 예시#
<testsuites>
<testsuite name="Authentication Tests" tests="1" failures="1">
<testcase classname="LoginTest" name="test_invalid_password" file="spec/auth_spec.rb" time="0.23">
<failure>Expected authentication to fail</failure>
<system-out>[[ATTACHMENT|screenshots/failure.png]]</system-out>
</testcase>
</testsuite>
</testsuites>
이 XML은 GitLab에서 다음과 같이 표시됩니다:
- 스위트:
LoginTest(testcase classname에서) - 이름:
test_invalid_password(testcase name에서) - 파일:
spec/auth_spec.rb(testcase file에서) - 시간:
0.23s(testcase time에서) - 스크린샷: 테스트 세부 정보 대화 상자에서 사용 가능 (
testcase system-out에서) - 표시되지 않음: "Authentication Tests" (
testsuite name에서)
테스트 결과 유형#
테스트 결과는 머지 리퀘스트의 소스 및 타겟 브랜치 간에 비교되어 변경된 사항을 보여줍니다:
- 새로 실패한 테스트: 타겟 브랜치에서는 통과했지만 현재 브랜치에서 실패한 테스트.
- 새로 발생한 오류: 타겟 브랜치에서는 통과했지만 현재 브랜치에서 오류가 발생한 테스트.
- 기존 실패: 두 브랜치 모두에서 실패한 테스트.
- 해결된 실패: 타겟 브랜치에서는 실패했지만 현재 브랜치에서 통과한 테스트.
브랜치를 비교할 수 없는 경우 (예: 아직 타겟 브랜치 데이터가 없는 경우) 현재 브랜치의 실패한 테스트만 표시됩니다.
지난 14일 동안 기본 브랜치에서 실패한 테스트의 경우
Failed {n} time(s) in {default_branch} in the last 14 days와 같은 메시지가 표시됩니다.
이 수에는 완료된 파이프라인의 실패한 테스트가 포함되지만 차단된 파이프라인은 포함되지 않습니다.
차단된 파이프라인에 대한 지원은 이슈 431265에서 제안되어 있습니다.
단위 테스트 보고서 구성#
머지 리퀘스트 및 파이프라인에서 테스트 결과를 표시하도록 단위 테스트 보고서를 구성합니다.
단위 테스트 보고서를 구성하려면:
-
JUnit XML 형식으로 테스트 보고서를 출력하도록 테스트 job을 구성합니다. 구성 세부 정보는 테스트 프레임워크 문서를 검토하세요.
-
.gitlab-ci.yml파일에서 테스트 job에artifacts:reports:junit을 추가합니다. -
XML 테스트 보고서 파일의 경로를 지정합니다.
junit속성에는 다음을 사용할 수 있습니다:- 단일 파일 이름:
junit: report.xml - 파일 이름 패턴:
junit: test-results/**/*.xml - 파일 이름 배열:
junit: [rspec-1.xml, rspec-2.xml, rspec-3.xml] - 둘의 조합:
junit: [rspec.xml, test-results/TEST-*.xml]
디렉터리는 지원되지 않습니다 (예:
junit: test-results또는junit: test-results/**). - 단일 파일 이름:
-
선택 사항. 보고서 파일을 브라우저에서 볼 수 있게 하려면
artifacts:paths로 포함합니다. -
선택 사항. job이 실패해도 보고서를 업로드하려면
artifacts:when:always를 사용합니다.
RSpec으로 Ruby를 사용하는 구성 예시:
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
다음에서 테스트 결과를 볼 수 있습니다:
- 테스트 job이 완료된 후 파이프라인 세부 정보의 Tests 탭.
- 파이프라인이 완료된 후 머지 리퀘스트의 Test summary 패널.
머지 리퀘스트에서 테스트 결과 보기#
머지 리퀘스트의 테스트 실패에 대한 자세한 정보를 봅니다.
Test summary 패널은 실패한 테스트 수와 통과한 테스트 수를 포함한 테스트 결과의 개요를 보여줍니다.

테스트 실패 세부 정보를 보려면:
- 머지 리퀘스트에서 Test summary 패널로 이동합니다.
- Test summary 패널을 펼치려면 Show details ([chevron-lg-down])를 선택합니다.
- 실패한 테스트 옆에서 View details를 선택합니다.
대화 상자에는 테스트 이름, 파일 경로, 실행 시간, 스크린샷 첨부 파일 (구성된 경우), 오류 출력이 표시됩니다.
모든 테스트 결과를 보려면:
- Test summary 패널에서 Full report를 선택하여 파이프라인 세부 정보의 Tests 탭으로 이동합니다.
실패한 테스트 이름 복사#
디버깅을 위해 로컬에서 다시 실행할 테스트 이름을 복사합니다.
사전 요구 사항:
- JUnit 보고서에 실패한 테스트에 대한
<file>속성이 포함되어 있어야 합니다.
모든 실패한 테스트 이름을 복사하려면:
- Test summary 패널에서 실패한 테스트 복사 ([copy-to-clipboard])를 선택합니다.
실패한 테스트는 공백으로 구분된 문자열로 복사됩니다.
단일 실패한 테스트 이름을 복사하려면:
- Test summary 패널을 펼치려면 Show details ([chevron-lg-down])를 선택합니다.
- 복사할 테스트 옆에서 View details를 선택합니다.
- 대화 상자에서 로컬에서 다시 실행하려면 테스트 이름 복사 ([copy-to-clipboard])를 선택합니다.
테스트 이름이 클립보드에 복사됩니다.
파이프라인에서 테스트 결과 보기#
자식 파이프라인의 결과를 포함한 파이프라인 세부 정보에서 모든 테스트 스위트와 케이스를 봅니다.
파이프라인 테스트 결과를 보려면:
- 파이프라인 세부 정보 페이지로 이동합니다.
- Tests 탭을 선택합니다.
- 개별 테스트 케이스를 보려면 테스트 스위트를 선택합니다.

파이프라인 API를 사용하여 테스트 보고서를 가져올 수도 있습니다.
테스트 타이밍 메트릭#
테스트 결과는 다양한 타이밍 메트릭을 표시합니다:
파이프라인 기간 : 파이프라인이 시작될 때부터 완료될 때까지의 경과 시간.
테스트 실행 시간 : 모든 job에서 모든 테스트를 실행하는 데 소요된 총 시간 합계.
큐 시간 : job이 사용 가능한 러너를 기다리는 데 소요된 시간.
job이 병렬로 실행되면 누적 테스트 실행 시간이 파이프라인 기간을 초과할 수 있습니다.
파이프라인 기간은 결과를 기다리는 시간을 보여주는 반면, 테스트 실행 시간은 사용된 컴퓨팅 리소스를 보여줍니다.
예를 들어 81분 만에 완료되는 파이프라인이 여러 러너에서 병렬로 많은 테스트 job이 실행되면 9시간 10분의 테스트 실행 시간을 표시할 수 있습니다.
테스트 보고서에 스크린샷 추가#
테스트 실패를 디버그하는 데 도움이 되도록 테스트 보고서에 스크린샷을 추가합니다.
테스트 보고서에 스크린샷을 추가하려면:
-
JUnit XML 파일에서
$CI_PROJECT_DIR을 기준으로 한 스크린샷 경로가 있는 첨부 태그를 추가합니다:<testcase time="1.00" name="Test"> <system-out>[[ATTACHMENT|/path/to/some/file]]</system-out> </testcase> -
.gitlab-ci.yml파일에서 스크린샷을 아티팩트로 업로드하도록 job을 구성합니다:- 스크린샷 파일의 경로를 지정합니다.
- 선택 사항. 테스트가 실패할 때 스크린샷을 업로드하려면
artifacts:when: always를 사용합니다.
예를 들어:
ruby: stage: test script: - bundle install - bundle exec rspec --format progress --format RspecJunitFormatter --out rspec.xml - # 테스트 프레임워크가 스크린샷을 디렉토리에 저장해야 합니다 artifacts: when: always paths: - rspec.xml - screenshots/ reports: junit: rspec.xml -
파이프라인을 실행합니다.
Test summary 패널의 실패한 테스트에 대해 View details를 선택하면 테스트 세부 정보 대화 상자에서 스크린샷 링크에 접근할 수 있습니다.

문제 해결#
테스트 보고서가 비어 있음#
머지 리퀘스트에서 빈 Test summary 패널이 표시될 수 있습니다.
이 문제는 다음과 같은 경우에 발생합니다:
- 보고서 아티팩트가 만료되었습니다.
- JUnit 파일이 크기 제한을 초과합니다.
이 문제를 해결하려면 보고서 아티팩트에 더 긴 expire_in 값을 설정하거나
새 보고서를 생성하기 위해 새 파이프라인을 실행하세요.
JUnit 파일이 크기 제한을 초과하는 경우 다음을 확인하세요:
- 개별 JUnit 파일이 30 MB 미만이어야 합니다.
- job의 모든 JUnit 파일 총 크기가 100 MB 미만이어야 합니다.
사용자 정의 제한에 대한 지원은 에픽 16374에서 제안되어 있습니다.
테스트 결과 누락#
보고서에서 예상보다 적은 테스트 결과가 표시될 수 있습니다.
이는 JUnit XML 파일에 중복된 테스트 이름이 있을 때 발생할 수 있습니다. 각 이름에 대해 첫 번째 테스트만 사용되고 중복은 무시됩니다.
이 문제를 해결하려면 모든 테스트 이름과 클래스가 고유한지 확인하세요.
머지 리퀘스트에 테스트 보고서가 표시되지 않음#
머지 리퀘스트에 Test summary 패널이 전혀 표시되지 않을 수 있습니다.
이 문제는 타겟 브랜치에 비교할 테스트 데이터가 없을 때 발생할 수 있습니다.
이 문제를 해결하려면 기준 테스트 데이터를 생성하기 위해 타겟 브랜치에서 파이프라인을 실행하세요.
JUnit XML 파싱 오류#
파이프라인의 job 이름 옆에 파싱 오류 표시기가 표시될 수 있습니다.
이는 JUnit XML 파일에 형식 오류 또는 잘못된 요소가 포함되어 있을 때 발생할 수 있습니다.
이 문제를 해결하려면:
- JUnit XML 파일이 표준 형식을 따르는지 확인합니다.
- 모든 XML 요소가 올바르게 닫혀 있는지 확인합니다.
- 속성 이름 및 값이 올바르게 형식화되어 있는지 확인합니다.
그룹화된 job의 경우 그룹의 첫 번째 파싱 오류만 표시됩니다.
