A.7 用JUnit进行测试
刚开始编写方法时,初学者通常会这样进行测试:在方法 main 中调用这些方法,并以人工方式检查结果。可能需要经常编写这样的代码,可用工具来简化这种工作。在知道正确结果的情况下,可编写单元测试(unit test)来更好地执行测试工作。
例如,要测试 6.9 节的方法 fibonacci,可编写下面的代码:
public static void main(String[] args) {if (fibonacci(1) != 1) {System.err.println("fibonacci(1) is incorrect");}if (fibonacci(2) != 1) {System.err.println("fibonacci(2) is incorrect");}if (fibonacci(3) != 2) {System.err.println("fibonacci(3) is incorrect");}}
这些测试代码的作用不言自明,但没必要这么长,可扩展性也不佳。另外,错误消息提供的信息也很有限。用单元测试框架可解决这些问题以及其他的问题。
JUnit 是一个常用的 Java 程序测试工具(参见 http://junit.org)。要使用它就必须创建包含测试方法的测试类:如果要测试的类名为 Class,则测试类应名为 ClassTest;如果类 Class 包含名为 method 的方法,TestClass 类应包含名为 testMethod 的方法。
例如,假设方法 fibonacci 属于类 Series,则相应的 JUnit 测试类和测试方法如下:
import junit.framework.TestCase;public class SeriesTest extends TestCase {public void testFibonacci() {assertEquals(1, Series.fibonacci(1));assertEquals(1, Series.fibonacci(2));assertEquals(2, Series.fibonacci(3));}}
这个示例使用了关键字 extends,这意味着新类 SeriesTest 继承了从包 junit.framework 中导入的既有类 TestCase。
很多开发环境能够自动生成测试类和测试方法。在 DrJava 中,可选择菜单 File>New JUnit Test Case 来生成空的测试类。
assertEquals 是由 TestCase 类提供的,它接受两个实参,并检查它们是否相等。如果相等,它就什么都不做;否则,就显示一条详细的错误消息。通常情况下,第一个实参为预期的值,即我们认为正确的值,而第二个实参是要检查的实际值。如果它们不相等,则未通过测试。
相比于自己编写 if 语句和 System.err 消息,用 assertEquals 更简洁。JUnit 还提供了其他断言方法,如 assertNull、assertSame 和 assertTrue,它们可用于设计各种各样的测试。
要想在 DrJava 中直接运行 JUnit 测试,可单击工具栏中的 Test 按钮。如果所有的测试方法都通过了,右下角将出现一个绿条;否则 DrJava 将把你带到第一个失败的断言处。
