离弦之Ray

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  55 Posts :: 0 Stories :: 33 Comments :: 0 Trackbacks

     闲逛东大浦口图书馆,看到《单元测试之道——java版》,早已闻此书之大名,借来一阅。

      JUnit有多重要等等就不多说了,如果你想接触它,Come on,书上有个简单的例子。下面是一个被测试的例子:

public class Largest {
     public static int largest(int[] list)
    {
          int index, max = Integer.MAX_VALUE;
          for(index=0;index<list.length-1;index++){
          if(list[index]>max)max=list[index];
          }
         return max;
         }
}
这是一段有错误的程序,明眼人应该能看出来,以它来说明JUnit的用法。
我使用的Eclipse 3.1 ,JDK是1.4.2版本的。

在此工程里新建一个JUnit Test Case(JUnit在整个工程中所占的位置在后面有说暂时就随意了,可以放在被测程序同一个package内,也可以重新新建一个package)

刚生成的Test Case是如下这样的
package com.test.ray;

import junit.framework.TestCase;

public class TestLargest extends TestCase {
}
标记红色是因为这是一个test case 一定要继承的,而上面引用进来的junit.framework.TestCase包含了一个TestCase的具体框架。

跟普通的类一样,它需要一个构造函数。
public TestLargest(String name)
 {
  super(name);
 }
其中的name到底是什么,下一篇再讲。
接下来就可以写测试函数了,如果你想让自己写的测试函数自动被编译器运行的话,请务必以test作为方法名的开头。
public void testSimple()
 {
  assertEquals(9,Largest.largest(new int[]{7,8,9}));
  assertEquals(-7,Largest.largest(new int[]{-8,-7,-9}));
 }

测试方法体一般是有断言组成的(关于断言的内容,以后再讲),第一个断言主要是测试边界的,可以看到9位于数组的最后,运行后可以在Eclipse里面看到一个红条,会有相关的错误信息。
junit.framework.AssertionFailedError: expected:<9> but was:<2147483647>
 从此你可以分析到,程序中循环语句判断条件应该是index<list.length,哈哈,一个错误找到了。

可是改过之后还是有错
仔细看看……
God,max的初始化!!!
可能很多人会想当然地把它改成max=0;
让我们看看接下来会发生什么。
junit.framework.AssertionFailedError: expected:<-7> but was:<0>
知道为什么了吗?如果数组里面有负数,得到的结果当然是0了。
应该是这样max=Integer.MIN_VALUE;
测试顺利通过!

其实这个程序还是有漏洞的,就是如果传入的数组是一个空数组的情况,可以这样改写
public class Largest {
 public static int largest(int[] list)
 {
  int index, max = Integer.MIN_VALUE;
  if(list.length==0){throw new RuntimeException("Empty list");}
  for(index=0;index<list.length;index++)
  {
   if(list[index]>max)max=list[index];
  }
  return max;
 }
}

对应的Test Case也改变一下
public class TestLargest extends TestCase {
 public TestLargest(String name)
 {
  super(name);
 }
 public void testSimple()
 {
  assertEquals(9,Largest.largest(new int[]{7,8,9}));
  assertEquals(-7,Largest.largest(new int[]{-8,-7,-9}));
 }
 public void testEmpty()
 {
  try{
   Largest.largest(new int[]{});
   fail("lallal");
   }catch(RuntimeException e){System.out.println("cuo la!");}
 }
}
增加了一个测试数组为空的测试方法,从Test Case下面的Console中可以知道Test Case 已经捕获了这个异常。

好了,今天就写到这里,下次有更精彩的内容哦。

 

posted on 2006-06-11 00:26 离弦之ray的技术天空 阅读(345) 评论(0)  编辑  收藏 所属分类: JUnit

只有注册用户登录后才能发表评论。


网站导航: