一个小的单元测试
软件工程课堂上对于一个求最值函数进行了一个小的测试,最值函数如下:
int Largest(int list[],int length)
{
int i,max;
for(i=0;i<(length-1);i++)
{
if(list[i]>max)
{
max=list[i];
}
}
return max;
}
虽然只是一个小程序,但是却暴露出许多问题,直到老师说明才突然发现,这个函数存在许多漏洞。而有一些是连小测试都没有发现的。整个程序代码如下:
#include<stdio.h>
int Largest(int list[],int length)
{
int i,max;
for(i=0;i<=(length-1);i++)
{
if(list[i]>max)
{
max=list[i];
}
}
return max;
}
int main()
{
int k,m,a[5];
printf("输入数据个数:");
scanf("%d",&m);
printf("输入%d个数据:",m);
for(int n=0; n<m;n++)
{
scanf("%d",&a[n]);
}
k=Largest(a,m);
printf("%d",k);
return 0;
}
对这个小程序进行了5组数据测试,分别是 1 3 6 8 9
2 6 7 8 10
-1 -6 -9 -7 -5
-4 5 9 -5 3
-4 0 8 7 -2
在编译时未出现错误及警告,但数据并不是预想中的结果,调试发现参与比较的数据似乎只有前四个。所以首先改正了 for(i=0;i<(length-1);i++)的错误,改为
for(i=0;i<=(length-1);i++)这样就能得到预想结果,似乎程序并没有问题。经老师提醒才发现选用的数据并不完善,包含诸多问题没有测试到:
第一就是,没有进行数据相等的数据比较:
第二,极端测试,没有输入数据为空的情况
第三,没有输入数据个数与所要求个数不等的情况
第四,max的值没有进行初始化
第四点是最应该出现的问题,没有初始化,会造成max的值不确定,在比较过程会出现错误,例如max值得内存空间本来有数值10,在测试的第一组数据中会出现结果为10,这是预想不到的结果,另外在初始化时,也不能初始化为0,否则会在进行负数比较时输出结果为0.
仅仅是一个最值的小函数的测试,就暴露出了自身的许多问题:考虑问题不全面,选用的数据不能进行全面的测试;最值函数出现的问题也是我们编程时很容易出现的问题,这些我们平时都很难注意到。所以再以后编程时应尽量考虑全面,注意细节,再对函数进行测试时要特别注意测试数据的选用。
最后说明一下,在函数运行时本应出现的许多问题都没有显现出来,这应该是编译环境的问题。也就是说上面的程序换一种编译环境很可能会出现错误。这也是我们经常遇到的问题,一个同样的程序有的环境能运行出来,有的不能。程序本身有问题就是其中的一个答案。通过这个小测试应该学到了很多东西。