You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

执行mvn jacoco:report后,如何在控制台输出Jacoco覆盖率百分比?

如何将Jacoco覆盖率百分比输出到控制台(适配Jenkins环境)

我来分享几个实用的方案,帮你把Jacoco的覆盖率数据直接输出到控制台,完美适配Jenkins环境:

方案一:用Groovy脚本解析Jacoco XML报告输出

这种方法灵活性最高,能自定义输出你关心的任何覆盖率指标(行、类、方法等),步骤如下:

  1. 在你的pom.xml中添加groovy-maven-plugin,配合Jacoco插件一起使用:
<build>
    <plugins>
        <!-- 基础Jacoco配置,确保生成报告文件 -->
        <plugin>
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
            <version>0.8.10</version>
            <executions>
                <execution>
                    <goals>
                        <goal>prepare-agent</goal>
                    </goals>
                </execution>
                <execution>
                    <id>report</id>
                    <phase>test</phase>
                    <goals>
                        <goal>report</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <!-- Groovy插件:解析Jacoco XML报告并打印到控制台 -->
        <plugin>
            <groupId>org.codehaus.gmaven</groupId>
            <artifactId>groovy-maven-plugin</artifactId>
            <version>2.1.1</version>
            <executions>
                <execution>
                    <id>print-coverage-details</id>
                    <phase>post-test</phase> <!-- 在test阶段后执行 -->
                    <goals>
                        <goal>execute</goal>
                    </goals>
                    <configuration>
                        <source>
                            // 读取Jacoco生成的XML报告
                            def jacocoXml = new XmlSlurper().parse(new File("target/site/jacoco/jacoco.xml"))
                            
                            // 提取行覆盖率
                            def lineCounter = jacocoXml.counter.find { it.@type == "LINE" }
                            def coveredLines = lineCounter.@covered.toInteger()
                            def totalLines = lineCounter.@missed.toInteger() + coveredLines
                            def lineCoverageRate = String.format("%.2f", (coveredLines * 100.0) / totalLines)
                            
                            // 提取类覆盖率
                            def classCounter = jacocoXml.counter.find { it.@type == "CLASS" }
                            def coveredClasses = classCounter.@covered.toInteger()
                            def totalClasses = classCounter.@missed.toInteger() + coveredClasses
                            def classCoverageRate = String.format("%.2f", (coveredClasses * 100.0) / totalClasses)
                            
                            // 控制台输出格式化后的覆盖率信息
                            println "\n=== Jacoco Coverage Summary ==="
                            println "Total Lines: ${totalLines} | Covered Lines: ${coveredLines} | Line Coverage: ${lineCoverageRate}%"
                            println "Total Classes: ${totalClasses} | Covered Classes: ${coveredClasses} | Class Coverage: ${classCoverageRate}%"
                            println "===============================\n"
                        </source>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
  1. 执行构建命令:
mvn clean test

执行后,你就能在控制台看到清晰的覆盖率汇总了。如果已经生成了Jacoco报告,也可以单独执行Groovy脚本:

mvn groovy:execute@print-coverage-details

方案二:利用Jacoco的check目标输出覆盖率

如果不需要自定义格式,用Jacoco自带的check目标就能快速输出覆盖率数据,还能在Jenkins里直接看到:

  1. 调整Jacoco插件配置,添加check执行目标:
<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.8.10</version>
    <executions>
        <execution>
            <goals>
                <goal>prepare-agent</goal>
            </goals>
        </execution>
        <execution>
            <id>report</id>
            <phase>test</phase>
            <goals>
                <goal>report</goal>
            </goals>
        </execution>
        <execution>
            <id>check-coverage</id>
            <phase>test</phase>
            <goals>
                <goal>check</goal>
            </goals>
            <configuration>
                <rules>
                    <!-- 设置最低覆盖率要求为0,避免因覆盖率不达标导致构建失败 -->
                    <rule>
                        <element>BUNDLE</element>
                        <limits>
                            <limit>
                                <counter>LINE</counter>
                                <value>COVEREDRATIO</value>
                                <minimum>0.0</minimum>
                            </limit>
                        </limits>
                    </rule>
                </rules>
                <failOnViolation>false</failOnViolation>
            </configuration>
        </execution>
    </executions>
</plugin>
  1. 执行命令:
mvn clean jacoco:check

控制台会输出类似这样的信息:

[INFO] --- jacoco-maven-plugin:0.8.10:check (check-coverage) @ your-project ---
[INFO] Loading execution data file /your-project/target/jacoco.exec
[INFO] Analyzed bundle 'your-project' with 15 classes
[INFO] Bundle your-project: 78.5% covered lines (110/140), 80% covered classes (12/15)
[INFO] All coverage checks passed.

方案三:Jenkins中直接用Shell/Batch解析CSV报告

如果你的Jenkins构建是基于Shell或Batch命令,还可以直接读取Jacoco生成的CSV报告(路径:target/site/jacoco/jacoco.csv),用简单的命令提取覆盖率:

Linux/macOS(Shell命令):

在Jenkins的构建步骤中添加以下命令(放在mvn jacoco:report之后):

# 提取行覆盖率
LINE_COVERAGE=$(awk -F ',' '/Total/{print $4}' target/site/jacoco/jacoco.csv)
# 提取类覆盖率
CLASS_COVERAGE=$(awk -F ',' '/Total/{print $2}' target/site/jacoco/jacoco.csv)

echo "=== Jacoco Coverage (Jenkins) ==="
echo "Line Coverage: ${LINE_COVERAGE}%"
echo "Class Coverage: ${CLASS_COVERAGE}%"

Windows(Batch命令):

for /f "tokens=2,4 delims=," %%a in ('findstr "Total" target\site\jacoco\jacoco.csv') do (
    echo === Jacoco Coverage (Jenkins) ===
    echo Class Coverage: %%a%%
    echo Line Coverage: %%b%%
)

执行后,Jenkins的控制台输出里就会显示覆盖率数据了。


内容的提问来源于stack exchange,提问作者niraj.nijju

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:07:28