核心概念解析
JUnit 是一個開源的 Java 測試框架,專為編寫與執行可重複的自動化測試而設計。它是 xUnit 單元測試框架體系在 Java 語言上的具體實現,廣泛應用於白盒測試與回歸測試。
- 白盒測試:測試人員可見程式內部邏輯結構與程式碼細節。
- 回歸測試:軟體修復或變更後的再測試,自動化工具極大提升此類測試效率。
- 單元測試:針對最小功能單元(如類別、方法)的測試,通常由開發人員編寫,需了解內部設計與實作。
單元測試的價值與對象
主要優勢
- 加速開發:自動化執行測試,大幅提升測試效率。
- 提升代碼品質:小版本持續整合、引入重構機制,使代碼更乾淨、彈性更強。
- 增強系統可靠度:作為回歸測試手段,確保修復後代碼正確性。
測試對象
- 面向過程開發:針對流程測試。
- 面向物件開發:針對物件(類別、方法、介面)測試,其中方法測試最常見。
主流工具
xUnit 系列框架佔據主導地位,依語言分為 JUnit (Java)、CppUnit (C++)、NUnit (.NET)、PHPUnit (PHP) 等。JUnit 由 Erich Gamma(《設計模式》作者)與 Kent Beck (XP 創始人) 共同開發,是單元測試框架的鼻祖。
JUnit 核心架構與關鍵類別
框架組成
- TestCase(測試用例):封裝單一測試邏輯的方法集合。
- TestSuite(測試套件):聚合多個 TestCase,支援巢狀組合,採用 Composite 設計模式。
- TestResult(測試結果):記錄測試執行結果、失敗與錯誤資訊。
- TestListener(事件監聽器):監聽測試生命週期事件(開始、結束、錯誤、失敗)。
- TestFailure(失敗元素):描述測試與預期不符的具體情況。
關鍵介面與類別詳解
- Test 介面:定義
run(TestResult) 與 countTestCases(),為 TestCase、TestSuite、TestDecorator 共同介面。
- TestCase 抽象類別:實作 Test 介面,提供
setUp()(每個測試方法前執行初始化)與 tearDown()(每個測試方法後釋放資源)模板方法。開發者繼承此類並實作測試邏輯。
- Assert 靜態類別:提供 31 組斷言方法(基礎、數值、字串、布林、物件等)。
assertEquals 使用 equals() 比較內容;assertSame 使用 == 比較引用。失敗拋出 AssertionFailedError。
- TestSuite 類別:收集、組織多個測試用例,支援批次執行。對測試類別有六大約定(public、繼承 TestCase、方法 public void、方法名以 test 開頭、無參數)。
- TestResult 與 TestListener:收集結果並通知監聽器,支援圖形/文字介面測試運行器。
Eclipse 整合 JUnit 實戰
環境配置
Eclipse 內建 JUnit 插件(支援 3.8.1 / 4.x)。需將 JUnit JAR 加入專案 Build Path:專案右鍵 → Properties → Java Build Path → Libraries → Add Variable → 設定 JUNIT_LIB 指向 junit.jar。
建立測試用例步驟
- 右鍵目標類別 → New → JUnit Test Case。
- 填寫測試類名稱、超類別(JUnit 3 為
junit.framework.TestCase,JUnit 4 為 java.lang.Object)、被測類別、來源資料夾、套件名,勾選生成 setUp/tearDown。
- 在 Test Methods 頁面勾選欲測試的方法,完成生成骨架代碼。
- 編寫具體測試邏輯(斷言、資料準備等)。
- Run As → JUnit Test,綠條代表通過,紅條顯示失敗方法。
範例:測試 HelloWorld 類別
測試 sayHello() 與 add() 方法,Eclipse 自動生成測試模板,填入斷言邏輯後即可執行驗證。
編寫高品質 TestCase 的六大原則
- 獨立性:一個 TestCase 只測一個物件;一個 TestMethod 只測一個方法,便於定位錯誤。
- 命名規範:測試方法命名建議為
原方法名 + Test(如 addTest)。
- 失敗訊息明確:斷言加入說明訊息,如
assertTrue("balance should be positive", balance > 0)。
- 覆蓋易變動點:頻繁修改的方法必測;單純 getter/setter 若為 IDE 生成可略過,手寫建議測試。
- setUp/tearDown 通用性:僅包含所有測試方法共用的初始化/清理邏輯,避免特定方法耦合。
- 代碼組織:測試代碼與產品代碼同套件、不同目錄(如
src/main/java vs src/test/java),便於存取 protected 成員、管理打包發布。