我从《软件测试的艺术》一书中摘取了一个作者精心构造的代码片段。作者用这个代码片段做逻辑覆盖测试讲解的,我用它来做黑盒测试分析。
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;
}
}
等价类划分法难以适用,原因如下:
- 两条语句都可能会修改X的值。这导致两条if语句产生耦合性。测试时需要一起考虑这两条if语句。黑盒测试时要进行组合。白盒测试时需要进行路径覆盖。
- 第一条语句修改了X。但是之后,X又用于第二个判定中。这也导致两条if语句产生了耦合性。
如果程序如下:
public void foo(int A,int B,int C,int X,int Y) {
if(A>1 && B==0) {
X=X/A;
}
if(A==2 || C>1) {
Y=Y+1;
}
}
那么就可以将两条if语句分别进行测试。即黑盒测试时做等价类覆盖。白盒测试时做判定条件覆盖。
3. A用于两个判定中,并且两条语句都是对X进行修改。所以需要综合考虑A所在的两个条件的要求,来划分A的等价类。
比如下面的程序:
public void foo(int A,int X,int Y) {
if(A>1) {
X=X/A;
}
if(A==2) {
X=X+1;
}
}
可以划分出三个等价类。比如取值为2、3、0。
但是原来的程序中,因为A都只是判定中一个条件。还需要结合B或者X来决定判定的结果。这是多个输入的共同作用对输出产生影响。所以特定的A的等价类,不一定能对程序输出产生决定性影响。
原来的程序,适合使用因果图来进行案例设计。但是也许你不会画因果图,或者不想画因果图。没有关系,因为这个程序片段毕竟很短,很简单。直观来看,程序处理可能方式可能4种情况。即两条语句都执行、两条语句都不执行、只执行第一条语句、只执行第二条语句。这四种情况都要覆盖到。
但是并不能保证满足改进的判定条件覆盖,所以仍然会遗漏缺陷。需要补充用例,使之满足改进的判定条件覆盖。