问题描述
在我的教科书中,这个问题的解决方案是测试用例的最小数量是 3。但是,对于完整的边缘和条件覆盖,我不能低于 4。
int x=0;
int k=10;
while (x<=10 && z>0) {
if (z<=y && k>=x)
y=y-z;
k--;
if (y>0) x++;
else break;
}
我的解决方案是这样的:{z=1,y=0},{z=-1,{z=1,y=10},y=3}
。其中哪些(如果有)是多余的?
解决这个问题的三个测试用例组合是什么?还是我的教科书有错误?
解决方法
奇怪的功能。
如下所示,只看 x
,有许多有趣的区域,每个区域都值得一个测试向量。
我不同意“最少测试用例数为 3”。
struct kx {
int k,x;
};
struct kx foo(int z,int y) {
int x = 0;
int k = 10;
while (x <= 10 && z > 0) {
if (z <= y && k >= x)
y = y - z;
k--;
if (y > 0)
x++;
else
break;
}
struct kx r = {k,x};
return r;
}
int main(void) {
for (int z = -2; z <= 12; z++) {
for (int y = -2; y <= 20; y++) {
struct kx newest = foo(z,y);
printf(" %2d",newest.x);
}
printf("\n");
}
}
输出
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 1 2 3 4 5 11 11 11 11 11 11 11 11 11 11 11 11 11 11
0 0 0 11 0 11 1 11 2 11 3 11 4 11 5 11 11 11 11 11 11 11 11
0 0 0 11 11 0 11 11 1 11 11 2 11 11 3 11 11 4 11 11 5 11 11
0 0 0 11 11 11 0 11 11 11 1 11 11 11 2 11 11 11 3 11 11 11 4
0 0 0 11 11 11 11 0 11 11 11 11 1 11 11 11 11 2 11 11 11 11 3
0 0 0 11 11 11 11 11 0 11 11 11 11 11 1 11 11 11 11 11 2 11 11
0 0 0 11 11 11 11 11 11 0 11 11 11 11 11 11 1 11 11 11 11 11 11
0 0 0 11 11 11 11 11 11 11 0 11 11 11 11 11 11 11 1 11 11 11 11
0 0 0 11 11 11 11 11 11 11 11 0 11 11 11 11 11 11 11 11 1 11 11
0 0 0 11 11 11 11 11 11 11 11 11 0 11 11 11 11 11 11 11 11 11 1
0 0 0 11 11 11 11 11 11 11 11 11 11 0 11 11 11 11 11 11 11 11 11
0 0 0 11 11 11 11 11 11 11 11 11 11 11 0 11 11 11 11 11 11 11 11
,
实现 100% 条件覆盖的最小测试用例数确实是 3。
以下是测试用例:{z=10,y=1},{z=1,y=10}
要实现完整的条件覆盖,条件中的每个布尔表达式都必须分别计算为每个 true
和 false
。
对于 if (z<=y && k>=x)
条件
z<=y : true
k>=x: true
z<=y : true
k>=x: false
z<=y : false
k>=x: false
z<=y : false
k>=x: true
对于 if(y>0)
条件
y>0: true
y>0:false
请注意,由于存在修改变量值的 while 循环,因此在一个测试用例中可以覆盖多个布尔表达式。
第一个测试用例{z=10,y=1}
涵盖
z<=y : false
k>=x: false
z<=y : false
k>=x: true
y>0: true
第二个测试用例{z=1,y=1}
涵盖
z<=y : true
k>=x: true
y>0:false
第三个测试用例{z=1,y=10}
覆盖了剩下的布尔表达式
z<=y : true
k>=x: false
这样就覆盖了代码中每个条件中的每个布尔表达式,从而确保了 100% 的条件覆盖
您可以在 if 语句之前打印到控制台所需的表达式的布尔值,以确保条件中的每个布尔表达式都分别计算为 true
和 false
。
int x=0;
int k=10;
while (x<=10 && z>0) {
System.out.println((z<=y),(k>=x))
if (z<=y && k>=x)
y=y-z;
k--;
System.out.println((y>0))
if (y>0) x++;
else break;
}