커버리지 리포팅
커버리지 리포팅 (Coverage reporting)
테스트 job의 로그 출력에서 커버리지 백분율을 추출해서 MR과 분석 화면에 표시하고 싶다면, coverage 키워드를 사용해요. 이 키워드는 백분율만 보여주고, MR diff에 라인별 주석을 만들지는 않습니다. 라인 주석을 표시하려면 artifacts:reports:coverage_report를 별도로 구성해야 해요.
출처: 문서
본문
- 티어(Tier): Free, Premium, Ultimate
- 제공 방식(Offering): GitLab.com, GitLab Self-Managed, GitLab Dedicated
커버리지 리포팅 구성하기
커버리지 리포팅을 구성하는 방법:
- 테스트 도구의 출력과 일치하는 정규 표현식으로 job에
coverage키워드를 추가해요:test: script: - pytest --cov coverage: '/TOTAL.*? (100(?:\\.0+)?\\%|[1-9]?\\d(?:\\.\\d+)?\\%)$/' - 여러 job의 커버리지를 합치려면 각 job에
coverage키워드를 추가해요.
커버리지 정규 표현식 패턴
다음 정규 표현식 패턴은 흔한 테스트 커버리지 도구의 출력과 일치해요. 도구 출력 형식은 시간이 지나며 변할 수 있으니 신중하게 테스트해 보세요.
Python과 Ruby
| 도구 | 언어 | 명령 | 정규 표현식 패턴 |
|---|---|---|---|
| pytest-cov | Python | pytest --cov |
/TOTAL.*? (100(?:\\.0+)?\\%\|[1-9]?\\d(?:\\.\\d+)?\\%)$/ |
| SimpleCov | Ruby | rspec spec |
/Line\\sCoverage:\\s\\d+\\.\\d+%/ |
C/C++와 Rust
| 도구 | 언어 | 명령 | 정규 표현식 패턴 |
|---|---|---|---|
| gcovr | C/C++ | gcovr |
/^TOTAL.*\\s+(\\d+\\%)$/ |
| Tarpaulin | Rust | cargo tarpaulin |
/^\\d+.\\d+% coverage/ |
Java와 JVM
| 도구 | 언어 | 명령 | 정규 표현식 패턴 |
|---|---|---|---|
| JaCoCo | Java/Kotlin | ./gradlew test jacocoTestReport |
/Total.*?([0-9]{1,3})%/ |
| scoverage | Scala | sbt coverage test coverageReport |
/(?i)total.*? (100(?:\\.0+)?\\%\|[1-9]?\\d(?:\\.\\d+)?\\%)$/ |
Node.js
| 도구 | 명령 | 정규 표현식 패턴 |
|---|---|---|
| tap | tap --coverage-report=text-summary |
/^Statements\\s*:\\s*([^%]+)/ |
| nyc | nyc npm test |
/All files[^\\x7c]*\\x7c[^\\x7c]*\\s+([\\d\\.]+)/ |
| Jest | jest --ci --coverage |
/All files[^\\x7c]*\\x7c[^\\x7c]*\\s+([\\d\\.]+)/ |
| node:test | node --experimental-test-coverage --test |
/all files[^\\x7c]*\\x7c[^\\x7c]*\\s+([\\d\\.]+)/ |
PHP
| 도구 | 명령 | 정규 표현식 패턴 |
|---|---|---|
| Pest | pest --coverage --colors=never |
/Statement coverage[A-Za-z\\.*]\\s*:\\s*([^%]+)/ |
| PHPUnit | phpunit --coverage-text --colors=never |
/^\\s*Lines:\\s*\\d+.\\d+\\%/ |
Go
| 도구 | 명령 | 정규 표현식 패턴 |
|---|---|---|
| go test (단일) | go test -cover |
/coverage: \\d+.\\d+% of statements/ |
| go test (프로젝트) | go test -coverprofile=cover.profile && go tool cover -func cover.profile |
/total:\\s+\\(statements\\)\\s+\\d+.\\d+%/ |
.NET과 PowerShell
| 도구 | 언어 | 명령 | 정규 표현식 패턴 |
|---|---|---|---|
| OpenCover | .NET | 없음 | /(Visited Points).*\\((.*)\\)/ |
| dotnet test | .NET | dotnet test |
/Total\\s*\\x7c*\\s(\\d+(?:\\.\\d+)?)/ |
| Pester | PowerShell | 없음 | /Covered \\d{1,3}[.,]?\\d{0,2}%/ |
Elixir
| 도구 | 명령 | 정규 표현식 패턴 |
|---|---|---|
| ExCoveralls | 없음 | /\\[TOTAL\\]\\s+(\\d+\\.\\d+)%/ |
| Mix | mix test --cover |
/\\d+.\\d+\\%\\s+\\x7c\\s+Total/ |
커버리지 체크 승인 규칙 추가하기
- 티어(Tier): Premium, Ultimate
프로젝트의 테스트 커버리지를 낮추는 MR을 특정 사용자나 그룹이 승인하도록 요구할 수 있어요.
전제 조건:
- 커버리지 리포팅을 구성해 두세요.
Coverage-Check 승인 규칙을 추가하는 방법:
- 상단 바에서 Search or go to를 선택하고 프로젝트를 찾아요.
- 왼쪽 사이드바에서 Settings > Merge requests를 선택해요.
- Merge request approvals 아래에서 다음 중 하나를 해요: -
Coverage-Check승인 규칙 옆에서 Enable을 선택하거나, - 수동 설정의 경우 Add approval rule을 선택하고 Rule name에Coverage-Check를 입력해요. - Target branch를 선택해요.
- Required number of approvals의 수를 설정해요.
- 승인을 제공할 Users 또는 Groups를 선택해요.
- Save changes를 선택해요.
Coverage-Check 승인 규칙은 MR이 전반적 커버리지를 개선하더라도, 머지 베이스 파이프라인에 커버리지 데이터가 없으면 승인을 요구해요.
커버리지 이력 확인하기
프로젝트나 그룹의 커버리지 추세를 시간에 따라 추적할 수 있어요.
프로젝트 기준
- 상단 바에서 Search or go to를 선택하고 프로젝트를 찾아요.
- 왼쪽 사이드바에서 Analyze > Repository analytics를 선택해요.
- 드롭다운 목록에서 이력 데이터를 확인할 job을 선택해요.
- 선택 사항. 데이터를 다운로드하려면 **Download raw data (.csv)**를 선택해요.
그룹 기준
- 티어(Tier): Premium, Ultimate
- 상단 바에서 Search or go to를 선택하고 그룹을 찾아요.
- 왼쪽 사이드바에서 Analyze > Repository analytics를 선택해요.
- 선택 사항. 데이터를 다운로드하려면 **Download historic test coverage data (.csv)**를 선택해요.
커버리지 배지 표시하기
프로젝트에 커버리지 배지를 추가하려면 테스트 커버리지 리포트 배지 문서를 참고하세요.
문제 해결 (Troubleshooting)
커버리지 리포팅을 다룰 때 다음 문제가 생길 수 있어요.
MR 위젯에 커버리지 백분율이 표시되지 않아요
coverage 키워드는 정규 표현식으로 job의 로그 출력에서 백분율을 추출해요. 백분율이 표시되지 않으면:
- 정규 표현식이 도구의 실제 출력과 일치하는지 확인하세요. job 로그에서 한 줄을 복사해서 정규 표현식에 대해 테스트해 보세요.
- 일부 도구는 정규 표현식 일치를 깨뜨리는 ANSI 색상 코드를 출력해요. 도구가 색상 출력 끄기를 지원하지 않으면 파싱 전에 코드를 제거하세요:
lein cloverage | perl -pe 's/\\e\\[?.*?[\\@-~]//g' - job이 성공적으로 완료됐는지 확인하세요. 커버리지는 성공한 job에서만 추출돼요.
- 자식 파이프라인(child pipeline)의 커버리지 출력은 기록되지 않아요. 자세한 내용은 issue 280818을 참고하세요.
coverage 키워드는 MR 위젯에 백분율만 표시해요. diff에 라인별 주석을 표시하려면 artifacts:reports:coverage_report를 별도로 구성하세요.