下载此文档

代码覆盖率.docx


文档分类:资格/认证考试 | 页数:约7页 举报非法文档有奖
1/7
下载提示
  • 1.该资料是网友上传的,本站提供全文预览,预览什么样,下载就什么样。
  • 2.下载该文档所得收入归上传者、原创者。
  • 3.下载的文档,不会出现我们的网址水印。
1/7 下载此文档
文档列表 文档介绍
该【代码覆盖率 】是由【guoxiachuanyue007】上传分享,文档一共【7】页,该文档可以免费在线阅读,需要了解更多关于【代码覆盖率 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。在做单元测试时,代码覆盖率常常被拿来作为衡量测试好坏的指标,甚至,用代码覆盖率来考核测试任务完成情况,比如,代码覆盖率必须达到80%或90%。于是乎,测试人员费尽心思设计案例覆盖代码。用代码覆盖率来衡量,有利也有有弊。本文我们就代码覆盖率展开讨论,也欢迎同学们踊跃评论。
首先,让我们先来了解一下所谓的“代码覆盖率”。我找来了所谓的定义:
代码覆盖率二代码的覆盖程度,一种度量方式。
上面简短精悍的文字非常准确的描述了代码覆盖率的含义。而代码覆盖程度的度量方式是有很多种的,这里介绍一下最常用的几种:
语句覆盖(Statementcoverage)
又称行覆盖(LineCoverage),段覆盖(SegmentCoverage),基本块覆盖(BasicBlockCoverage),这是最常用也是最常见的一种覆盖方式,就是度量被测代码中每个可执行语句是否被执行到了。这里说的是“可执行语句”,因此就不会包括像C++的头文件声明,代码注释,空行,等等。非常好理解,只统计能够执行的代码被执行了多少行。需要注意的是,单独一行的花括号{}也常常被统计进去。语句覆盖常常被人指责为“最弱的覆盖”,它只管覆盖代码中的执行语句,却不考虑各种分支的组合等等。假如你的上司只要求你达到语句覆盖,那么你可以省下很多功夫,但是,换来的确实测试效果的不明显,很难更多地发现代码中的问题。
这里举一个不能再简单的例子,我们看下面的被测试代码:
{—
/b;
假如我们的测试人员编写如下测试案例:
TeseCase:a=10,b=5
测试人员的测试结果会告诉你,他的代码覆盖率达到了100%,并且所有测试案例都通过了。然而遗憾的是,我们的语句覆盖率达到了所谓的100%,但是却没有发现最简单的Bug,比如,当我让b=0时,会抛出一个除零异常。
正因如此,假如上面只要求测试人员语句覆盖率达到多少的话,测试人员只要钻钻空子,专门针对如何覆盖代码行编写测试案例,就很容易达到主管的要求。当然了,这同时说明了几个问题:
主管只使用语句覆盖率来考核测试人员本身就有问题。
测试人员的目的是为了测好代码,钻如此的空子是缺乏职业道德的。
是否应该采用更好的考核方式来考核测试人员的工作?为了寻求更好的考核标准,我们必须先了解完代码覆盖率到底还有哪些,如果你的主管只知道语句覆盖,行覆盖,那么你应该主动向他介绍还有更多的覆盖方式。比如:
判定覆盖(Decisioncoverage)
又称分支覆盖(BranchCoverage)所有边界覆盖(AII-EdgesCoverage),基本路径覆盖(BasicPathCoverage),判定路径覆盖
(Decision-Decision-Path)。它度量程序中每一个判定的分支是否都被测试到了。这句话是需要进一步理解的,应该非常容易和下面说到的条件覆盖混淆。因此我们直接介绍第三种覆盖方式,然后和判定覆盖一起来对比,就明白两者是怎么回事了。
条件■盖(Conditioncoverage)
它度量判定中的每个子表达式结果true和false是否被测试到了。为了说明判定覆盖和条件覆盖的区别,我们来举一个例子,假如我们的被测代码如下:
intfoo(inta,intb)
if(a<10||b<10)//判定
{return0;//分支-
else
}}}「分支二
设计判定覆盖案例时'我们只需要考虑判定结果为true和false两种情
况,因此,我们设计如下的案例就能达到判定覆盖率100%:
TestCaesI:a=5,b=任意数字覆盖了分支一
TestCaes2:a=15,b=15覆盖了分支二
设计条件覆盖案例时,我们需要考虑判定中的每个条件表达式结果,为
了覆盖率达到100%,我们设计了如下的案例:
TestCasel:a=5,b=5true,true
TestCase4:a=15,b=15false,false
通过上面的例子,我们应该很清楚了判定覆盖和条件覆盖的区别。需要特别注意的是:条件覆盖不是将判定中的每个条件表达式的结果进行排列组合,而是只要每个条件表达式的结果true和false测试到了就OK了。因此,我们可以这样推论:完全的条件覆盖并不能保证完全的判定覆盖。比如上面的例子,假如我设计的案例为:
TestCase1:a=5,b=15true,false分支一
TestCase1:a=15,b=5false,true分支一
我们看到,虽然我们完整的做到了条件覆盖,但是我们却没有做到完整的判定覆盖,我们只覆盖了分支一。上面的例子也可以看出,这两种覆盖方式看起来似乎都不咋滴。我们接下来看看第四种覆盖方式。
路径覆盖(PathCoverage)又称断言覆盖
(Predicatecoverage)。它度量了是否函数的每一个分支都被执行了。这句话也非常好理解,就是所有可能的分支都执行一遍,有多个分支嵌套时,需要对多个分支进行排列组合,可想而知,测试路径随着分支的数量指数级别增加。比如下面的测试代码中有两个判定分支:
intfoo(inta,intb)
{…n=0;
if(a<10)
{//分支一
}—;
if(b<10)
{//分支二
}—0;
}returnnReturn;
对上面的代码,我们分别针对我们前三种覆盖方式来设计测试案例:

