在上面我們已經提到了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的整體框架有了全面的認識?傮w來說各個包分工明確,設計上采用了必要的設計模式來增強了擴展性和重用性,很值得學習和借鑒。
延伸閱讀
文章來源于領測軟件測試網 http://www.kjueaiud.com/