代码覆盖率以及jacoco统计代码覆盖率的原理

一、什么是代码覆盖率

简单来说,代码覆盖率是指,至少被执行了一次的条目数占整个条目数的百分比。
如果“条目数”是语句,对应的就是代码行覆盖率;如果“条目数”是函数,对应的就是函
数覆盖率;如果“条目数”是路径,那么对应的就是路径覆盖率。依此类推,你就可以得到
绝大多数常见的代码覆盖率类型的定义。

二、常用的代码覆盖率

简单介绍一下最常用的三种代码覆盖率指标

行覆盖率又称为语句覆盖率,指已经被执行到的语句占总可执行语句(不包含类似 C++
的头文件声明、代码注释、空行等等)的百分比。这是最常用也是要求最低的覆盖率指
标。实际项目中通常会结合判定覆盖率或者条件覆盖率一起使用。


分支覆盖又称判定覆盖,用以度量程序中每一个判定的分支是否都被测试到了,即代码中
每个判断的取真分支和取假分支是否各被覆盖至少各一次。比如,对于 if(a>0 &&
b>0),就要求覆盖“a>0 && b>0”为 TURE 和 FALSE 各一次。


条件覆盖是指,判定中的每个条件的可能取值至少满足一次,度量判定中的每个条件的结
果 TRUE 和 FALSE 是否都被测试到了。比如,对于 if(a>0 && b>0),就要
求“a>0”取 TRUE 和 FALSE 各一次,同时要求“b>0”取 TRUE 和 FALSE 各一次。

三、代码覆盖率的作用

代码覆盖率的价值 现在很多项目都在单元测试以及集成测试阶段统计代码覆盖率,但是我想说的是,统计代码覆盖率仅仅是手段,你必须透过现象看到事物的本质,才能从根本上保证软件整体的质量。统计代码覆盖率的根本目的是找出潜在的遗漏测试用例,并有针对性的进行补充,同时还可
以识别出代码中那些由于需求变更等原因造成的不可达的废弃代码

即使你所设计的测试用例已经达到 100% 的代码覆盖率(包括行覆盖、分支覆盖、条件覆盖等),软件产品的质量也做不到万无一失,举例来说,从业务场景出发考虑,测试数据A覆盖场景a执行了被测代码没有发现bug,但是其实这段被测代码还有业务场景b没有被测试,此时测试数据B同样执行这段相同的代码,发现了代码bug。可见100%的代码覆盖率并不能保证不会遗漏测试用例。还得需要考虑业务场景的覆盖率。

总结来讲,高的代码覆盖率不一定能保证软件的质量,但是低的代码覆盖率一定不能能保证软件的质量。

四、jacoco统计覆盖率原理

Jacoco 是一个开源的覆盖率工具,针对的语言为java。它可以嵌入到Ant 、Maven中,也提供了EclEmma Eclipse插件。Jacoco主要通过代码注入(即Java Agent)方式来实现覆盖率的功能。

很多第三方的工具提供了对 Jacoco 的集成,如:Sonar、Jenkins、IDEA,下载地址:https://www.eclemma.org/jacoco/

Jacoco支持多种覆盖率的统计,包括:

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

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

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

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

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

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

JaCoCo增量覆盖率的基本实现原理

vivo 基于 JaCoCo 的测试覆盖率设计与实践 - 知乎

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值