Junit 從問世至今已有 12 年的歷史,期間功能不斷完善,用戶逐漸擴大,已經成為 Java 軟件開發(fā)中應用為廣泛的測試框架。本文著重介紹 JUnit 的核心接口、核心類以及 TestCase 的生命周期,以便讀者從架構層面掌握這個工具。
1997 年,Erich Gamma 和 Kent Beck 為 Java 語言創(chuàng)建了一個簡單但有效的單元測試框架,稱作 JUnit。JUnit 很快成為 Java 中開發(fā)單元測試的框架標準。世界上無數(shù)軟件項目使用它。本文將介紹 JUnit 的核心接口,核心類以及 JUnit 的生命周期。
JUnit 核心接口及核心類
了解 JUnit 的生命周期之前,先了解 JUnit 的核心接口和類是有必要的,這對于了解 TestCase 的生命周期有很大的幫助。
Test:是 TestCase、TestSuite 的共同接口。run(TestResult result) 用來運行 Test,并且將結果保存到 TestResult。
TestCase:Test 的接口的抽象實現(xiàn),是 Abstract 類,所以不能實例化,能被繼承。其中一個構造函數(shù) TestCase(String name),根據(jù)輸入的參數(shù),創(chuàng)建一個測試實例。參數(shù)為該類的以 test 開頭的方法名,把它添加到 TestSuite 中,指定僅僅運行 TestCase 中的一個方法。
TestSuite:實現(xiàn) Test 接口?梢越M裝一個或者多個 TestCase。待測試類中可能包括了對被測類的多個 TestCase,而 TestSuit 可以保存多個 TestCase,負責收集這些測試,這樣可以一個 Suite 能運行對被測類的多個測試。
TestResult:保存 TestCase 運行中的事件。TestResult 有 List<TestFailure> fFailures 和 List<TestFailure> fErrors。fFailures 記錄 Test 運行中的 AssertionFailedError,而 fErrors 則記錄 Exception。Failure 是當期望值和斷言不匹配的時候拋出的異常,而 Error 則是不曾預料到的異常,如:ArrayIndexOutOfBoundsException。
TestListener:是個接口,對事件監(jiān)聽,可供 TestRunner 類使用。
ResultPrinter:實現(xiàn) TestListener 接口。在 TestCase 運行過程中,對所監(jiān)聽的對象的事件以一定格式及時輸出,運行完后,對 TestResult 對象進行分析,輸出的統(tǒng)計結果。
BaseTestRunner:所有 TestRunner 的超類。
java Junit.swingui.TestRunner:實現(xiàn) BaseTestRunner,提供圖形界面。從 4.0 版本起,沒有再提供這個類。這是 4.0 版本和之前版本的顯著變化之一。
java Junit.textui.TestRunner:實現(xiàn) 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);
}
}