Cobertura 커버리지 시각화
GitLab v19.5Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
요약
Cobertura XML 리포트를 사용하면 머지 리퀘스트 diff에 줄 단위 커버리지 주석을 표시할 수 있습니다. 커버리지 시각화는 artifacts:reports:coverage_report 키워드를 사용합니다. Cobertura XML 형식은 원래 Java 용으로 개발되었지만, 대부분의 커버리지 프레임워크가 플러그인이나 내장 익스포터를 통해 이 형식을 지원합니다.
Cobertura XML 리포트를 사용하면 머지 리퀘스트 diff에 줄 단위 커버리지 주석을 표시할 수 있습니다. GitLab은 Cobertura XML 리포트를 읽어 변경된 각 줄을 커버됨(녹색), 커버되지 않음(빨간색), 로드되었지만 실행되지 않음(주황색)으로 표시합니다. GitLab은 파이프라인의 모든 stage에 있는 모든 job의 리포트를 포함합니다.
커버리지 시각화는 artifacts:reports:coverage_report
키워드를 사용합니다. 이 기능은 MR 위젯에 커버리지 비율을 표시하거나 커버리지 히스토리 그래프를 채우지 않습니다.
커버리지 비율을 표시하려면
coverage 키워드를 별도로 설정합니다.
Cobertura XML 형식은 원래 Java 용으로 개발되었지만, 대부분의 커버리지 프레임워크가 플러그인이나 내장 익스포터를 통해 이 형식을 지원합니다.
simplecov-cobertura(Ruby)gocover-cobertura(Go)cobertura(Node.js)- Istanbul (JavaScript)
- Coverage.py (Python)
- PHPUnit (PHP)
CI/CD 설정 예시#
다음 예시는 여러 프로그래밍 언어에서 CI/CD job을 설정하는 방법을 보여줍니다. 다음
coverage-report
데모 프로젝트에서도 실제로 동작하는 예시를 확인할 수 있습니다.
JavaScript 예시#
다음 .gitlab-ci.yml 예시는 Mocha와
nyc를 사용해 커버리지 아티팩트를 생성합니다.
test:
script:
- npm install
- npx nyc --reporter cobertura mocha
artifacts:
reports:
coverage_report:
coverage_format: cobertura
path: coverage/cobertura-coverage.xml
Java 및 Kotlin 예시#
GitLab 17.6 이상에서는 JaCoCo 형식을 네이티브로 지원합니다. 새 프로젝트에서는 네이티브 JaCoCo 리포트를 사용합니다.
다음 예시는 jacoco2cobertura Docker 이미지를 사용해 JaCoCo 리포트를 Cobertura 형식으로 변환합니다.
Maven 예시#
test-jdk11 job은 Maven을 사용해 JaCoCo XML
아티팩트를 생성합니다. coverage-jdk11 job은 이를 Cobertura 형식으로 변환합니다.
test-jdk11:
stage: test
image: maven:3.6.3-jdk-11
script:
- mvn $MAVEN_CLI_OPTS clean org.jacoco:jacoco-maven-plugin:prepare-agent test jacoco:report
artifacts:
paths:
- target/site/jacoco/jacoco.xml
coverage-jdk11:
# The `visualize` stage does not exist by default.
# Define it first, or use an existing stage like `deploy`.
stage: visualize
image: registry.gitlab.com/haynes/jacoco2cobertura:1.0.11
script:
# Convert report from JaCoCo to Cobertura, using relative project path
- python /opt/cover2cover.py target/site/jacoco/jacoco.xml $CI_PROJECT_DIR/src/main/java/
> target/site/cobertura.xml
needs: ["test-jdk11"]
artifacts:
reports:
coverage_report:
coverage_format: cobertura
path: target/site/cobertura.xml
Gradle 예시#
test-jdk11 job은 Gradle을 사용해 JaCoCo XML 아티팩트를 생성합니다.
coverage-jdk11 job은 이를 Cobertura 형식으로 변환합니다.
test-jdk11:
stage: test
image: gradle:6.6.1-jdk11
script:
- gradle test jacocoTestReport # JaCoCo must be configured to create an XML report
artifacts:
paths:
- build/jacoco/jacoco.xml
coverage-jdk11:
# The `visualize` stage does not exist by default.
# Define it first, or use an existing stage like `deploy`.
stage: visualize
image: registry.gitlab.com/haynes/jacoco2cobertura:1.0.11
script:
# Convert report from JaCoCo to Cobertura, using relative project path
- python /opt/cover2cover.py build/jacoco/jacoco.xml $CI_PROJECT_DIR/src/main/java/
> build/cobertura.xml
needs: ["test-jdk11"]
artifacts:
reports:
coverage_report:
coverage_format: cobertura
path: build/cobertura.xml
Python 예시#
다음 .gitlab-ci.yml 예시는 pytest-cov
를 사용해 테스트 커버리지 데이터를 수집합니다.
run tests:
stage: test
image: python:3
script:
- pip install pytest pytest-cov
- pytest --cov --cov-report term --cov-report xml:coverage.xml
artifacts:
reports:
coverage_report:
coverage_format: cobertura
path: coverage.xml
PHP 예시#
다음 .gitlab-ci.yml 예시는 PHPUnit
을 사용해 테스트 커버리지 데이터를 수집하고 리포트를 생성합니다.
최소한의 phpunit.xml 파일이 있으면
(이 예시 리포지터리를
참고할 수 있습니다) 테스트를 실행하고 coverage.xml을 생성할 수 있습니다.
run tests:
stage: test
image: php:latest
variables:
XDEBUG_MODE: coverage
before_script:
- apt-get update && apt-get -yq install git unzip zip libzip-dev zlib1g-dev
- docker-php-ext-install zip
- pecl install xdebug && docker-php-ext-enable xdebug
- php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
- php composer-setup.php --install-dir=/usr/local/bin --filename=composer
- composer install
- composer require --dev phpunit/phpunit phpunit/php-code-coverage
script:
- php ./vendor/bin/phpunit --coverage-text --coverage-cobertura=coverage.cobertura.xml
artifacts:
reports:
coverage_report:
coverage_format: cobertura
path: coverage.cobertura.xml
Codeception도 PHPUnit을 통해 run
명령으로 Cobertura 리포트를 생성하는 기능을 지원합니다.
생성되는 파일의 경로는 --coverage-cobertura 옵션과
paths 설정에 따라 달라지며,
이는 유닛 테스트 스위트에 대한 설정입니다. 적절한 경로에서
Cobertura를 찾도록 .gitlab-ci.yml을 설정합니다.
C/C++ 예시#
gcc 또는 g++를 사용하는 C/C++ 용 다음 .gitlab-ci.yml 예시는
gcovr을 사용해 Cobertura XML 형식의 커버리지 출력 파일을
생성합니다.
이 예시는 다음을 전제로 합니다.
Makefile은 이전 stage의 다른 job에서cmake가build디렉터리에 생성합니다.automake로Makefile을 생성하는 경우make test대신make check를 호출합니다.cmake(또는automake)가 컴파일러 옵션--coverage를 설정했습니다.
run tests:
stage: test
script:
- cd build
- make test
- gcovr --xml-pretty --exclude-unreachable-branches --print-summary -o coverage.xml --root ${CI_PROJECT_DIR}
artifacts:
name: ${CI_JOB_NAME}-${CI_COMMIT_REF_NAME}-${CI_COMMIT_SHA}
expire_in: 2 days
reports:
coverage_report:
coverage_format: cobertura
path: build/coverage.xml
Go 예시#
다음 .gitlab-ci.yml 예시는 다음을 사용합니다.
- 테스트 실행에는
go test를 사용합니다. - Go의 커버리지 프로파일을 Cobertura XML 형식으로 변환하는 데는
gocover-cobertura를 사용합니다.
이 예시는 Go 모듈을 사용한다고 전제합니다. -covermode count 옵션은
-race 플래그와 함께 동작하지 않습니다.
-race를 사용하면서 코드 커버리지를 생성하려면 더 느리지만 -covermode atomic으로 전환합니다.
run tests:
stage: test
image: golang:1.17
script:
- go install
- go test ./... -coverprofile=coverage.txt -covermode count
- go get github.com/boumenot/gocover-cobertura
- go run github.com/boumenot/gocover-cobertura < coverage.txt > coverage.xml
artifacts:
reports:
coverage_report:
coverage_format: cobertura
path: coverage.xml
Ruby 예시#
다음 .gitlab-ci.yml 예시는 다음을 사용합니다.
- 테스트 실행에는
rspec을 사용합니다. - 커버리지 프로파일을 기록하고 Cobertura XML 형식의 리포트를 생성하는 데는
simplecov와simplecov-cobertura를 사용합니다.
이 예시는 다음을 전제로 합니다.
bundler를 의존성 관리에 사용하며,Gemfile에rspec,simplecov,simplecov-cobertura가 추가되어 있습니다.spec_helper.rb의SimpleCov.formatters설정에CoberturaFormatter가 추가되어 있습니다.
run tests:
stage: test
image: ruby:3.1
script:
- bundle install
- bundle exec rspec
artifacts:
reports:
coverage_report:
coverage_format: cobertura
path: coverage/coverage.xml
문제 해결#
경로 확인 실패, 파일 크기 제한, 주석이 표시되지 않는 문제 등 커버리지 시각화 문제 해결에 대해서는 커버리지 시각화 문제 해결을 참고합니다.