Junit 从问世至今已有 12 年的历史,期间功能不断完善,用户逐渐扩大,已经成为 Java 软件开发中应用为广泛的测试框架。本文着重介绍 JUnit 的核心接口、核心类以及 TestCase 的生命周期,以便读者从架构层面掌握这个工具。
1997 年,Erich Gamma 和 Kent Beck 为 Java 语言创建了一个简单但有效的单元测试框架,称作 JUnit。JUnit 很快成为 Java 中开发单元测试的框架标准。世界上无数软件项目使用它。本文将介绍 JUnit 的核心接口,核心类以及 JUnit 的生命周期。
JUnit 核心接口及核心类
了解 JUnit 的生命周期之前,先了解 JUnit 的核心接口和类是有必要的,这对于了解 TestCase 的生命周期有很大的帮助。
Test:是 TestCase、TestSuite 的共同接口。run(TestResult result) 用来运行 Test,并且将结果保存到 TestResult。
TestCase:Test 的接口的抽象实现,是 Abstract 类,所以不能实例化,能被继承。其中一个构造函数 TestCase(String name),根据输入的参数,创建一个测试实例。参数为该类的以 test 开头的方法名,把它添加到 TestSuite 中,指定仅仅运行 TestCase 中的一个方法。
TestSuite:实现 Test 接口。可以组装一个或者多个 TestCase。待测试类中可能包括了对被测类的多个 TestCase,而 TestSuit 可以保存多个 TestCase,负责收集这些测试,这样可以一个 Suite 能运行对被测类的多个测试。
TestResult:保存 TestCase 运行中的事件。TestResult 有 List<TestFailure> fFailures 和 List<TestFailure> fErrors。fFailures 记录 Test 运行中的 AssertionFailedError,而 fErrors 则记录 Exception。Failure 是当期望值和断言不匹配的时候抛出的异常,而 Error 则是不曾预料到的异常,如:ArrayIndexOutOfBoundsException。
TestListener:是个接口,对事件监听,可供 TestRunner 类使用。
ResultPrinter:实现 TestListener 接口。在 TestCase 运行过程中,对所监听的对象的事件以一定格式及时输出,运行完后,对 TestResult 对象进行分析,输出的统计结果。
BaseTestRunner:所有 TestRunner 的超类。
java Junit.swingui.TestRunner:实现 BaseTestRunner,提供图形界面。从 4.0 版本起,没有再提供这个类。这是 4.0 版本和之前版本的显著变化之一。
java Junit.textui.TestRunner:实现 BaseTestRunner,提供文本界面。下面将以它做为例子讲解 JUnit 生命周期。
TestCase 实例
了解了前面的几个类,下面将看一个例子:
Java代码
public class TestShoppingCart extends TestCase {
double unitPrice = 5;
int quantity = 6;
double discount=0.2;
@Before
public void setUp() throws Exception {
System.out.println(" Up ");
}
@After
public void tearDown() throws Exception {
System.out.println(" Down ");
}
public void testPay() {
double total = unitPrice * quantity;
assertEquals(30, total);
}
public void testPayWithDiscount() {
double total = unitPrice * quantity*(1-discount);
assertEquals(24.0, total);
}
}