一个小的单元测试

软件工程课堂上对于一个求最值函数进行了一个小的测试,最值函数如下:

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.

     仅仅是一个最值的小函数的测试,就暴露出了自身的许多问题:考虑问题不全面,选用的数据不能进行全面的测试;最值函数出现的问题也是我们编程时很容易出现的问题,这些我们平时都很难注意到。所以再以后编程时应尽量考虑全面,注意细节,再对函数进行测试时要特别注意测试数据的选用。

     最后说明一下,在函数运行时本应出现的许多问题都没有显现出来,这应该是编译环境的问题。也就是说上面的程序换一种编译环境很可能会出现错误。这也是我们经常遇到的问题,一个同样的程序有的环境能运行出来,有的不能。程序本身有问题就是其中的一个答案。通过这个小测试应该学到了很多东西。

  

posted @ 2014-03-08 13:25  季节的风  阅读(228)  评论(1编辑  收藏  举报