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