分类:
2012-05-19 12:24:11
原文地址:JUnit中Failure、Error区别 作者:fucuihong
在运行TestRunner执行您的测试时,您会发现到有Failure与Error两种测试尚未通过的讯息。
Failure指的是预期的结果与实际运行单元的结果不同所导致,例如当您使用assertEquals()或其它assertXXX()方法断言失败时,就会回报Failure,这时候您要检查您的单元方法中的逻辑设计是否有误。
Error指的是您程式没有考虑到的情况,在断言之前程式就因为某种错误引发例外而终止,例如在单元中存取某个阵列,因为存取超出索引而引发 ArrayIndexOutOfBoundsException,这会使得单元方法无法正确完成,在测试运行到asertXXXX()前就提前结束,这时候您要检查您的单元方法中是否有未考虑到的情况而引发流程突然中断。
来看个实际的例子,如果您设计了下面的测试案例:
ObjectArrayTest.java
package onlyfun.caterpillar.test;
import onlyfun.caterpillar.ObjectArray;
import junit.framework.TestCase;
public class ObjectArrayTest extends TestCase {
public void testAdd() {
ObjectArray objArr = new ObjectArray();
Object testObj = new Object();
Object obj = objArr.setObject(0, testObj);
assertEquals(testObj, obj);
}
public static void main(String[] args) {
junit.textui.TestRunner.run(ObjectArrayTest.class);
}
}
然后根据这个测试案例,您撰写了ObjectArray类别:
ObjectArray.java
package onlyfun.caterpillar;public class ObjectArray { private Object[] objs; public Object setObject(int i, Object o) { return objs[i]; }}
接下来运行TestRunner,您发现程式回报了Error:
.E
Time: 0
There was 1 error:
1) testAdd(onlyfun.caterpillar.test.ObjectArrayTest)
java.lang.NullPointerException
....
....
FAILURES!!!
Tests run: 1, Failures: 0, Errors: 1
仔细看一下您所设计的ObjectArray类别,显然程式撰写的太勿忙,忘了初始化Object阵列了,因而引发了 NullPointerException,这是程式设计上的错误,使得尚未进行断言之前就引发例外中断,所以修正一下ObjectArray,提供一个建构函式,预设产生长度为10的阵列:
ObjectArray.java
package onlyfun.caterpillar;
public class ObjectArray {
private Object[] objs;
public ObjectArray() {
objs = new Object[10];
}
public Object setObject(int i, Object o) {
return objs[i];
}
}
再运行一次TestRunner,这次Error没了,但是有Failure:
.F
Time: 0
There was 1 failure:
1) testAdd(onlyfun.caterpillar.test.ObjectArrayTest)
junit.framework.AssertionFailedError:
expected:<> but was:
....
....
FAILURES!!!
Tests run: 1, Failures: 1, Errors: 0
这表示可以执行到assertEquals()完毕,但是断言失败,所以再设计程式以消除Failure:
ObjectArray.java
package onlyfun.caterpillar;
public class ObjectArray {
private Object[] objs;
public ObjectArray() {
objs = new Object[10];
}
public Object setObject(int i, Object o) {
objs[i] = o; return objs[i];
}
}
再次运行TestRunner,这次应该可以通过测试了。
如果您的单元在执行时,使用throws声明会丢出某些例外,例如IOException,您希望可以在testXXXX()中测试例外是否真的被丢出,您可以使用try.....catch来处理,下面这个程式是个实例,假设java.io.FileReader是您所设计的类别,您提供一个测试档案 test.txt:
FileReaderTest.java
package onlyfun.caterpillar.test;
import java.io.*;
import junit.framework.TestCase;
public class FileReaderTest extends TestCase {
public void testClose() throws IOException {
FileReader reader = new FileReader("test.txt");
reader.close();
try {
reader.read();
fail("reading file after closed" + " and didn't throw IOException");
}
catch(IOException e) {
assertTrue(true);
}
}
public static void main(String[] args) {
junit.textui.TestRunner.run(FileReaderTest.class);
}
}
您所测试的可能是一个预期会丢出的例外,您想要看看当错误的情况成立时,是不是真会丢出例外,例如 testClose() 测试FileReader 在close()之后如果再read(),是不是会如期丢出IOException,您先行在方法中用try....catch捕捉了这个例外,如果没有如期丢出例外,则不会被catch捕捉,而程式流程继续往下,执行到 fail() 陈述,这表示例外处理没有发生,此时主动丢出一个Failure,表示程式的执行并不如您所预期的。