适用版本层级:Free、Premium、Ultimate。适用服务:GitLab.com、GitLab Self-Managed、GitLab Dedicated。
使用 Cobertura XML 报告,可以在合并请求差异中显示逐行覆盖率注释。GitLab 读取报告,将修改行标记为已覆盖(绿色)、未覆盖(红色),或已加载但从未执行(橙色)。
GitLab 会纳入流水线任意阶段、任意作业生成的报告。覆盖率可视化使用 artifacts:reports:coverage_report 关键字,不会在合并请求组件中显示覆盖率百分比,也不会填充覆盖率历史图表。要显示百分比,需要另外配置 coverage 关键字。
Cobertura XML 最初为 Java 开发,但多数覆盖率框架都通过插件或内置导出器支持它,包括 Ruby 的 simplecov-cobertura、Go 的 gocover-cobertura、Node.js 的 cobertura、JavaScript 的 Istanbul、Python 的 Coverage.py 和 PHP 的 PHPUnit。
CI/CD 配置示例
以下展示不同语言的作业配置。GitLab 的 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 作业用 Maven 生成 JaCoCo XML 制品,coverage-jdk11 将其转换为 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 作业使用 Gradle 生成 JaCoCo XML 制品,再由 coverage-jdk11 转换:
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
以下示例使用 PHPUnit 收集覆盖率并生成报告。准备最小的 phpunit.xml 文件后,即可运行测试并生成覆盖率 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 配置。请在 .gitlab-ci.yml 中填写对应的 Cobertura 文件路径。
C/C++
以下针对 gcc 或 g++ 的示例,使用 gcovr 生成 Cobertura XML 覆盖率文件。它假定:
- 前一阶段的另一个作业已通过 cmake 在
build目录创建 Makefile。如果使用 automake,应调用make check,而不是make test。 - 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
以下示例使用 go test 执行测试,再用 gocover-cobertura 将 Go 覆盖率文件转换为 Cobertura XML。
示例假定使用 Go modules。-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
以下示例使用 rspec 执行测试,并使用 simplecov 与 simplecov-cobertura 记录覆盖率、创建 Cobertura XML 报告。它假定:
- 使用 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
故障排查
路径解析失败、文件大小限制或注释未显示等问题,请参阅 GitLab 覆盖率可视化故障排查文档。
原文:Cobertura coverage visualization。作者/维护方:GitLab 文档维护者。本文为中文翻译,代码及命令保留原文。
原文页面标示 CC BY-SA 4.0 许可;本文为中文翻译,译文沿用相同许可,保留原始出处与署名。











暂无评论内容