白盒测试的几种方法


语句覆盖”是一个比较弱的测试标准,它的含义是:选择足够的测试用例,使得程序中每个语句至少都能被执行一次。                                          

图6.4是一个被测试的程序,它的源程序是:

PROCEDURE M(VAR A,B,X:REAL);  

BEGIN

IF(A>1) AND (B=0)  THENX:=X/A;

IF(A=2)OR (X>1)  THENX:=X+1;

END. 

为使程序中每个语句至少执行一次,只需设计一个能通过路径ace的例子就可以了,例如选择输入数据为:

 A=2,B=0,X=3

 就可达到“语句覆盖”标准。 

 

从本例可看出,语句覆盖实际上是很弱的,如果第一个条件语句中的AND错误地编写成OR,上面的测试用例是不能发现这个错误的;又如第三个条件语句中X>1误写成X>0,这个测试用例也不能暴露它,此外,沿着路径abd执行时,X的值应该保持不变,如果这一方面有错误,上述测试数据也不能发现它们。

总之,一般认为“语句覆盖”是很不充分的一种标准。

 

 

 

 

比“语句覆盖”稍强的覆盖标准是“判定覆盖”(或称分支覆盖)标准。含义是:执行足够的测试用例,使得程序中的每一个分支至少都通过一次。

 

6.4的程序,如果设计两个例子,使它们能通过路径ace和abd,或者通过路径acd和abe,就可达到“判定覆盖”标准,为此,可以选择输入数据为:

 

①A=3,B=0,X=1(沿路径acd执行);       ②A=2,B=1,X=3(沿路径abe执行)

 

   

 

程序中含有判定的语句包括IF-THEN-ELSE、DO-WHILE、REPEAT-UNTIL等,除了双值的判定语句外,还有多值的判定语句,如PASCAL中的CASE语句、FORTRAN中带有三个分支的IF语句等。所以“判定覆盖”更一般的含义是:使得每一个判定获得每一种可能的结果。

 

“判定覆盖”比“语句覆盖”严格,因为如果每个分支都执行过了,则每个语句也就执行过了。但是,“判定覆盖”还是很不够的,例如上面两个测试用例未能检查沿着路径abd执行时,X的值是否保持不变。

 

 

 

一个判定中往往包含了若干个条件,例如6.4的程序中,判定(A>1) AND (B=0)包含了两个条件:A>1以及B=0,所以可引进一个更强的覆盖标准——“条件覆盖”。“条件覆盖”的含义是:执行足够的测试用例,使得判定中的每个条件获得各种可能的结果。   

 

6.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

 

等各种结果出现。

 

现在只需设计以下两个测试用例就可满足这一标准:

 

①A=2,B=0,X=4 (沿路径ace执行);        ②A=1,B=1,X=1  (沿路径abd执行)。 

 

                  

 

“条件覆盖”通常比“判定覆盖”强,因为它使一个判定中的每一个条件都取到了两个不同的结果,而判定覆盖则不保证这一点。但如对语句IF(A AND B)THEN S设计测试用例使其满足"条件覆盖",即使A为真并使B为假,以及使A为假而且B为真,但是它们都未能使语句S得以执行。

 

 

 

针对上面的问题引出了另一种覆盖标准——“判定/条件覆盖”,它的含义是:执行足够的测试用例,使得判定中每个条件取到各种可能的值,并使每个判定取到各种可能的结果。对图6.4的程序,上一节中的两个例子

      ①A=2,B=0,X=4 (沿ace路径)                       ②A=1,B=1,X=1(沿abd路径) 

                                 

是满足这一标准的。

“判定/条件覆盖”似乎是比较合理的,但事实并非如此,因为大多数计算机不能用一条指令对多个条件作出判定,而必须将源程序中对多个条件的判定分解成几个简单判定,所以较彻底的测试应使每一个简单判定都真正取到各种可能的结果。 

图6.5是由编译系统产生的6.4的目标程序。上面的两个例子未能使目标程序中的每一个简单判定取到各种可能的结果;它们不能使判定I为“假”也不能使判定K为“真”,其原因在于:含有AND或OR的逻辑表达式中,某些条件将抑制其他条件,例如逻辑表达式A AND B,如果A为“假”,目标程序就不再检查条件B了,这样B中的错误就发现不了。    

 

上面的讨论说明了,尽管“判定/条件覆盖”看起来能使各种条件取到所有可能的值,但实际上并不一定能检查到这样的程度。

 

 

 

针对上述问题又提出了另一种标准——“条件组合覆盖”。它的含义是:执行足够的例子,使得每个判定中条件的各种可能组合都至少出现一次。显然,满足“条件组合覆盖”的测试用例是一定满足“判定覆盖”、“条件覆盖”和“判定/条件覆盖”的。

 

再看6.4的程序,我们需要选择适当的例子,使得下面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

 

必须注意到,5)、6)、7)、8)四种情况是第二个IF语句的条件组合,而X的值在该语句之前是要经过计算的,所以还必须根据程序的逻辑推算出在程序的入口点X的输入值应是什么。
下面四个例子可以使上述8种条件组合至少出现一次:

 

①A=2,B=0,X=4使1)、5)两种情况出现;②A=2,B=1,X=1使2)、6)两种情况出现; 

 

           


③A=1,B=0,X=2使3)、7)两种情况出现; ④A=1,B=1,X=1使4)、8)两种情况出现。  

 

上面四个例子虽然满足条件组合覆盖,但并不能覆盖程序中的每一条路径,例如路径acd就没有执行,因此,条件组合覆盖标准仍然是不彻底。

 

 
 转载自:https://www.cnblogs.com/chengnuo/p/5297942.html
posted @ 2019-05-22 15:59  larybird  阅读(7488)  评论(0编辑  收藏  举报