“语句覆盖”是一个比较弱的测试标准,它的含义是:选择足够的测试用例,使得程序中每个语句至少都能被执行一次。 | |||||||||||||
图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,所以可引进一个更强的覆盖标准——“条件覆盖”。“条件覆盖”的含义是:执行足够的测试用例,使得判定中的每个条件获得各种可能的结果。
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.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的输入值应是什么。
①A=2,B=0,X=4使1)、5)两种情况出现;②A=2,B=1,X=1使2)、6)两种情况出现;
上面四个例子虽然满足条件组合覆盖,但并不能覆盖程序中的每一条路径,例如路径acd就没有执行,因此,条件组合覆盖标准仍然是不彻底。
|
转载于:https://www.cnblogs.com/chengnuo/p/5297942.html