GitLab Cobertura 覆盖率可视化

适用版本层级: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 许可;本文为中文翻译,译文沿用相同许可,保留原始出处与署名。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容