
啊胡
2022/09/13阅读:40主题:自定义主题1
白盒测试之 逻辑覆盖
逻辑覆盖
也是白盒测试中动态测试的主要方法之一,是以程序内部的逻辑结构为基础的测试技术,是通过对程序逻辑结构的遍历实现程序测试的覆盖,这种方法要求测试人员对程序的逻辑结构有清楚的了解。
逻辑覆盖的类型
依据覆盖源程序语句的详细程度,逻辑覆盖主要包括以下几类。
• 语句覆盖
:设计若干个测试用例,运行被测试程序,使得每一条可执行语句至少执行一次。
• 判定覆盖
(也称为分支覆盖):设计若干个测试用例,运行所测程序,使程序中每个判断的取真分支和取假分支至少执行一次。
• 条件覆盖
:设计足够多的测试用例,运行所测程序,使程序中每个判断的每个条件的每个可能取值至少执行一次。
• 判定/条件覆盖
:设计足够多的测试用例,运行所测程序,使程序中每个判断的每个条件的所有可能取值至少执行一次,并且每个可能的判断结果也至少执行一次,即要求各个判断的所有可能的条件取值组合至少执行一次。
• 条件组合覆盖
:设计足够多的测试用例,运行所测程序,使程序中每个判断的所有可能的条件取值组合至少执行一次。
为便于理解,根据下面所示的被测试程序(用C语言书写),分别讨论几种常用的覆盖技术。
function js(float A,float B,float X)
{
if(A>1&&B=0)X=X/A;
if(A=2||X>1)X=X+1;
}
画出流程图,如下:

