您的位置:首页 > 其它

白盒测试实例

2010-09-01 09:42 141 查看
三角形的问题在很多软件测试的书籍中都出现过,问题虽小,五脏俱全,是个很不错的软件测试的教学例子。本文借助这个例子结合教学经验,从更高的视角来探讨需求分析、软件设计、软件开发与软件测试之间的关系与作用。

  题目:根据下面给出的三角形的需求完成程序并完成测试:

  一、输入条件:

  1、 条件1:a+b>c

  2、 条件2:a+c>b

  3、 条件3:b+c>a

  4、 条件4:0<a<200

  5、 条件5:0<b<200

  6、 条件6:0<c<200

  7、 条件7:a==b

  8、 条件8:a==c

  9、 条件9:b==c

  10、条件10:a2+b2==c2

  11、条件11:a2+ c2== b2

  12、条件12:c2+b2== a2

  二、输出结果:

  1、不能组成三角形

  2、等边三角形

  3、等腰三角形

  4、直角三角形

  5、一般三角形

  6、某些边不满足限制

  很多初学者一看到这个需求(详见白盒测试实例之一——需求说明收藏),都觉得很简单,然后立刻就开始动手写代码了,这并不是一个很好的习惯。如果你的第一直觉也是这样的,不妨耐心看到文章的最后。

  大部分人的思路:

  1、首先建立一个main函数, main函数第一件事是提示用户输入三角形的三边,然后获取用户的输入(假设用户的输入都是整数的情况),用C语言来写,这一步基本上不是问题(printf和scanf),但是要求用java来写的话,很多学生就马上遇到问题了,java5.0及之前的版本不容易获取用户的输入。

  点评:这样的思路做出来的程序只能通过手工方式来测试所有业务逻辑,而且这个程序只能是DOS界面版本了,要是想使用图形化界面来做输入,就得全部写过代码。

 2、业务处理流程的思路用流程图表示如下:

  


  3、C语言代码:

    1. #include<stdio.h>
    2. void main()
    3. {
    4.   int a, b, c;
    5.   printf("please enter three integer:");
    6.   scanf("%d%d%d", &a, &b, &c);
    7.   if(0<a && a<200 && 0<b && b<200 && 0<c && c<200)
    8.   {
    9.     if(a+b>c && a+c>b && c+b>a)
   10.     {
   11.       if(a==b && b==c && a==c)  //这里可以省掉一个判断
   12.       {
   13.         printf("1是等边三角形");
   14.       }
   15.       else
   16.       {
   17.         if(a==b || b==c || a==c)
   18.         {
   19.           printf("2是等腰三角形");
   20.         }
   21.         else
   22.         {
   23.           if(a*a+b*b==c*c || a*a+c*c==b*b || b*b+c*c==a*a)
   24.           {
   25.             printf("3是直角三角形");
   26.           }
   27.           else
   28.           {
   29.             printf("4是一般三角形");
   30.           }
   31.         }
   32.       }
   33.     }
   34.     else
   35.     {
   36.       printf("5不能组成三角形");
   37.     }
   38.   }
   39.   else
   40.   {
   41.     printf("6某些边不满足限制");
   42.   }
   43. }


点评:这样的思路做出来的程序只能通过手工方式来测试所有业务逻辑,而且这个程序只能是DOS界面版本了,要是想使用web或图形化界面来做输入,就得全部写过代码。


  需求分析是后续工作的基石,如果分析思路有问题,后续工作可能就会走向不正确的方向,比如:代码重用性差、难于测试、难于扩展和难于维护等。反而,如果需求分析做的好,对设计、开发和测试来说,都可能是很大的帮助。

  看到题目给出的条件达12个之多,粗粗一看,好像很复杂,但仔细分析之后,发现可以把它们分成4组来讨论:

  1、 条件1:a+b>c; 条件2:a+c>b; 条件3:b+c>a

  这三个表达式有什么特点呢?实际上它们的逻辑是一样的:两个数之和大于第三个数。那么,前面程序的写法就存在逻辑重复的地方,应该把这个逻辑提取到一个函数中。

  2、 条件4:0<a<200; 条件5:0<b<200; 条件6:0<c<200

  这三个表达式也是同一个逻辑:判断一个数的范围是否在(0, 200)区间内,也应该把这个逻辑提取到一个函数中,去掉重复的逻辑,提高代码的可重用性。

  可重用性的好处:比如,现在用户的需求改为了三条边的取值范围要改为[100,400],那么,按前面的思路来说,需要改3个地方,而现在只需要在一个函数里改1个地方,这就是代码重用的好处。

  3、条件7:a==b; 条件8:a==c; 条件9:b==c

  这三个表达式的逻辑:判断两个数是否相等。也应该把它提取到一个函数中。

  我们进一步来分析一下判断是否是等边三角形或等腰三角形的条件:

  (1)前面程序的判断是从最直观的方式(a==b && b==c && a==c)(实际上只需要两个表达式成立即可)三条边都相等来判定是等边三角形;(a==b || b==c || a==c)只有两条边相等来判定是等腰三角形。

(2)转变一下思路:给定三个整数,然后用一个函数来判断这三个整数有几个相等,返回相等的个数,如果返回值等于3,那么它是等边三角形,如果返回值是2,那么它是等腰三角形,否则,它是一般三角形(如果不是直角三角形的话)。

  4、条件10:a2+b2==c2 条件11:a2+ c2== b2 条件12:c2+b2== a2

  这三个条件的处理方式有两种:

  (1)跟前面三组分析一样,把相同的逻辑提取到一个函数中,然后三次调用。

  (2)根据直角三角形的特点:斜边是最长的,所以我们可以事先写一个函数来找到最长的边,然后把它赋值给c,这样处理之后,只需要一次调用判定(a2+b2==c2)的函数了。

  程序设计对于软件的质量和软件实施过程的难易程度起着至关重要的作用。好的设计,即使聘用没什么经验的开发人员都很容易产生出高质量的代码出来;而差的设计,即使是经验很丰富的开发人员也很容易产生缺陷,特别是可重用性、可测试性、可维护性、可扩展性等方面的缺陷。

  经过以上的分析,下面来看一下如何设计。在下图中,每个方框都使用一个函数来实现,为了跟用户界面分开,最顶上的函数不要写在main函数中。

  把思路用流程图的方式表达出来,不用停留在脑袋里:

  


  具体的函数的调用关系图:

  


  复杂模块triangleType的流程图:

  


http://tech.ddvip.com/2009-02/1234227697107965_4.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: