白盒测试方法
1.语句覆盖
设计若干用例,运行被测程序,使得程序中每个判断的取真分支和取假分支至少经历一次,即判断真假值均曾被满足。 一个判定往往代表着程序的一个分支,所以判定覆盖也被称为分支覆盖。
a=2,b=1 ,c=6可覆盖判断M的Y分支和判断N的Y分支;
a=-2,b=-1 ,c=-3可覆盖判断M的N分支和判断N的N分支 。 这两组测试用例可覆盖所有判定的真假分支。
a=1,b=1 ,c=-3 可覆盖判断M的Y分支和判断N的N分支 ;
a=1,b=-2 ,c=3可覆盖判断M的N分支和判断N的Y分支 ; 同样的这两组测试用例也可覆盖所有判定的真假分支。
优点
判定覆盖具有比语句覆盖更强的测试能力。同样判定覆盖也具有和语句覆盖一样的简单性,无须细分每个判定就可以得到测试用例。
缺点
往往大部分的判定语句是由多个逻辑条件组合而成,若仅仅判断其整个最终结果,而忽略每个条件的取值情况,必然会遗漏部分测试路径。判定覆盖仍是弱的逻辑覆盖。
2.判定覆盖
设计若干用例,运行被测程序,使得程序中每个判断的取真分支和取假分支至少经历一次,即判断真假值均曾被满足。 一个判定往往代表着程序的一个分支,所以判定覆盖也被称为分支覆盖。
a=2,b=1 ,c=6可覆盖判断M的Y分支和判断N的Y分支;
a=-2,b=-1 ,c=-3可覆盖判断M的N分支和判断N的N分支 。 这两组测试用例可覆盖所有判定的真假分支。
a=1,b=1 ,c=-3 可覆盖判断M的Y分支和判断N的N分支 ;
a=1,b=-2 ,c=3可覆盖判断M的N分支和判断N的Y分支 ; 同样的这两组测试用例也可覆盖所有判定的真假分支。
优点
判定覆盖具有比语句覆盖更强的测试能力。同样判定覆盖也具有和语句覆盖一样的简单性,无须细分每个判定就可以得到测试用例。
缺点
往往大部分的判定语句是由多个逻辑条件组合而成,若仅仅判断其整个最终结果,而忽略每个条件的取值情况,必然会遗漏部分测试路径。判定覆盖仍是弱的逻辑覆盖。
3.条件覆盖
设计若干测试用例,执行被测程序以后,要使每个判断中每个条件的可能取值至少满足一次。
判断M表达式: 设条件 a>0 取真 记为 T1 取假 记为 F1
条件 b>0 取真 记为 T2 取假 记为 F2
判断N表达式: 设条件 a>1 取真 记为 T3 取假 记为 F3
条件 c>1 取真 记为 T4 取假 记为 F4
它覆盖了判定M的N分支和判断N的Y分支。
测试用例 | 覆盖条件 | 具体取值条件 |
---|
a=2,b=-1,c=-2 | T1, F2, T3, F4 | a>0,b<=0,a>1,c<=1 | a=-1,b=2,c=3 | F1, T2, F3, T4 | a<=0,b>0,a<=1,c>1 |
我们用条件覆盖设计的思想就是让测试用例能覆盖 T1、T2、T3、T4、F1、F2、F3、F4
优点
增加了对条件判定情况的测试,增加了测试路径。
缺点
条件覆盖不一定包含判定覆盖。例如,我们刚才设计的用例就没有覆盖判断M的Y分支和判断N的N分支。条件覆盖只能保证每个条件至少有一次为真,而不考虑所有的判定结果。
4.判定条件覆盖
判定-条件覆盖是判定和条件覆盖设计方法的交集,即设计足够的测试用例,使得判断条件中的所有条件可能取值至少执行一次,同时,所有判断的可能结果至少执行一次。
测试用例 | 取值条件 | 具体取值条件 | 判定条件 | 通过路径 |
---|
输入:a=2,b=1,c=6输出:a=2,b=1,c=5 | T1,T2,T3,T4 | a>0,b>0, a>1,c>1 | M=.T.N=.T. | P1(1-2-4) | 输入:a=-1,b=-2,c=-3输出:a=-1,b=-2,c=-5 | F1,F2,F3,F4 | a<=0, b<=0, a<=1, c<=1 | M=.F.N=.F. | P4(1-3-5) |
按照判定-条件覆盖的要求,我们设计的测试用例要满足如下条件:
1.所有条件可能至少执行一次取值;
2.所有判断的可能结果至少执行一次。
测试用例 | 覆盖条件 | 覆盖判断 |
---|
a=2,b=1,c=6 | T1, T2,T3, T4 | M的Y分支和N的Y分支 | a=-1,b=-2,c=-3 | F1, F2, F3, F4 | M的N分支和N的N分支 |
要满足T1、T2、 T3 、T4 F1、 F2 、F3、F4
优点
能同时满足判定、条件两种覆盖标准。
缺点
判定/条件覆盖准则的缺点是未考虑条件的组合情况。
5.条件组合覆盖
设计足够的测试用例,使得程序中每个判断的所有可能的条件取值组合都至少出现一次。
它与条件覆盖的差别是它不是简单地要求每个条件都出现“真”与“假”两种结果,而是要求让这些结果的所有可能组合都至少出现一次。
按照条件组合覆盖的基本思想,对于前面的例子,我们把每个判断中的所有条件进行组合,设计组合条件如表所示,而我们设计的测试用例就要包括所有的组合条件。
组合编号 | 覆盖条件取值 | 判定条件取值 | 判定-条件组合 |
---|
1 | T1,T2 | M=.T. | a>0,b>0,M取真 | 2 | T1,F2 | M=.F. | a>0,b<=0,M取假 | 3 | F1,T2 | M=.F. | a<=0,b>0,M取假 | 4 | F1,F2 | M=.F. | a<=0,b<=0,M取假 | 5 | T3,T4 | N=.T. | a>1,c>1,N取真 | 6 | T3,F4 | N=.T. | a>1,c<=1,N取真 | 7 | F3,T4 | N=.T. | a<=1,c>1,N取真 | 8 | F3,F4 | N=.F. | a<=1,c<=1,N取假 |
测试用例 | 覆盖条件 | 覆盖判断 | 覆盖组合 |
---|
a=2,b=1,c=6 | T1, T2,T3, T4 | M取Y分支,Q取Y分支 | 1,5 | a=2,b= -1,c= -2 | T1, F2, T3, F4 | M取N分支,Q取Y分支 | 2,6 | a=-1,b=2,c=3 | F1, T2, F3, T4 | M取N分支,Q取Y分支 | 3,7 | a= -1,b= -2,c= -3 | F1, F2, F3, F4 | M取N分支,Q取N分支 | 4,8 |
要满足1、2、3、4、5、6、7、8条件组合
测试用例 | 覆盖条件 | 覆盖路径 | 覆盖组合 |
---|
输入:a=2,b=1,c=6输出:a=2,b=1,c=5 | T1,T2,T3,T4 | P1(1-2-4) | 1,5 | 输入:a=2,b=-1,c=-2输出:a=2,b=-1,c=-2 | T1,F2,T3,F4 | P3(1-3-4) | 2,6 | 输入:a=-1,b=2,c=3 输出:a=-1,b=2,c=6 | F1,T2,F3,T4 | P3(1-3-4) | 3,7 | 输入:a=-1,b=-2,c=-3输出:a=-1,b=-2,c=-5 | F1,F2,F3,F4 | P4(1-3-5) | 4,8 |
覆盖了所有组合,但覆盖路径有限,1-2-5 没被覆盖
优点
条件组合覆盖准则满足判定覆盖、条件覆盖和判定/条件覆盖准则。
缺点
线性地增加了测试用例的数量。
6.路径覆盖
设计所有的测试用例,来覆盖程序中的所有可能的执行路径。
测试用例 | 覆盖路径 | 覆盖条件 | 覆盖组合 |
---|
输入:a=2,b=1,c=6输出:a=2,b=1,c=5 | P1(1-2-4) | T1,T2,T3,T4 | 1,5 | 输入:a=1,b=1,c=-3输出:a=1,b=1,c=-2 | P2(1-2-5) | T1,T2,F3,F4 | 1,8 | 输入:a=2,b=-1,c=-2输出:a=2,b=-1,c=-2 | P3(1-3-4) | T1,F2,T3,F4 | 2,6 | 输入:a=-1,b=2,c=3 输出:a=-1,b=2,c=6 | P3(1-3-4) | F1,T2,F3,T4 | 3,7 | 输入:a=-1,b=-2,c=-3输出:a=-1,b=-2,c=-5 | P4(1-3-5) | F1,F2,F3,F4 | 4,8 |
测试用例 | 覆盖组合 | 覆盖路径 |
---|
a=2,b=1,c=6 | 1,5 | 1-2-4 | a=1,b=1,c=-3 | 1,8 | 1-2-5 | a=-1,b=2,c=3 | 4,7 | 1-3-4 | a=-1,b=-2,c=-3 | 4,8 | 1-3-5 |
优点
这种测试方法可以对程序进行彻底的测试,比前面五种的覆盖面都广。
缺点
需要设计大量、复杂的测试用例,使得工作量呈指数级增长,不见得把所有的条件组合都覆盖。
|