Jacoco 入门使用

一、背景

1. 为什么需要代码覆盖率

  • 反推测试用例是否全面
  • 研发代码本身设计是否冗余

2. 原理

通过ASM在字节码中插入探针,每个探测指针都是一个BOOL变量(true表示执行、false表示没有执行),程序运行时通过改变指针的结果来检测代码的执行情况(不会改变原代码的行为)

3. 插桩方式

  • on-the-fly
  • offline
  • 两者区别

1.on-the-fly不会改变jar包大小,offline会改变jar包大小
2.offline必须退出虚拟机时才能生成覆盖率结果
3.on-the-fly模式官方推荐是首选,on the fly模式适合一些环境及客观原因导致不能使用时
在这里插入图片描述

二、项目实战

on the fly模式(运行时插桩)

1. 原理

1.1 利用Jacocoagent.jar在内存中动态修改class字节码

运用java Agent的机制(JaCoCo提供了自己的Agent),启动Instrumentation代理程序,代理程序在ClassLoader装载一个class前先判断是否需要对class进行注入,对于需要注入的class进行注入,动态改变字节码结构,插入 Jacoco 的探针

1.2 dump输出覆盖率结果(.exec文件)

信息可以通过文件或是Tcp的形式输出,还提供了丰富的dump输出机制,如File,Tcp Server,Tcp Client。

2. 配置执行

2.1 环境准备

2.2 以jacoco代理方式启动被测服务

2.2.1 参数说明

官网给出的JVM参数运行JacocoAgent如下:

-javaagent:[yourpath/]jacocoagent.jar=[option1]=[value1],[option2]=[value2]
参数名 描述 默认值
destfile 覆盖率结果保存路径 jacoco.exec
datafile 覆盖率merge结果保存路径 -
includes 分析文件的路径 ,支持通配符 * (所有)
excludes 该路径下的文件不被统计 empty
dumponexit 虚拟机退出时是否dump文件 true
output 结果输出的方式:file或tcpserver或tcpclient file
address tcp对应的ip地址 loopback interface
port tcp对应的端口号 6300
2.2.2 多种方式启动服务

企业里有多种方式启动服务,如:
Ant、Maven 插件启动、命令行(Java -jar)启动、Tomcat 启动 war 包
针对多种方式,分别列出,选出适合自己当前项目的即可

方式一:命令行
java -javaagent:$JacocoAgentPath=includes=*,output=TCPserver,port=2000,address=192.168.110.22" -jar apache-jmeter-5.4.1/bin/ApacheJMeter.jar
方式二:maven插件启动

maven方式也有2种
1.pom.xml中配置插件

<plugin>
  <groupId>org.jacoco</groupId>
  <artifactId>jacoco-maven-plugin</artifactId>
  <version>0.8.7-SNAPSHOT</version>
  <executions>
  	<execution>
		<goals>
			<goal>dump</goal>
			<goal>report</goal>
			<goal>merge</goal>
		<goals>
	</execution>
  <executions/>
  <reportSets>
          <reportSet>
            <reports>
              <!-- select non-aggregate reports -->
              <report>report</report>
            </reports>
          </reportSet>
  </reportSets>
</plugin>
  1. 直接通过命令行
mvn clean install
export MAVEN_OPTS="-javaagent:$JacocoAgentPath=includes=*,output=TCPserver,port=2000,address=127.0.0.1”
mvn spring-boot:run -Dport=8081

如果其他maven项目不用jacoco,记得把MAVEN_OPTS设为""

方式三:tomcat启动

修改bin/catalina.sh

JAVA_OPTS="$JAVA_OPTS -javaagent:$JacocoAgentPath=includes=*,output=TCPserver,port=2000,address=192.168.110.22"

2.3 生成有源码的报告

java -jar org.jacoco.cli-0.8.6-nodeps.jar report jacoco.exec --classfiles apache-jmeter-5.4.1/bin/ApacheJMeter.jar --html jacoco_html_src --sourcefiles apache-jmeter-5.4.1_src/apache-jmeter-5.4.1/src/launcher/src/main/java/

jacoco-cli命令详解

offline模式(编译时插桩)

1.适用场景

当一些环境及客观原因导致不能使用on the fly模式,如:

  • 环境不支持Java agents
  • 无法配置JVM参数
  • 字节码需要被转换为其他的VM,比如Android Dalvik VM.
  • 和其他代理冲突

2.配置执行

2.1 环境准备

(1)jacocoagent配置到环境变量中
(2)在项目中配置jacoco的相关配置文件

  • jacoco-agent.xxxx,如jacoco-agent.destfile

猜你喜欢

转载自blog.csdn.net/dabaoting/article/details/114257835