隨著軟體項目的逐漸增大,軟體測試在軟體開發中的地位顯得越來越重要。如果軟體項目沒有良好的測試流程,隨著系統的增大,無論專案管理人員還是軟體開發人員都會對項目的前景失去信心,甚至會對項目的目標產生分歧,因為長期以來沒有對程式碼和系統設計進行有效控制,很多問題都被暫時掩蓋或逐漸演化成其他的問題。軟體開發週期越長,就會使得問題進化的版本越多,最後造成的結果是“剪不斷,理還亂”。
單元測試是整個測試流程中最基礎的部分,它們要求程式員儘可能早地發現問題,並給予控制,這是其一。另外,如果整合測試出現問題,它們可以協助診斷。這樣就為在軟體開發流程中建立高效的事件反應機制打下了堅實基礎。
JUnit就是為Java程式開發人員實現單元測試提供一種架構,使得Java單元測試更規範有效,並且更有利於測試的整合。
JUnit的內部結構
JUnit的軟體結構
JUnit 共有七個包,核心的包就是junit.framework 和junit.runner。Framework包負責整個測試對象的構架,Runner負責測試驅動。
JUnit的類結構
JUnit有四個重要的類:TestSuite、TestCase、TestResult、TestRunner。前三個類屬於Framework包,後一個類在不同的環境下是不同的。這裡使用的是文本測試環境,所以用的是 junit.textui.TestRunner。各個類的職責如下:
1.TestResult,負責收集TestCase所執行的結果,它將結果分為兩類,客戶可預測的Failure和沒有預測的Error。同時負責將測試結果轉寄到TestListener(該介面由TestRunner繼承)處理;
2.TestRunner,客戶對象調用的起點,負責對整個測試流程的跟蹤。能夠顯示返回的測試結果,並且報告測試的進度。
3.TestSuite, 負責封裝和運行所有的TestCase。
4.TestCase, 客戶測試類別所要繼承的類,負責測試時對客戶類進行初始化,以及測試方法調用。
另外還有兩個重要的介面:Test和TestListener。
1.Test, 包含兩個方法:run() 和countTestCases(),它是對測試動作特徵的提取。
2.TestListener, 包含四個方法:addError()、addFailure()、startTest()和endTest(),它是對測試結果的處理以及測試驅動過程的動作特徵的提取。
下面給出的兩個類圖(篇幅有限,只顯示主要部分)很好地闡明了類之間的關係,以及junit的設計目標(如圖1)。測試案例的類採用Composite模式。這樣,客戶的測試對象就轉變成一個“部分—整體”的階層。客戶代碼僅需要繼承類TestCase,就可以輕鬆的與已有的其他對象組合使用,從而使得單元測試的整合更加方便。
圖1 測試結構圖