1
 软件工程
1.7.2.2 5.2.2 白盒测试

5.2.2 白盒测试

白盒测试,又称为结构测试、逻辑驱动测试、基于程序的测试或逻辑覆盖法。它依赖于对程序细节的严密检验,有针对性地设计测试用例,对软件的逻辑路径进行测试。设计的宗旨就是测试用例尽可能提高程序内部逻辑的覆盖程度、最彻底的白盒测试是能够覆盖程序中的每一条路径。但是程序中含有循环后,路径的数量极大,要执行每一条路径变得极不现实。软件的白盒测试用于分析程序的内部结构。白盒测试主要用于单元测试。测试的关键也是如何选择高效的测试用例。

几种常用的逻辑覆盖测试方法是语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖及条件组合覆盖。不同的逻辑覆盖测试方法都是从各自不同的方面出发,为设计测试用例提出依据的。

1.语句覆盖

语句覆盖的含义是选择足够多的测试数据,使被测试程序中的每个语句至少执行一次。

例如:图5-3是一个被测模块的流程图。

为了使每个语句都执行一次,程序的执行路径应该是a→c→e,只需要输入下面的测试数据(实际上X可以是任意实数):

A=2,B=0,X=4。

语句覆盖对程序的逻辑覆盖很少,在此例子中两个判定条件都只测试了图5-3中被测模块的流程图条件为真的情况,如果条件为假时处理有错误,显然不能发现。此外,语句覆盖只关心判定表达式的值,而没有分别测试判定表达式中每个条件取不同值时的情况。在上面的例子中,为了执行a→c→e路径,测试每一条语句,只需两个判定表达式A>1AND B=0和A=2OR X>1都取真值,因此使用上述一组测试数据就够了。但是,如果程序中把第一个判定表达式中的逻辑运算符“AND”错写成“OR”,或者把第二个判定式中的条件“X>1”误写成“X<1”,使用上面的测试数据并不能查出这些错误。与后面介绍的其他覆盖相比较,语句覆盖是最弱的覆盖准则。

2.判定覆盖

判定覆盖的含义是,不仅每个语句必须至少执行一次,而且每个判定的可能结果都应该至少执行一次,也就是每个判定的每个分支都至少执行一次,即判断的真假值均曾被满足。判定覆盖又称为分支覆盖。

img55

图5-3 一个被测模块的流程图

仍然以图5-3为例,能够分别覆盖路径a→c→e和a→b→d的两组测试数据,或者可以分别覆盖a→c→d和a→b→e的两组测试数据,都满足判定覆盖标准。例如,下面两组测试数据就可以做到判定覆盖:

(1)A=3,B=0,X=0(覆盖a→c→d);

(2)A=2,B=1,X=1(覆盖a→b→e)。

判定覆盖比语句覆盖更强,但是对程序逻辑的覆盖程度仍然不高,例如,上面的测试数据只覆盖了程序全部路径的一半。这个事实说明,只做到判定覆盖仍无法确定判断内部条件的错误。因此,需要有更强的逻辑覆盖准则去检验判断的内部条件。

3.条件覆盖

条件覆盖的含义是,不仅每个语句至少执行一次,而且是判定表达式中的每个条件都取到各种可能的结果。

图5-3的例子中共有两个判定表达式,每个判定表达式中有两个条件,为了做到条件覆盖,应该选取测试数据使得在点P1处有下述各种结果出现:

A>1, A≤1, B=0, B≠0。

在点P2处有下述各种结果出现:

A=2, A≠2, X>1, X≤1。

只需使用下面两组测试数据就可以达到上述覆盖标准:

(1)A=2,B=0,X=4(满足A>1,B=0,A=2和X>1的条件,执行路径a→c→e);

(2)A=1,B=1,X=1(满足A≤1,B≠0,A≠2和X≤1的条件,执行路径a→b→d)。

条件覆盖通常比判定覆盖强,因为它使判定表达式中的每个条件都取到了两个不同的结果,判定覆盖却只关心整个判定表达式的值。例如,上面两组测试数据也同时满足判定覆盖标准。但是,也可能有相反的情况,虽然每个条件都取到了两个不同的结果,判定表达式却始终只取一个值。例如,如果使用下面两组测试数据,则只满足条件覆盖标准而不满足判定覆盖标准(第二个判定表达式的值总为真):

(1)A=2,B=0,X=1(满足A>1,B=0,A=2和X≤1的条件,执行路径a→c→e);

(2)A=1,B=1,X=2(满足A≤1,B≠0,A≠2和X>1的条件,执行路径a→b→e)。

4.判定/条件覆盖

既然判定覆盖不一定包含条件覆盖,条件覆盖也不一定包含判定覆盖,自然会提出一种能同时满足这两种覆盖标准的逻辑覆盖,这就是判定/条件覆盖。它的含义是,选取足够多的测试数据,使得判定表达式中的每个条件都取到各种可能的值,而且每个判定表达式也都取到各种可能的结果。

对于图5-3中例子而言,下述两组测试数据满足判定/条件覆盖标准:

(1)A=2,B=0,X=1(满足A>1,B=0,A=2和X≤1的条件,执行路径a→c→e);

(2)A=1,B=2,X=2(满足A≤1,B≠0,A≠2和X>1的条件,执行路径a→b→e)。

但是,这两组测试数据也就为了满足条件覆盖标准最初选取的两组数据,因此,有时判定/条件覆盖也并不比条件覆盖更强。

5.条件组合覆盖

条件组合覆盖是更强的逻辑覆盖标准,它要求选取足够多的测试数据,使得每个判定表达式中条件的各种可能组合都至少出现一次。以图5-3为例,其中共有8种可能的条件组合,即

第1种条件组合:A>1,B=0;

第2种条件组合:A>1,B≠0;

第3种条件组合:A≤1,B=0;

第4种条件组合:A≤1,B≠0;

第5种条件组合:A=2,X>1;

第6种条件组合:A=2,X≤1;

第7种条件组合:A≠2,X>1;

第8种条件组合:A≠2,X≤1。

下面的4组测试数据可以使上面列出的8种组合每种至少出现一次:

(1)A=2,B=0,X=4(针对第1种和第5种两种组合,执行路径a→c→e);

(2)A=2,B=1,X=1(针对第2种和第6种两种组合,执行路径a→b→e);

(3)A=1,B=0,X=2(针对第3种和第7种两种组合,执行路径a→b→e);

(4)A=1,B=1,X=1(针对第4种和第8种两种组合,执行路径a→c→e)。

显然,满足条件组合覆盖标准的测试数据,也一定满足判定覆盖、条件覆盖和判定/条件覆盖的标准。因此,条件组合覆盖是前述几种覆盖标准中最强的。但是,满足条件组合覆盖标准的测试数据并不一定能使程序中的每条路径都执行到,例如,上述4组测试数据都没有测试到路径a→c→d。

以上根据测试数据对源程序语句检测的详尽程序,简单讨论了几种逻辑覆盖标准。在上面的分析过程中常常谈到测试数据执行的程序路径,显然,测试数据可以检测的程序路径的多少,也反映了程序测试的详尽程度。