⽩盒测试的⼏种覆盖⽅法:语句覆盖、判定覆盖、条件覆盖、判定条件覆盖、组合覆盖和路径覆盖详解
⽩盒测试的⼀个很重要的评估标准就是对代码的覆盖度。⼀说到覆盖,⼤家都感觉⾮常熟悉,但是常见的覆盖都有哪些?各⾃有什么优缺点?在⽩盒测试的⽤例设计中我们应该如何⾃如地运⽤呢?今天⼩编就为⼤家总结了⼀下⼏种常见的覆盖以及各⾃的优缺点。
⽩盒测试中常见的覆盖有六种:语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、组合覆盖和路径覆盖。下⾯我们就分别看看这⼏种不同的覆盖究竟是什么⿁。
好听的英文歌推荐⼀、语句覆盖(Statement Coverage)
语句覆盖,顾名思义就是针对代码语句的嘛。它的含义是我们设计出来的要保证程序中的每⼀个语句⾄少被执⾏⼀次。通常语句覆盖被认为是“最弱的覆盖”,原因是它仅仅考虑对代码中的执⾏语句进⾏覆盖⽽没有考虑各种条件和分⽀,因此在实际运⽤中语句覆盖很难发现代码中的问题。举个⾮常简单的例⼦:
we found lovepublic int foo(int a,int b)
{
return a/b;
}
这是⼀个求两数之商的函数。如果我们设计如下的测试⽤例:
TestCa: a = 2, b = 1
这时候我们会发现,该函数的代码覆盖率达到了100%,并且设计的ca可以顺利通过测试。但是显然该函数有⼀个很明显的bug:当
b=0 时,会抛出异常。
⼆、判定覆盖(Decision Coverage)
判定覆盖也被成为分⽀覆盖(Branch Coverage),也就是说设计的测试⽤例要保证让被测试程序中的每⼀个分⽀都⾄少执⾏⼀次。举个例⼦,有如下流程图:
针对该图我们想要做到判定覆盖,可以设计如下ca:
TestCa1: a=1, b=1 (路径:ab)
TestCa2: a=-1, b=-1 (路径:acd)
TestCa3: a=2, b=-1 (路径:ace)
判定覆盖⽐语句覆盖强⼀些,能发现⼀些语句覆盖⽆法发现的问题。但是往往⼀些判定条件都是由多个逻辑条件组合⽽成的,进⾏分⽀判断时相当于对整个组合的最终结果进⾏判断,这样就会忽略每个条件的取值情况,导致遗漏部分测试路径。
三、条件覆盖(Condition Coverage)
条件覆盖于分⽀覆盖不同,条件覆盖要求所设计的测试⽤例能使每个判定中的每⼀个条件都获得可能的取值,即每个条件⾄少有⼀次真值、有⼀次假值。
仍然以上⾯流程图作为例⼦来说明。上图中涉及到的条件⼀共有4个:
a>0, a<0, b>0, b<0
为了达到条件覆盖的⽬的,我们设计的⽤例需要在 a 点有:少儿英语课程
6级成绩查询
a>0, a≤0, b>0, b≤0,
这些情况出现,并且在 c 点有:
masterbation
a<0, a≥0, b<0, b≥0
新概念英语第二册mp3下载
这些情况出现。现在可以设计如下⽤例:
TestCa1: a=1, b=1 (路径:ab)
TestCa1: a=-1, b=-1 (路径:acd)
TestCa1: a=-1, b=0 (路径:ace)
TestCa1: a=1, b=-1 (路径:ace)test message
通常⽽⾔条件覆盖⽐判定覆盖强,因为条件覆盖使得判定中的每⼀个条件都取到了不同的结果,这⼀点判定覆盖则⽆法保证。但条件覆盖也有缺陷,因为它只能保证每个条件都取到了不同结果,但没有考虑到判定结果,因此有时候条件覆盖并不能保证判定覆盖。
四、判定条件覆盖(Decision/Condition Coverage)
判定条件覆盖,说⽩了就是我们设计的测试⽤例可以使得判断中每个条件所有的可能取值⾄少执⾏⼀次(条件覆盖),同时每个判断本⾝所有的结果也要⾄少执⾏⼀次(判定覆盖)。不难发现判定条件覆盖同时满⾜判定覆盖和条件覆盖,弥补了两者各⾃的不⾜,但是判定条件覆盖并未考虑条件的组合情况。
五、组合覆盖(Branch Condition Combination Coverage)
组合覆盖也叫做条件组合覆盖。意思是说我们设计的测试⽤例应该使得每个判定中的各个条件的各种可能组合都⾄少出现⼀次。显然,满⾜条件组合覆盖的测试⽤例⼀定是满⾜判定覆盖、条件覆盖和判定条件覆盖的。
针对前⽂提到的流程图,做条件组合覆盖时我们可以设计如下⽤例:
TestCa1: a=1, b=1 (路径:ab)
TestCa1: a=-1, b=-1 (路径:acd)stoer
TestCa1: a=-1, b=0 (路径:ace)
TestCa1: a=1, b=-1 (路径:ace)
条件组合覆盖能够同时满⾜判定、条件和判定条件覆盖,覆盖度较⾼,但是组合覆盖的测试⽤例数量相对来说也是⽐较多的。
六、路径覆盖
starfarming
路径覆盖,意思是说我们设计的测试⽤例可以覆盖程序中所有可能的执⾏路径。这种覆盖⽅法可以对程序进⾏彻底的测试⽤例覆盖,⽐前⾯讲的五种⽅法覆盖度都要⾼。那么这种⽅法是不是就⼀定最好呢?当然不能讲得这么绝对,它的缺点也是显⽽易见的:由于需要对所有可能的路径全部进⾏覆盖,那么我们需要设计数量⾮常巨⼤的⽽且较为复杂的测试⽤例,⽤例数量将呈现指数级的增长。所以理论上来讲路径覆盖是最彻底的测试⽤例覆盖,但实际上很多时候路径覆盖的可操作性不强。
forum
总结
以上简单描述了⼏种不⽤的逻辑覆盖⽅法的原则和优劣。在实际的操作中,要正确使⽤⽩盒测试的代码覆盖⽅法,就要从代码分析和代码调研⼊⼿,根据调研的结果,可以选择上述⽅法中的某⼀种,或者好⼏种⽅法的结合,设计出⾼效的测试⽤例,尽可能全⾯地覆盖到代码中的每⼀个逻辑路径。