JUnit源碼分析(二)
來源:互聯網
上載者:User
在上面我們已經提到了junit.extentions包中的內容TestSetup。來看看整個包的結構吧。
先簡要的介紹下包中各個類的功能。ActiveTestSuite對TestSuite進行了改進,使得每個test運行在一個單獨的線程裡面,並且只到所有的線程都結束了才會結束整個測試。ExceptionTestCase是對TestCase進行的改進,可以方便的判斷測試類別是否拋出了期望的異常。而剩下的三個類,大概你看的出來是使用了裝飾模式來設計的。其中TestDecorator為具體裝飾類制定好了使用規則,RepeatedTest和TestSetup則是具體實現的裝飾類。
那為什麼extentions包中ActiveTestSuite和ExceptionTestCase沒有使用裝飾模式呢?原因在於裝飾模式在結構上要求存在類似於組合模式的遞迴。而對於已有的TestCase和TestSuite來說,直接繼承它們要比構建一個新的遞迴結構要來得快得多而且簡單;並且這些增強功能都只是針對TestCase或者TestSuite。使用了裝飾模式來擴充的類與以上不同的是,它們功能的增強是針對任何Test實現的。如果不採用裝飾模式同樣的功能要為TestCase、TestSuite以及以後的其他Test實現分別寫出子類。因此使用裝飾模式能夠很巧妙的解決這個問題。
下面來介紹下junit.runner包。上面已經提到,對於JUnit使用者來說,它可說是完全透明的,這個包裡面提供了JUnit自己的測試類別載入。下面就是包中所有類的關係圖。
沒有什麼好講的,都是使用反射機制來將測試類別載入進來,還有讀取properties檔案的操作。如果想學習下反射機制的應用可以閱讀這部分的源碼。
剩下的三個包這裡也不作介紹,大部分的內容都是GUI的繪製(當然junit.textui包除外)。
JUnit中還使用了觀察者模式來完成單元測試結果的自動更新(詳細內容請見我關於觀察者模式的文章)。
這樣,對JUnit的整體架構有了全面的認識。總體來說各個包分工明確,設計上採用了必要的設計模式來增強了擴充性和重用性,很值得學習和借鑒。