單元測試是現代軟件開發的基石,而 JUnit 作為 Java 生態最經典的測試框架,掌握它是每位 Java 開發者的必修課。本文系統梳理 JUnit 核心概念、框架架構、安裝配置、常用 API 及最佳實踐,助你快速上手單元測試。
| 術語 | 定義 |
|---|---|
| 白盒測試 | 測試人員可見程式內部邏輯結構與代碼實現,針對內部路徑設計測試用例。 |
| 回歸測試 | 代碼修改或環境變更後的「再測試」,確保既有功能未被破壞,自動化工具極其適用。 |
| 單元測試 | 最小粒度測試,針對單個方法/類/功能塊,通常由開發人員編寫,需了解內部設計細節。 |
| JUnit | Java 版 xUnit 框架實例,開源、輕量,專為單元測試與回歸測試設計,支持白盒測試。 |
JUnit 採用 Composite 組合模式 設計,核心類包括:
Test 接口:測試運行與結果收集的統一入口,支援單一測試、套件聚合、裝飾器擴展。TestCase 抽象類:定義測試固件,含 setUp()(初始化)與 tearDown()(清理),每個測試方法執行前後自動調用。TestSuite:測試套件,聚合多個 TestCase,run() 時遞歸執行內部所有測試。TestResult:收集測試結果,記錄失敗、錯誤、耗時等統計信息。Assert 靜態類:31 組斷言方法(assertEquals、assertTrue、assertSame 等),失敗拋出 AssertionFailedError。TestListener / TestFailure:事件監聽與失敗詳情記錄。junit.jar 至本地目錄(如 C:\Junit3.8.1\junit.jar)CLASSPATH,追加 jar 路徑(以分號分隔)XxxTest 或 TestXxxtestXxx(),public void,無參數TestCasesetUp/tearDown 管理固件,別用構造函數super.setUp()/tearDown()UserService → UserServiceTestassert/fail 與異常斷言,代碼更簡潔Eclipse 內建 JUnit 插件,File → New → JUnit Test Case 即可向導式生成測試骨架,支援勾選被測方法自動生成測試模板,Run As → JUnit Test 一鍵執行並查看綠/紅條結果。
常見擴展組合:
// 被測類
public class Triangle {
private long a, b, c;
public Triangle(long a, long b, long c) { this.a=a; this.b=b; this.c=c; }
public boolean isTriangle() {
return a>0 && a<200 && b>0 && b<200 && c>0 && c<200
&& a < b+c && b < a+c && c < a+b;
}
public String getType() {
if (!isTriangle()) return "非三角形";
if (a==b && b==c) return "等邊三角形";
if (a!=b && b!=c && a!=c) return "不等邊三角形";
return "等腰三角形";
}
}
// 測試類
public class TriangleTest extends TestCase {
private Triangle t;
protected void setUp() { t = new Triangle(10, 2, 9); }
public void testIsTriangle() { assertTrue(t.isTriangle()); }
public void testIsType() { assertEquals("不等邊三角形", t.getType()); }
public static Test suite() { return new TestSuite(TriangleTest.class); }
public static void main(String[] args) {
junit.textui.TestRunner.run(suite());
}
}
掌握 JUnit,不僅是學會一個工具,更是建立「測試驅動開發」思維的起點。從今天開始,為每一個核心方法寫下第一個 testXxx() 吧!