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):在(线性)组合中,计算在一个方法里面所有可能路径的最小数目,缺失的复杂度同样表示测 试案例没有完全覆盖到这个模块。
如上图所示,报告中会按照以上几个维度生成报告。
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的搭建