TestCasea=5,b=5nReturn=11
语句覆盖率100%

TestCasela=5,b=5
TestCase2a=15,b=15判定覆盖率100%
nReturn=11
nReturn=0

TestCase1a=5,b=15
nReturn=1
TestCase2a=15,b=5
nReturn=10
条件覆盖率100%
我们看到,上面三种覆盖率结果看起来都很酷!都达到了100%!主管可能会非常的开心,但是,让我们再去仔细的看看,上面被测代码中,nReturn的结果一共有四种可能的返回值:0,1,10,11,而我们上面的针对每种覆盖率设计的测试案例只覆盖了部分返回值,因此,可以说使用上面任一覆盖方式,虽然覆盖率达到了100%,但是并没有测试完全。接下来我们来看看针对路径覆盖设计出来的测试案例:
TestCase1a=5,
b=5
nReturn=0
TestCase2a=15,
b=5
nReturn=1
TestCase3a=5,
b=15
nReturn=10
TestCase4a=15,
b=15
nReturn=11
路径覆盖率100%
太棒了!路径覆盖将所有可能的返回值都测试到了。这也正是它被很多
人认为是“最强的覆盖”的原因了。
还有一些其他的覆盖方式,如:循环覆盖(LoopCoverage),它度量是
否对循环体执行了零次,一次和多余一次循环。剩下一些其他覆盖方式就不介绍了。
通过上面的学****我们再回头想想,覆盖率数据到底有多大意义。我总
结了如下几个观点,欢迎大家讨论:
覆盖率数据只能代表你测试过哪些代码,不能代表你是否测试好这
些代码。(比如上面第一个除零Bug)
不要过于相信覆盖率数据。
不要只拿语句覆盖率(行覆盖率)来考核你的测试人员。
路径覆盖率>判定覆盖>语句覆盖
测试人员不能盲目追求代码覆盖率,而应该想办法设计更多更好的
案例,哪怕多设计出来的案例对覆盖率一点影响也没有。

代码覆盖率 来自淘豆网www.taodocs.com转载请标明出处.

相关文档 更多>>
非法内容举报中心
文档信息