这是一个超级简单的例子,在C这里,来说明一个微妙的错误,我不知道如何公开通过测试的错误。如何设计软件测试的细微的错误
考虑:
#include <stdio.h>
int main()
{
int a;
int b;
int input;
printf("Enter 1 or 2: ");
scanf("%d", &input);
switch(input) {
case 1:
a = 10;
/* ERROR HERE, I FORGOT A BREAK! */
case 2:
b = 20;
break;
default:
printf("You didn't listen!\n");
return 1;
break;
}
if(input == 1) {
b = 30;
printf("%d, %d\n", a, b);
} else {
printf("%d\n",b);
}
return 0;
}
正如代码所指出的,一个break
缺少这样输入的时候1,它属于通过对病例2 1的输出,虽然它覆盖b
没有反映这后来。因此,我们可以设计的所有测试,例如通过输入来自集合{1, 2, 10}
的数字,都会产生正确的输出。
在现实中,switch
里面的分配可能会非常昂贵,所以这种错误可能是相当昂贵的。但是,假设从第一天开始就是这样写的,没有基准来看到成本高于预期。
那么,什么可以做,以冲洗掉这些类型的错误?有没有办法设计测试用例以在生产软件中公开它?
编辑 所以我想我并不完全清楚 - 我写在C来说明类型中遇到的问题,但实际上它不是具体到C.我想点make是代码进入我们从未打算进入的部分(在这种情况下是因为忘记了break
来说明这一点)。我的实际情况是Fortran代码有700,000行,它正在进入我们从未打算过的分支机构,因为从语言的角度来看这是合法的,但是可能非常昂贵。
是否有可能设计一个测试或从某个工具看一些数据,它会告诉我们它将进入不应该的分支?我通过打印“我不应该在这里!在所有的案例中,看到它被打印出来,那么比随机查看和放置打印语句更好。
这个具体的例子,你会期望在case 1的输出中看到'b = 30',事实上你会看到'b = 30'。无论如何,C的选择只是为了说明我试图提出的观点。我更新了这个问题来澄清。 – tpg2114