Help us learn about your current experience with the documentation. Take the survey.

JaCoCo 覆盖率报告

  • 版本:Free, Premium, Ultimate
  • 产品形态:GitLab.com, GitLab Self-Managed, GitLab Dedicated

留下您的反馈

要使 JaCoCo 覆盖率报告正常工作,您必须生成一个格式正确的 JaCoCo XML 文件,该文件需提供行覆盖率信息。

JaCoCo 覆盖率报告的可视化功能支持:

覆盖率信息会显示在合并请求的差异视图中,并通过以下指标来展示:

  • 已覆盖的指令(绿色):包含至少一条已覆盖指令的代码行 (ci > 0)
  • 未覆盖的指令(红色):没有任何已覆盖指令的代码行 (ci = 0)
  • 无覆盖率信息:未被包含在覆盖率报告中的代码行

例如,对于以下报告输出:

<line nr="83" mi="2" ci="0" mb="0" cb="0"/>
<line nr="84" mi="2" ci="0" mb="0" cb="0"/>
<line nr="85" mi="2" ci="0" mb="0" cb="0"/>
<line nr="86" mi="2" ci="0" mb="0" cb="0"/>
<line nr="88" mi="0" ci="7" mb="0" cb="1"/>

合并请求的差异视图会如下显示覆盖率:

Merge request diff view showing coverage indicators with red bars for uncovered lines and green bars for covered lines.

在此示例中,第 83-86 行显示红色条表示未覆盖的代码,第 88 行显示绿色条表示已覆盖的代码,而第 87、89-90 行则没有覆盖率数据。

添加 JaCoCo 覆盖率作业

要配置您的流水线以生成覆盖率报告,请在您的 .gitlab-ci.yml 文件中添加一个作业。例如:

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:
    reports:
      coverage_report:
        coverage_format: jacoco
        path: target/site/jacoco/jacoco.xml

在此示例中,mvn 命令会生成 JaCoCo 覆盖率报告。path 指向生成的报告文件。

如果作业生成了多个报告,请在产物路径中使用通配符

相对文件路径修正

文件路径转换

JaCoCo 报告提供的是相对文件路径,但覆盖率报告的可视化需要绝对路径。GitLab 会尝试使用相关合并请求中的数据,将相对路径转换为绝对路径。

路径匹配过程如下:

  1. 查找所有与同一流水线引用关联的合并请求。
  2. 对于所有发生变更的文件,找出其所有绝对路径。
  3. 对于报告中的每个相对路径,使用第一个匹配的绝对路径。

此过程并非总能找到合适的匹配绝对路径。

多模块或源代码目录

当多个模块或源代码目录中存在同名文件时,默认情况下可能无法找到绝对路径。

例如,如果合并请求中变更了以下文件,GitLab 将无法找到其绝对路径:

  • src/main/java/org/acme/DemoExample.java
  • src/main/other-module/org/acme/DemoExample.java

要使路径转换成功,您必须确保相对路径中存在一些独特的差异。例如,您可以修改其中一个文件或目录的名称:

  • 修改文件名:

    src/main/java/org/acme/DemoExample.java
    - src/main/other-module/org/acme/DemoExample.java
    + src/main/other-module/org/acme/OtherDemoExample.java
    
  • 修改路径:

    src/main/java/org/acme/DemoExample.java
    - src/main/other-module/org/acme/DemoExample.java
    + src/main/other-module/org/other-acme/DemoExample.java
    

只要完整的相对路径是唯一的,您也可以添加一个新目录。

故障排除

并非所有已变更文件都显示指标

如果您从同一源分支创建了一个新的合并请求,但目标分支不同,那么指标可能无法正确显示。

作业不会考虑新合并请求的差异,因此不会为未包含在其他合并请求差异中的文件显示任何指标。即使生成的覆盖率报告包含了指定文件的指标,也会发生这种情况。

要解决此问题,请等待新的合并请求创建完成,然后重新运行您的流水线或启动一个新的流水线。这样,新的合并请求就会被纳入考量。