语句覆盖
语句覆盖
就是使程序中每个语句至少都能被执行一次。
例如,为使程序中每个语句至少执行一次,只需设计一个能通过路径a-c-e的数据就可以了,例如选择输入数据为“A=2,B=0,X=3”就可达到语句覆盖标准。
语句覆盖可以很直观地从源代码得到测试用例,无须细分每条判定表达式,但是该测试用例虽然覆盖了可执行语句,但并不能检查判断逻辑是否有问题,例如在第一个判断中把&&错误地写成了||,则上面的测试用例仍可以覆盖所有的执行语句。又如第三个条件语句中X>1误写成X>0,这个测试用例也不能暴露它,此外,沿着路径a-b-d执行时,X的值应该保持不变,如果这一方面有错误,上述测试数据也不能发现它们。
一般认为语句覆盖是很不充分的一种标准,是最弱的逻辑覆盖准则。
判定覆盖
比语句覆盖稍强的覆盖标准是判定覆盖
。按判定覆盖准则进行测试是指设计若干测试用例,运行被测程序,使得程序中每个判断的取真分支和取假分支至少经历一次,即判断的真假值均曾被满足。判定覆盖又称为分支覆盖。
以上面被测程序为例,如果设计2个测试用例,使它们能通过路径a-c-e和a-b-d,或者通过路径a-c-d和a-b-e,就可达到判定覆盖标准,为此,可以选择输入以下数据。A=3,B=0,X=1 (沿路径a-c-d执行);A=2,B=1,X=3 (沿路径a-b-e执行)。
程序中含有判定的语句包括if-then-else、do-while、do-until等,除了双值的判定语句外,还有多值的判定语句,如case语句、带有多个分支的if语句等。所以判定覆盖更一般的含义是使得每一个分支获得每一种可能的结果。
判定覆盖比“语句覆盖”严格,因为如果每个分支都执行过了,则每个语句也就执行过了。但是,判定覆盖还是很不够的。例如,针对被测程序中的2个测试用例未能检查沿着路径a-b-d执行时,X的值是否保持不变。判定覆盖能够满足条件覆盖的要求,但是也不能对判断条件进行检查。
条件覆盖
在程序中,如果一个判定语句是由多个条件组合而成的复合判定,那么为了更彻底地实现逻辑覆盖,可以采用条件覆盖
的标准。条件覆盖的含义是构造一组测试用例,使得每个判定语句中每个逻辑条件的可能值至少满足一次。
例如,被测程序中有4个条件:A>1、B=0、A=2、X>1。
为了达到条件覆盖标准,需要执行足够的测试用例使得在a点有A>1、A≤1、B=0、B≠0,在b点有A=2、A≠2、X>1、X≤1。
现在只需设计以下2个测试用例就可满足这一标准。A=2,B=0,X=4 (沿路径a-c-e执行);A=1,B=1,X=1 (沿路径a-b-d执行)。
条件覆盖通常比判定覆盖功能强,因为条件覆盖使一个判定中的每一个条件都取到了2个不同的结果,而判定覆盖则不保证这一点。要达到条件覆盖,需要足够多的测试用例,从上面例子会发现覆盖了条件的测试用例并没有覆盖分支,所以条件覆盖并不能保证判定覆盖。
条件判定组合覆盖
条件判定组合覆盖
的含义是设计足够的测试用例,使得判定中每个条件的所有可能的值(真/假)至少出现一次,并且每个分支取到各种可能的结果(真/假)也至少出现一次。
例如,被测程序中有4个条件:A>1、B=0、A=2、X>1,有2个分支:A>1 AND B=0、A=2 OR X>1,根据定义只需设计以下2个测试用例便可以覆盖4个条件值以及2个判断分支。
• A=2,B=0,X=2,条件取值为T1、T2、T3、T4,则通过的路径为a-c-e,覆盖的分支为T5、T6。
• A=1,B=1,X=1,条件取值为F1、F2、F3、F4,则通过的路径为a-b-d,覆盖的分支为F5、F6。
条件判定组合覆盖从表面来看,它测试了所有条件的取值,但是实际上某些条件掩盖了另一些条件。例如对于条件表达式A>1 AND B=0来说,必须2个条件都满足才能确定表达式为真。如果(A>1)为假,则一般的编译器不再判断是否B=0了。对于第2个表达式A=2 OR X>1来说,若A==2测试结果为真,就认为表达式的结果为真,这时不再检查(X>1)条件了。因此,采用条件判定组合覆盖,逻辑表达式中的错误不一定能够检查出来。
条件组合覆盖
多条件覆盖也称为条件组合覆盖
,它的含义是设计足够的测试用例,使得每个判定中条件的各种可能组合都至少出现一次。显然满足多条件覆盖的测试用例是一定满足判定覆盖、条件覆盖和条件判定组合覆盖的。
例如,对被测程序中的各个判断的条件取值的8个组合加以标记如下。
① A>1,B=0,记做T1 T2,第一个判断的取真分支。
② A>1,B!=0,记做T1 F2,第一个判断的取假分支。
③ A<=1,B=0,记做F1 T2,第一个判断的取假分支。
④ A<=1,B!=0,记做F1 F2,第一个判断的取假分支。
⑤ A=2,X>1,记做T3 T4,第二个判断的取真分支。
⑥ A=2,X<=1,记做T3 F4,第二个判断的取真分支。
⑦ A!=2,X>1,记做F3 T4,第二个判断的取真分支。
⑧ A!=2,X<=1,记做F3 F4,第二个判断的取假分支。
根据定义设计4个测试用例,就可以覆盖上面8种条件取值的组合。
• A=2、B=0、X=5,条件取值为T1、T2、T3、T4,则通过的路径为a-c-e,覆盖①、⑤组合。
• A=1、B=1、X=1,条件取值为F1、F2、F3、F4,则通过的路径为a-b-d,覆盖④、⑧组合。
• A=2、B=1、X=1,条件取值为T1、F2、T3、F4,则通过的路径为a-c-d,覆盖②、⑥组合。
• A=1、B=0、X=5,条件取值为F1、T2、F3、T4,则通过的路径为a-b-e,覆盖③、⑦组合。
由上可知,当一个程序中判定语句较多时,其条件取值的组合数目是非常大的。上面的测试用例覆盖了所有条件的可能取值的组合,覆盖了所有判断的可取分支。
作者介绍
