一般是先使用黑盒测试方法来设计测试用例,然后视情况需要使用白盒测试方法来设计补充的测试用例。
白盒测试关注的是测试用例的执行程度和源代码的覆盖程度。
完全的白盒测试是将程序中每条路径都执行到,然而对一个带有循环的程序来说,完全的路径测试并不切合实际
白盒测试的方法:语句覆盖、判定覆盖、条件覆盖、判定条件覆盖、多重条件覆盖。
(覆盖逻辑依次增强)
通过一个例子分别介绍这几种方法:
写成代码的形式为:
public void foo(int A, int B, int X){
if(A>1 && B==0){
X = X/A;
}
if(A==2 || X>1){
X = X+1;
}
}
语句覆盖:就是将程序中每条语句至少执行一次。
设计一个测试用例,使每一条语句都能被执行到。如:A=2, B=0, X=4。此时遍历程序的路径为ace
。
但是此时有个问题是:上面的代码假如是正确需求的,但是程序员在编写的时候将第一个
if
语句中的if(A>1 && B==0)
误写成if(A>1 || B==0)
,你会发现依然用刚刚的测试用例并没有检测出错误。
除了上面的错误,还有可能出现的错误是如果第二个if
语句将if(A==2 || X>1)
误写成if(A==2 || X>0)
,同样也不能发现代码写错了。
综上可以发现,语句覆盖有很大的不足,以至于它通常没什么用。
判定覆盖: 比语句覆盖有更强一点的覆盖准则。它要求使每一个判断都至少有一个为真和为假的输出结果,并且每条语句都要被至少执行一次。
(这个“并且每条语句都要至少被执行一次”表示语句覆盖是判定覆盖的一个必要条件)
也就是针对上面例子设计出来的测试用例需要满足第一个
if
语句为真或者为假,第二个if
语句为真或者为假
设计的测试用例可以为:
A=3, B=0, X=3 (第一个if
语句为真,第二个if
语句为假)
A=2, B=1, X=1 (第一个if
语句为假,第二个if
语句为真)
(注意:上面的测试用例第二个if
语句中的X是输入X除以A得到)
会发现,按照判定覆盖准则设计的测试用例要比语句覆盖多一些。在每条语句都被执行的基础上,还判定了每个判断语句结果为True和False的两种情况。
虽然判定覆盖是一种比语句覆盖更强的准则,但仍然有很多的不足。同样当把第二个if
语句if(A==2 || X>1)
误写成if(A==2 || X<1)
的时候,上面的两测试用例并不能检测出错误。
我们发现只判定一个语句整体的True好False也存在较大的问题,因此可以进一步改进成将每个判定语句的里的每个条件都用True和False执行一下。
条件覆盖:确保将一个判断中的每个条件的所有可能的结果至少执行一次。
如果测试判断条件为if(A & B)
,条件覆盖准则将要求编写两个测试用例:A为真,B为假;A为假,B为真。
上面例子有四个条件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=1, B=0, X=3 (第一个if
语句为假,第二个if
语句为真)
(1)A假,B真;(2)A假,X真
A=2, B=1, X=1 (第一个if
语句为假,第二个if
语句为真)
(1)A真,B假;(2)A真, X假
可以发现条件覆盖的结果不一定是判定覆盖的结果。
那我们能否将判定覆盖的与条件覆盖结合一下呢?
判定条件覆盖:将一个判断中的每个条件的所有可能的结果至少执行一次,将每个判断的所有可能的结果至少执行一次,将每个入口点都至少调用一次。
测试用例中每个条件都要判断真假的同时,还要每个判定都要判断真假走一遍。
但是还是有一个缺点是尽管看上去所有条件的所有结果似乎都执行到了,但由于有些特定的条件会屏蔽掉其他的条件,常常并不能全部都执行到。
(例子较为复杂就不举例子了,有兴趣可查看《软件测试的艺术第三版》P38页)
多重条件覆盖:将每个判定中的所有可能的条件结果的组合,以及所有的入口点都至少执行一次。
相信刚刚看到条件覆盖的时候都有一定的疑问,只是看到单个条件真假的判断,而没有进行条件之间组合的判断。正如例子中的条件有3个:A、B、X;如果我们考虑所有组成的情况,那么将会有2*2 + 2*2
(也就是8)种情况。
如果是if(A && B && C)
这种情况,将会出现2的三次方种组合。
因此,设计的测试用例需要包含上面8中情况。
注意:8种情况不一定要8组测试用例,上面的4组测试用例就覆盖了8种情况。
当然这种情况也不一定能覆盖所有的路径情况。
最后还有路径覆盖能覆盖所有的路径,但也存在一定的缺点就是需要大量、复杂的测试用例。
参考:《软件测试的艺术第三版》