在做单元测试时,代码覆盖率常常被拿来作为衡量测试好坏的指标,甚至,用代码覆盖率来考核测试任务完成情况,比如,代码覆盖率必须达到80%或 90%。于是乎,测试人员费尽心思设计案例覆盖代码。用代码覆盖率来衡量,有利也有有弊。本文我们就代码覆盖率展开讨论,也欢迎同学们踊跃评论。
首先,让我们先来了解一下所谓的“代码覆盖率”。我找来了所谓的定义:
代码覆盖率 = 代码的覆盖程度,一种度量方式。
上面简短精悍的文字非常准确的描述了代码覆盖率的含义。而代码覆盖程度的度量方式是有很多种的,这里介绍一下最常用的几种:
1. 语句覆盖(StatementCoverage)
又称行覆盖(LineCoverage),段覆盖(SegmentCoverage),基本块覆盖(BasicBlockCoverage),这是最常用也是最常见的一种覆盖方式,就是度量被测代码中每个可执行语句是否被执行到了。这里说的是“可执行语句”,因此就不会包括像C++的头文件声明,代码注释,空行,等等。非常好理解,只统计能够执行的代码被执行了多少行。需要注意的是,单独一行的花括号{}也常常被统计进去。语句覆盖常常被人指责为“最弱的覆盖”,它只管覆盖代码中的执行语句,却不考虑各种分支的组合等等。假如你的上司只要求你达到语句覆盖,那么你可以省下很多功夫,但是,换来的确实测试效果的不明显,很难更多地发现代码中的问题。
这里举一个不能再简单的例子,我们看下面的被测试代码:
int foo(int a, int b)
{
return a / b;
}
假如我们的测试人员编写如下测试案例:
TeseCase: a = 10, b = 5
测试人员的测试结果会告诉你,他的代码覆盖率达到了100%,并且所有测试案例都通过了。然而遗憾的是,我们的语句覆盖率达到了所谓的100%,但是却没有发现最简单的Bug,比如,当我让b=0时,会抛出一个除零异常。
正因如此,假如上面只要求测试人员语句覆盖率达到多少的话,测试人员只要钻钻空子,专门针对如何覆盖代码行编写测试案例,就很容易达到主管的要求。当然了,这同时说明了几个问题:
1)主管只使用语句覆盖率来考核测试人员本身就有问题。
2)测试人员的目的是为了测好代码,钻如此的空子是缺乏职业道德的。
3)是否应该采用更好的考核方式来考核测试人员的工作?
为了寻求更好的考核标准,我们必须先了解完代码覆盖率到底还有哪些,如果你的主管只知道语句覆盖,行覆盖,那么你应该主动向他介绍还有更多的覆盖方式。比如:
2. 判定覆盖(DecisionCoverage)
又称分支覆盖(BranchCoverage),所有边界覆盖(All-EdgesCoverage),基本路径覆盖 (BasicPathCoverage),判定路径覆盖(Decision-Decision-Path)。它度量程序中每一个判定的分支是否都被测试到了。这句话是需要进一步理解的,应该非常容易和下面说到的条件覆盖混淆。因此我们直接介绍第三种覆盖方式,然后和判定覆盖一起来对比,就明白两者是怎么回事了。
3. 条件覆盖(ConditionCoverage)
它度量判定中的每个子表达式结果true和false是否被测试到了。
为了说明判定覆盖和条件覆盖的区别,我们来举一个例子,假如我们的被测代码如下:
int foo(int a, int b)
{
if (a < 10 || b < 10) // 判定
{
return 0; // 分支一
}
else
{
return 1; // 分支二
}
}
设计判定覆盖案例时,我们只需要考虑判定结果为true和false两种情况,因此,我们设计如下的案例就能达到判定覆盖率100%:
TestCaes1: a = 5, b = 任意数字 覆盖了分支一
TestCaes2: a = 15, b = 15 覆盖了分支二
设计条件覆盖案例时,我们需要考虑判定中的每个条件表达式结果,为了覆盖率达到100%,我们设计了如下的案例:
TestCase1: a = 5, b = 5 true, true
TestCase4: a = 15, b = 15 false, false
分享到:
相关推荐
单元测试的代码覆盖率至少80%!一大早,一个年轻的程序员问大师:“我准备写一些单元测试用例。代码覆盖率应该达到多少为好?”大师回答道:“不要考虑代码覆盖率,只要写出一些好的测试用例即可。” 一大早,一个...
windows平台下C/C++代码覆盖率检查工具
代码覆盖率是反映测试用例对被测软件覆盖程度的重要指标,既可以用于单元测试,也可以用于黑盒测试。代码覆盖率并不能表明覆盖到的代码不包含缺陷,不能完全用来衡量代码质量。但是,它可以帮我们定位到没有被测试...
lcov测试代码覆盖率例程
用户代码覆盖率测试 ,开源可重写,对于产品质量控制非常重要
Java单元测试覆盖率工具,该工具包为eclipse插件包,可以很方便的跟eclipse或myeclipse集成,配合junit测试代码覆盖率。
现在大部分公司做数字芯片开发都需要用到Verilog,在RTL 代码即将完成时,有必要使用vcs + DVE去查看经过仿真后的CASE代码覆盖率,保证代码本身是没问题的。
代码覆盖率驱动的测试.pdf,官方详细介绍代码覆盖率驱动的测试经典文档
测试代码覆盖率 eclipse的一个插件eclemma-1.2.2,简单、易用。
Bullseye Coverage 是Bullseye 公司提供的一款C/C++代码覆盖率测试工具,个人觉得是比Rational 的Pure Coverage 更优秀的测试工具。相对于Rational 的Pure Coverage,Bullseye Coverage 支持的C/C++的编译器更多,...
c++代码覆盖率,很方便,直接一个命令行就ok了。c++代码覆盖率,很方便,直接一个命令行就ok了。c++代码覆盖率,很方便,直接一个命令行就ok了。
cobertura和weblogic整合使用-代码覆盖率测试 里面详细步骤和使用说明,并附加xml文件,不懂的可以QQ我,147806015,
基于Jacoco的代码覆盖率实时监控与精准测试实践-QECon深圳站2021年全球软件质量&效能大会
Android Native C++代码覆盖率统计 Demo。 C++代码需要基于Clang编译(Android Studio目前默认用Clang),Android NDK版本为NDK 21。
可以结合junit与Clover一起用,单元测试和代码覆盖率
代码覆盖率驱动的测试资料,经由资料大汇总
Coverage.py用于Python的代码覆盖率测量
Ruby 代码覆盖率工具 Coco ,Coco 是一个 Ruby 的代码覆盖率工具,可通过在 RSpec 或者单元测试里通过简单的 req...
Emma进行代码覆盖率检查(命令行方式)
一种Java代码覆盖率工具的应用研究.pdf