闲逛东大浦口图书馆,看到《单元测试之道——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 已经捕获了这个异常。
好了,今天就写到这里,下次有更精彩的内容哦。