一、为什么需要测试覆盖率
1.1 在日常研发过程中,经常发现一些问题
-
测试案例的设计凭经验,当研发一个新功能时,经常对测试场景估计不足,到上线后发现bug;
-
开发经常做一些需求之外的代码变更(代码小范围内重构或在开发过程中发现小缺陷随手改掉),导致测试任务无法测试到对应的场景,引起线上问题;
-
对测试效果无法量化考核,导致测试工作的质量无法进一步提升。
1.2. 有没有技术手段能够尽可能的避免上面的问题呢?
在业内已经在普遍使用代码覆盖率来提升测试质量,那什么是代码覆盖率?
代码覆盖率是软件测试中的一种度量,描述程序中源代码被测试的比例和程度,所得比例称为代码覆盖率 。
代码覆盖率指标通常包含下面几类:
-
函数/方法覆盖率:函数/方法中有多少被调用到
-
分支覆盖率:有多少控制结构的分支(例如if语句)被执行
-
条件覆盖率:有多少布尔子表达式被测试为真值和假值
-
行覆盖率:有多少行的源代码被测试过
1.3 在使用测试覆盖率的过程中,经常发现的场景
-
if/else语句中,if{}内的代码被覆盖到,else{}内的代码没有被覆盖到,可以得出部分分支场景没有测试到;
-
try/catch语句中,try{}内的代码被覆盖到,catch{}内的代码没有被覆盖到,可以得出异常场景没有测试到;
-
if (条件1 || 条件2 || 条件3)语句中,条件1被覆盖到,条件2和条件3没有被覆盖到,可以得出部分条件场景没有测试到;
测试人员对代码覆盖率的指标正确使用,能有效提升测试的质量,进而提升版本的上线质量。
二、JaCoCo在测试覆盖率场景中的使用
2.1 JaCoCo介绍
当前主流的代码覆盖率工具:
C/C++→Gcov ,Java→JaCoCo,JavaScript→ Istanbul。
考虑到服务器端主要是Java语言,所以CICD平台优先使用JaCoCo来支持 Java 语言的代码覆盖率统计能力。
通过JaCoCo官网,我们可以看到JaCoCo的使命是为Java VM 的环境中的代码覆盖分析提供标准技术。重点是提供一个轻量级、灵活且有据可查的库,用于与各种构建和开发工具集成。
2.2 JaCoCo优点
-
JaCoCo支持指令(C0)、分支(C1)、行、方法、类和圈复杂度等多维度的覆盖分析;
-
基于 Java 字节码,也可以在没有源文件的情况下工作;
-
性能良好,运行时开销很小,尤其是对于大型项目;
-
比较完整的API,很方便与其他工具进行集成;
-
远程协议和 JMX 控制可在任何时间点从代理请求执行数据下载。
2.3 JaCoCo原理
主要来自于JaCoCo官方网站
JaCoCo支持几种不同的方法来收集覆盖信息,对于每种方法,由不同技术实现的,下图橙色路径部分是JaCoCo 推荐使用的方式,即通过On-The-Fly方式收集覆盖率信息: