1、什么是JaCoCo
JaCoCo 是一个免费、开源Java 代码覆盖率工具。
2、什么是代码覆盖率
覆盖率是用来衡量测试代码对功能代码的测试情况,通过统计测试代中对功能代码中行、分支、类等模拟场景数量,来量化说明测试的充分度。代码覆盖率=代码的覆盖程度,一种度量方式。
覆盖率简单说:跑了一个测试用例,项目代码中哪些模块、文件、类、方法、行执行了。
其中行覆盖率是最细粒度,其他覆盖率都可从行覆盖情况计算出来。
1. 行覆盖
当至少一个指令被指定源码行执行时,该源码行被认为已执行。
2. 类覆盖
当一个类至少有一个方法已执行,则该类被认为已执行,包括构造函数和静态初始化方法。
3. 方法覆盖
当方法中至少有一个指令被执行,该方法被认为已执行,包括构造函数和静态初始化方法。
4. 分支覆盖
if和switch语句算作分支覆盖率,这个指标计算一个方法中的分支总数,并决定已执行和未执行的分支的数量。
全部未覆盖:所有分支均未执行,红色标志
部分覆盖:部分分支被执行,黄色标志
全覆盖:所有分支均已执行,绿色标志
5. 指令覆盖
指令覆盖最小单元是Java字节码指令,指令覆盖率提供了代码是否被执行的信息,它为执行/未执行代码提供了大量的信息。
6. 圈复杂度
在(线性)组合中,计算在一个方法里面所有可能路径的最小数目。可以作为度量单元测试是否完全覆盖所有场景的一个依据。
3、代码覆盖率意义
分析未覆盖部分的代码,反推测试设计是否充分,没有覆盖到的代码是否存在测试设计盲点。
4、覆盖率的误区
若代码如下:
if (i > 100)
j = 10 / i // 没有除零错误
else
j = 10 / (i + 2) // i==-2除零错误
覆盖两个分支只需i == 101和 i == 1 ,但对于找到i == -2没有作用。
所以:
- 不要简单的追求高的代码覆盖率
- 高覆盖测试用例不等于测试用例有用
- 没覆盖的分支相当于该分支上的任何错误肯定都测不到
5、JaCoCo原理
JaCoCo使用插桩的方式来记录覆盖率数据,是通过一个probe探针来注入。
插桩模式有两种:
1. on-the-fly模式
JVM中通过-javaagent参数指定特定的jar文件启动Instrumentation的代理程序,代理程序在通过Class Loader装载一个class前判断是否转换修改class文件,将统计代码插入class,测试覆盖率分析可以在JVM执行测试代码的过程中完成。
2. offline模式
在测试之前先对文件进行插桩,生成插过桩的class或jar包,测试插过桩的class和jar包,生成覆盖率信息到文件,最后统一处理,生成报告。
3.on-the-fly和offline对比
on-the-fly更方便简单,无需提前插桩,无需考虑classpath设置问题。
存在以下情况不适合使用on-the-fly模式:
- 不支持javaagent
- 无法设置JVM参数
- 字节码需要被转换成其他虚拟机
- 动态修改字节码过程和其他agent冲突
- 无法自定义用户加载类
欢迎来到testingpai.com!
注册 关于