白盒法

  1. 白盒法的基本概念

前边说过,白盒法又称逻辑覆盖法。所谓逻辑覆盖是指使用一定的测试数据所能执行的语句范围,这些被执行的语句所组成的路径,称为逻辑路径。如果整个程序是顺序结构,从头到尾只有一条路径,则执行程序必然会覆盖所有路径,测试起来就很简单。而在具有选择结构或循环结构的程序中,由于有了两个或两个以上的分支,程序的一次执行肯定不会覆盖所有的分支, 从而产生了多种逻辑覆盖类型。

例 4.2.1 设有如下一程序段。if(A>1andB==0)

X=X/A; if(A==2orX>1)

X=X+1;

该程序段的流程图如图 4-2-1 所示,它有两个复合判定,两条可执行语句。因而逻辑路径则有:

ace,两条语句均被执行; abd,两条语句均不执行; acd, 只 执 行 X=X/A; abe,只执行 X=X+1。

这样,一共有 4 条逻辑路径。

下面根据对这个程序段的分析来说明各种逻辑覆盖类型。

白盒法 - 图1

  1. 逻辑覆盖类型1)语句覆盖

语句覆盖是指选用的测试用例将执行程序中的每个语句。

对于所举的例子,语句覆盖应执行 c 和 e 两个语句。要做到这一点,当然可以有多个测试用例,有的执行 c,有的执行 e,但理想的测试用例应当是最少的,即最好用一个执行 ace 这一逻辑路径的测试用例。选用如下测试用例就能满足语句覆盖的要求。

A=2 B=0 X=3

可以看出,语句覆盖的测试效果是相当弱的。因为就这个程序段讲,一共有 4 条逻辑路径,要对它进行比较全面的测试,则每条路径至少要执行一

遍,而语句覆盖只执行了 1 条。2)判定覆盖

判定覆盖是指执行测试用例时,要使程序中每个判定都能够获得一次真值和伪值。即使每个分支路径都被执行一次。

根据这一要求,比较理想的情况是使用如下测试用例: A=3

B=0 X=1

则程序运行时

一个判定为真,能够执行 X/A,但由于执行后 X=1/3,

二个判定为伪,所覆盖的是 acd 这一逻辑路径。再用如下测试用例:

A=2 B=1 X=3

则程序运行时

一个判定为伪,而

二个判定为真,所覆盖的是 abe 逻辑路径。

由于使用这两个测试用例后,每个判定都取过真和伪,已经满足判定覆盖标准,因而不必再选其它测试用例。

然而这样执行的结果只经过 acd 和 abe 两条逻辑路径,还有其它两条没有被执行。所以判定覆盖尽管比语句覆盖的测试效果要强些,但距完整、全面的测试仍有一定的差距。

  1. 条件覆盖

条件覆盖是指执行测试用例时,要使得程序判定中的每个条件都能获得一次真值和伪值。

判定由条件组成,只包含一个条件的判定称为简单条件判定。对于简单条件判定,条件覆盖和判定覆盖是一致的;包含两个或两个以上条件的判定称为复合条件判定。对于复合条件判定,由于一个判定由多个条件组成,所以两种覆盖的程序不同。一般讲,条件覆盖的测试效果比判定覆盖强。

在上例中,一共有四个条件,即: A>1

B=0 A=2

X>1

为使每一个条件在测试中都要取一次真和一次伪。可选用如下两个测试用例:

测试用例 1 测试用例 2

A=2 A=1

B=0 B=1

X=4 X=1

  1. 判定/条件覆盖

判定/条件覆盖是覆盖范围更全面的一种覆盖类型。在判定/条件覆盖中,通过执行足够的测试用例,使每个判定都能取各种可能的值,同时使每个条件也都能取各种可能的值。

对于上面的程序段,条件覆盖所选的两个测试用例就可以满足这种覆盖标准。

  1. 条件组合覆盖

条件组合覆盖是通过执行足够的测试用例,使得每个判定中条件的各种可能组合至少出现一次。由于考虑到判定中各种条件的可能组合,满足这种覆盖标准的测试用例一定能满足前述的其它覆盖类型。

对于上例中的程序段,四个条件共有八种组合,即: A>1,B=0

A>1,B≠0 A<1,B=0

A<1,B≠0 A=2,X<1 A=2,X<1

A≠2,X>1 A≠2,X<1

用四个测试用例就可以实现上述八种组合,这些测试用例是: A=2,B=0,X=4

A=2,B=1,X=1 A=1,B=0,X=2 A=1,B=1,X=1

条件组合覆盖的覆盖效果应当是最强的,但它也不一定能覆盖程序所有的逻辑路径。如本例中,acd 就没有执行。