初识 JACOCO

发布于 更新于
本文目录
  1. 1、什么是JaCoCo
  2. 2、什么是代码覆盖率
  3. 1. 行覆盖
  4. 2. 类覆盖
  5. 3. 方法覆盖
  6. 4. 分支覆盖
  7. 5. 指令覆盖
  8. 6. 圈复杂度
  9. 3、代码覆盖率意义
  10. 4、覆盖率的误区
  11. 5、JaCoCo原理
  12. 1. on-the-fly模式
  13. 2. offline模式
  14. 3.on-the-fly和offline对比

技术文章自动化测试

JaCoCo 是一个免费、开源Java 代码覆盖率工具。

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

继续阅读