在白盒测试中,逻辑覆盖测试是使用较多的方法。按照其对测试的有效程度,又将其划分为由弱到强的6种:语句覆盖、判定覆盖、条件覆盖、判定-条件覆盖、条件组合覆盖、路径覆盖。
在这里,不深究各个覆盖的优缺点,仅仅根据一个实际例子来看看如何写出6种覆盖的测试用例。
public void function(int a, int b, int c) { if ((a > 1) && (b == 0)) { c /= a; } if ((a == 5) || (c > 1)) { c += 1; } c = a + b + c; }
为了分析的方便,我们将其对应的流程图画出来,如下:
图中A、B、C、D、E分别表示路径;并且记第一个判断为P1,记第二个判断为P2;一共有4个条件,我们记为1、2、3、4。接下来便正式开始分析:
一、语句覆盖:设计足够多的的用例来使程序中的可执行语句至少被执行一次。
我们可以看出如果程序按照A -> C -> E执行的话,那么就能满足语句覆盖。于是,P1和P2都必须为True。要使P1=True,可以取a=5(为了满足P2的a=5这个条件,其实这里只要满足a>1即可)、b=0。要使P2=True,可以取a=5(满足a>1即可)、c=6(假设在前面a不取5,则在此处必须注意c的取值应该大于a的取值。为什么?因为P1为true时会执行语句c=c/a,在P2中a=5这个条件不满足,要使整体为true,就必须满足c=c/a >1,则c>a)。
于是,测试用例为:
a = 5, b = 0, c = 6 //CE({P1=true, P2=true}、{T1, T2, T3, T4})
二、判定覆盖:设计足够多的用例来使程序中的每个判定的真、假分支至少被执行一次。
首先,必须清楚何谓一个判定。一个判定就是程序中一个if语句中的所有内容,对应到流程图中的一个菱形框。在该题中为P1、P2。
P1的两个分支为B和C,P2的两个分支为D和E,于是我们可以组合出BD,BE,CD,CE四条路径。根据定义,B、C、D、E在我们所取得用例中都必须至少出现一次,于是,我们可以取{BD、CE}或{BE、CD}。在这里,我们就取{BD、CE},对于CE,在语句覆盖中已经给出:a=5、b=0、c=6,对于BD,我们可以取a=1、b=0、c=1。
于是,测试用例为:
a = 5, b = 0, c = 6 //CE({P1=true, P2=true}、 {T1, T2, T3, T4}) a = 1, b = 0, c = 1 //BD({P1=false, P2=false}、{F1, T2, F3, F4})
三、条件覆盖:设计足够多的用例来使程序中每个判定中的每个条件的所有可能取值都至少取了一次。
首先,必须清楚何谓一个条件。一个条件就是一个if语句中的一个布尔表达式。在该题中,P1有2个条件(a>1、b==0),P2也有2个条件(a==5、c>1)。
P1中2个条件可以有4种组合[{a>1, b=0}、{a>1,b!=0}、{a<=1,b=0}、{a<=1,b!=0}],按照真假至少满足一次,我们取{{a=5,b=0}、{a=1,b=3}}。
P2中2个条件可以有4种组合[{a=5,c>1}、{a=5,c<=1}、{a!=5,c>1}、{a!=5,c<=1}],按照真假至少满足一次,我们取{{a=5,c=1}、{a=1,c=6}}。
于是,测试用例为:
a = 5, b = 0, c = 1 //CE({P1=true, P2=true}、{T1, T2, T3, F4}) a = 1, b = 3, c = 6 //BE({P1=false, P2=true}、{F1, F2, F3, T4})
四、判定-条件覆盖:设计足够多的用例来同时满足判定覆盖和条件覆盖。
首先,我们来看一下在判定覆盖和条件覆盖中设计的用例。会发现在判定覆盖中,条件2(b==0)只出现了取真分支;而在条件覆盖中,P2只出现了取true的情况。也就是说这两者均不满足判定-条件覆盖。
为了使上述两者满足判定-条件覆盖,我们只需简单修改一下即可。
于是,测试用例为:
//修改判定覆盖 a = 5, b = 0, c = 6 //CE({P1=true, P2=true}、 {T1, T2, T3, T4}) a = 1, b = 1, c = 1 //BD({P1=false, P2=false}、{F1, F2, F3, F4})
或者:
//修改条件覆盖 a = 2, b = 0, c = 1 //CD({P1=true, P2false}、 {T1, T2, T3, F4}) a = 1, b = 3, c = 6 //BE({P1=false, P2=true}、 {F1, F2, F3, T4})
五、条件组合覆盖:设计足够多的用例来使所有条件的可能组合都至少取了一次。
P1中2个条件可以有4种组合[{a>1, b=0}、{a>1,b!=0}、{a<=1,b=0}、{a<=1,b!=0}],我们可以取{{a=5, b=0}、{a=5, b=1}、{a=1, b=0}、{a=1, b=1}};
P2中2个条件可以有4种组合[{a=5,c>1}、{a=5,c<=1}、{a!=5,c>1}、{a!=5,c<=1}],我们可以取{{a=5, c=6}、{a=5, c=1}、{a=1, c=6}、{a=1, c=1}}。
于是,测试用例为:
a = 5, b = 0, c = 6 //CE({P1=true, P2=true}、 {T1, T2, T3, T4}) a = 5, b = 1, c = 1 //BE({P1=false, P2=true}、 {T1, F2, T3, F4}) a = 1, b = 0, c = 6 //BE({P1=false, P2=true}、 {F1, T2, F3, T4}) a = 1, b = 1, c = 1 //BD({P1=false, P2=false}、{F1, F2, F3, F4})
六、路径覆盖:设计足够多的用例来使程序中所有可能的路径都至少被执行一次。
所有可能的路径为:{BD、BE、CD、CE}。
对于BD,我们可以取{a=1, b=1, c=1};
对于BE,我们可以取{a=1, b=0, c=6};
对于CD,我们可以取{a=2, b=0, c=1};
对于CE,我们可以取{a=5, b=0, c=6}。
于是,测试用例为:
a = 1, b = 1, c = 1 //BD({P1=false, P2=false}、{F1, F2, F3, F4}) a = 1, b = 0, c = 6 //BE({P1=false, P2=true}、 {F1, T2, F3, T4}) a = 2, b = 0, c = 1 //CD({P1=true, P2=false}、{T1, T2, F3, T4}) a = 5, b = 0, c = 6 //CE({P1=true, P2=true}、 {T1, T2, T3, T4})
注:一般测试中,很难做到路径覆盖,对于此题,可以穷举出4条路径,可是如果在外层加一个循环的话,那么路径条数将呈现指数型增长。比如循环30次,那么路径条数将会是4^30(4的30次幂),要想做到路径覆盖是不可能的。
原文地址:http://blog.csdn.net/liujian619/article/details/45270813