1、测试覆盖率

测试覆盖率分为:需求覆盖率、代码覆盖率

需求覆盖:指的是测试人员对需求的了解程度,根据需求的可测试性来拆分成各个子需求点,来编写相应的测试用例,最终建立一个需求和用例的映射关系,以用例的测试结果来验证需求的实现,可以理解为黑盒覆盖。

代码覆盖:为了更加全面的覆盖,我们可能还需要理解被测程序的逻辑,需要考虑到每个函数的输入与输出,逻辑分支代码的执行情况,这个时候我们的测试执行情况就以代码覆盖率来衡量,可以理解为白盒覆盖。

这两者完全可以相辅相成,用代码覆盖结果反向的检查需求覆盖(用例)的测试是否充分完整

2、代码覆盖率测试工具jacoco

官网的介绍如下:
JaCoCo应该为基于Java VM的环境中的代码覆盖率分析提供标准技术。重点是提供一个轻量级,灵活且文档齐全的库,以与各种构建和开发工具集成。

 Jacoco可以嵌入到Ant 、Maven中,并提供了EclEmma Eclipse插件,也可以使用JavaAgent技术监控Java程序。很多第三方的工具提供了对Jacoco的集成,如sonar、Jenkins等。

3、覆盖率计数器

行覆盖率(Lines):度量被测程序的每行代码是否被执行,判断标准行中是否至少有一个指令被执行。

红色标志:该行中指令均未执行
黄色标志:该行中部分指令执行
绿色标志:该行中所有指令已执行

类覆盖率(classes):度量计算class类文件是否被执行。

分支覆盖率(Branch):度量if和switch语句的分支覆盖情况,计算一个方法里面的总分支数,确定执行和不执行的 分支数量。

方法覆盖率(method):度量被测程序的方法执行情况,是否执行取决于方法中是否有至少一个指令被执行。

指令覆盖(Instruction):计数单元是单个java二进制代码指令,指令覆盖率提供了代码是否被执行的信息,度量完全 独立源码格式。

圈复杂度(complexity):在(线性)组合中,计算在一个方法里面所有可能路径的最小数目,缺失的复杂度同样表示测 试案例没有完全覆盖到这个模块。

java 代码覆盖率 原理 代码覆盖率 jacoco_字节码

 如上图所示,报告中会按照以上几个维度生成报告。

4、jacoco原理

Jacoco使用插桩的方式来记录覆盖率数据,是通过一个probe探针来注入

  • On-the-fly插桩

JVM中通过-javaagent参数指定特定的jar文件启动Instrumentation的代理程序,代理程序在通过Class Loader装载一个class前判断是否转换修改class文件,将统计代码插入class,测试覆盖率分析可以在JVM执行测试代码的过程中完成。

  • Offline模式

在测试前先对文件进行插桩,然后生成插过桩的class或jar包,测试插过桩 的class和jar包后,会生成动态覆盖信息到文件,最后统一对覆盖信息进行处理,并生成报告。 

  • On-the-fly和offline比较

On-the-fly模式更方便简单进行代码覆盖分析,无需提前进行字节码插桩,无需考虑classpath 的设置。

存在如下情况不适合on-the-fly,需要采用offline提前对字节码插桩:

  • 运行环境不支持java agent。
  • 部署环境不允许设置JVM参数。
  • 字节码需要被转换成其他的虚拟机如Android Dalvik VM。
  • 动态修改字节码过程中和其他agent冲突。
  • 无法自定义用户加载类。

下篇记录jacoco+mave+jenkins的搭建