Jacoco原理
2020-03-07 本文已影响0人
爱读书的夏夏
Jacoco使用插桩的方式来记录覆盖率数据,是通过一个probe探针来注入。
插桩模式有两种:
1. on-the-fly模式
JVM通过 -javaagent参数指定jar文件启动代理程序,代理程序在ClassLoader装载一个class前判断是否修改class文件,并将探针插入class文件,探针不改变原有方法的行为,只是记录是否已经执行。
2. offline模式
在测试之前先对文件进行插桩,生成插过桩的class或jar包,测试插过桩的class和jar包,生成覆盖率信息到文件,最后统一处理,生成报告。
on-the-fly和offline对比
on-the-fly更方便简单,无需提前插桩,无需考虑classpath设置问题。
以下情况不适合使用on-the-fly模式:
(1)不支持javaagent
(2)无法设置JVM参数
(3)字节码需要被转换成其他虚拟机
(4)动态修改字节码过程和其他agent冲突
(5)无法自定义用户加载类
Java方法的控制流分析
官方文档在这里:https://www.jacoco.org/jacoco/trunk/doc/flow.html
Jacoco的使用分为三部分,第一部分是注入并采集,第二部分是导出,第三部分是生成报告,三部分可以分开执行。
(1)首先在被测程序的启动命令行中加上-javaagent选项,指定jacocoagent.jar作为代理程序。
Jacoco agent搜集执行信息并且在请求或者JVM退出的时候导出数据。有三种不同的导出数据模式:
- 文件系统:JVM停止时,数据被导出到本地文件
- TCP socket Server:监听端口连接,通过socket连接获取到执行数据。在VM退出时,可选择进行数据重置和数据导出。
- TCP socket Client:启动时,Jacoco agent连接到一个给定的TCP端,请求时执行数据写到socket,在VM退出时,可选择进行数据重置和数据导出。
(2)导出数据,假如指定导出模式为tcpserver,那么我们需要启动一个client来请求覆盖率文件数据。