隨專案規模增長,缺乏有效測試流程會導致問題積累、版本演變失控。單元測試是品質防線的基石,助力早期發現缺陷、支援持續整合與快速回饋。
junit.framework(測試物件模型)、junit.runner(測試驅動執行)。setUp()/tearDown() 模板方法,管理測試夾具。run(TestResult)、countTestCases(),為 TestCase/TestSuite/TestDecorator 共同介面。addError、addFailure、startTest、endTest,TestRunner 實作此介面以處理事件。run() 遞歸執行,構成「部分-整體」層級結構。TestCase.runBare() 定義 setUp → runTest → tearDown 骨架,子類別覆寫具體步驟。testXxx 方法)與 TestRunner。TestRunner.run(suite) → 內部 doRun() 建立 TestResult。suite.run(result) 迭代執行每個 TestCase:result.startTest(test)test.runBare() 執行模板方法runProtected() 捕獲異常分類(AssertionFailedError→Failure、ThreadDeath→重拋、其他→Error)result.endTest(test)public void runProtected(Test test, Protectable p) {
try { p.protect(); } // 實際執行 test.runBare()
catch (AssertionFailedError e) { addFailure(test, e); }
catch (ThreadDeath e) { throw e; } // 確保線程真正終止
catch (Throwable e) { addError(test, e); }
}
三層異常體系:Failure(可預測)、Error(意外)、SystemError(線程死亡級,極罕見)。
runTest() 謹慎:預設調用 fName 對應方法;若不使用 TestSuite 載入則需覆寫,但不利整合。System.out 輸出:干擾 JUnit 報告,改用日誌框架或獨立輸出流。junit.extensions 提供 ActiveTest(多線程)、TestDecorator(裝飾器模式擴展功能)、RepeatedTest(重複執行)等。


JUnit 以精簡核心(結果集與案例集)支撐強大擴展性,Composite 與 Template Method 模式使測試組織靈活、生命週期可控。深入理解內部機制,能編寫更健壯、可維護的測試代碼,並根據需求擴展框架功能。