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模式官方推荐是首选,offline模式适合一些环境及客观原因导致不能使用时
二、项目实战
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。