Java 代码覆盖率统计
jacoco 基本使用命令介绍,offline 与 agent 模式。
Jacoco 配置
参考 https://www.jacoco.org/jacoco/trunk/doc/examples/build/pom-offline.xml 添加相关 build 配置。
org.example.App.java
package org.example;
/**
* Hello world!
*
*/
public class App
{
public static int a() {
return 1;
}
public static String b() {
return "2";
}
public static void main( String[] args )
{
System.out.println( "Hello World!" + App.b());
}
}
单测文件
package org.example;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
/**
* Unit test for simple App.
*/
public class AppTest
extends TestCase
{
/**
* 测试 App.a() 方法
*/
public void testA()
{
assertEquals(1, App.a());
}
}
Jacoco Offline 模式
本地 Test 覆盖
# 构建 & 执行 Test & 生成报告
$ mvn clean verify
# 打开报告
$ open ./target/site/jacoco/org.example/App.html
本地 Main 覆盖
# 编译并插桩代码
$ mvn clean package jacoco:instrument
# 执行代码,并生成执行结果文件
$ java -Djacoco-agent.destfile=target/jacoco.exec \
-cp target/classes:$HOME/.m2/repository/org/jacoco/org.jacoco.agent/0.8.14/org.jacoco.agent-0.8.14-runtime.jar \
org.example.App
# 恢复 class 文件
$ mvn jacoco:restore-instrumented-classes
# 生成报告
$ mvn jacoco:report
# 打开报告
$ open ./target/site/jacoco/org.example/App.html
Jar 文件覆盖
由于线上机器,一般都是 jar 存在,所以如何检测线上代码的覆盖,需要线上生成 jacoco.exec,然后放到线下来做对比
# 编译并插桩代码
$ mvn -DskipTests clean package jacoco:instrument
# 因为 jar 包生成,是最后一步,在此之前会被恢复掉,所以,jar 要重新生成
# 也可以合成一步,`mvn -DskipTests clean package jacoco:instrument jar:jar`
$ mvn jar:jar
# 执行代码,并生成执行结果文件
# 模拟线上运行
$ java -cp ./target/untitled-1.0-SNAPSHOT.jar:$HOME/.m2/repository/org/jacoco/org.jacoco.agent/0.8.14/org.jacoco.agent-0.8.14-runtime.jar \
org.example.App
本地验证代码,生成报告
# 本地编译 class 文件
$ mvn -DskipTests clean package
# 生成报告
$ mvn jacoco:report -Djacoco.dataFile=./jacoco.exec
# 打开报告
$ open ./target/site/jacoco/org.example/App.html
Jacoco Agent 模式
# 为避免 package 的影响,直接手动置顶流程
$ mvn clean compile jar:jar
# 启动 agent 模式
$ java -javaagent:$HOME/.m2/repository/org/jacoco/org.jacoco.agent/0.8.14/org.jacoco.agent-0.8.14-runtime.jar=destfile=./jacoco.exec,append=true \
-cp ./target/untitled-1.0-SNAPSHOT.jar \
org.example.App
# 生成报告
$ mvn jacoco:report -Djacoco.dataFile=./jacoco.exec
# 打开报告
$ open ./target/site/jacoco/org.example/App.html