轉自:http://blog.sina.com.cn/s/blog_6cf812be0100wbhw.htmlhtml
以前咱們看到了Test接口裏面的run方法有個TestResult的參數,不錯,這個類就是用來收集測試結果的,是收集TestSuite的運行結果,因此通常狀況下,一個TestSuite對應一個TestResult. TestResult存儲了全部測試的詳細狀況,是經過仍是失敗。設計模式
若是是失敗:Junit會建立一個TestFailure對象,並保存在TestResult中。框架
這裏知道了TestResult的做用,這種作法也會引入另一個設計模式。測試
Java設計模式:Collecting Parameter模式ui
定義:當你須要從幾個方法中收集結果時,你應當給方法增長一個參數,並傳遞一個會替你收集參數的對象。url
這裏TestResult類就是起到了這個做用。可是咱們知道TestResult是收集不少運行的Test的運行結果,這裏就須要對於這些運行結果進行管理,則TestResult類定義了以下相關的方法:設計
public synchronized void addError(Test test, Throwable t) 新增一個錯誤到ArrayList<TestFailure>。server
public synchronized void addFailure(Test test, AssertionFailedError t) 新增一個失敗到ArrayList<TestFailure>。htm
public synchronized void addListener(TestListener listener) 在一個test中註冊一個監聽器到ArrayList<TestListener>,這個監聽器就是TestListener,實現類是TestRunner。對象
public synchronized void removeListener(TestListener listener) 從一個test中取消這個監聽器。
private synchronized List<TestListener> cloneListeners() 克隆一批監聽器。
咱們已經知道了TestResult的做用,那麼TestListener的做用又是什麼呢?在Run一個測試用例的時候有不少的結果,這時就由TestListener去觀察這個運行的結果,而且負責報告這些運行信息。
TestListener是個接口,通常由Test Runner,不少特定的Junit擴展也實現了這個接口,咱們來看下這個接口裏面定義了哪些方法:
public void addError(Test test, Throwable t); 發送錯誤的時候才被調用。
public void addFailure(Test test, AssertionFailedError t); 失敗的時候才被調用。
public void endTest(Test test); 測試結束時被調用。
public void startTest(Test test); 測試開始時被調用。
因爲定義了這個TestListener接口和實現類TestRunner的做用都看到了,特別是給擴展Junit提供了新的實現類的方式,這樣的作法就引出了一個設計模式。
Java設計模式:Observer模式
定義:在對象之間定義了一個一對多的依賴關係,這樣當一個對象改變了狀態,那麼全部依賴於它的對象都會自動收到通知且更新。目前Junit框架的TestRunner就以TestListener的身份註冊到TestResult。
咱們在寫testcase的時候,都會用到Assert方法去check運行結果,這時候的Assert方法是繼承了Junit的TestCase類,可是你若是還記得TestCase類的聲明的話,那就是TestCase不單單實現了Test接口,並且也繼承了Assert類,其實這些Assert方法就是Assert類中實現的。
Junit的Assert類中總共有38個Assert方法,但不少都是不停的重載,其實就只有8個核心方法:
assertTure; assertFalse; assertEquals; assertNotEquals; assertNull; assertSame; assertNotSame; fail(讓測試失敗,並給出指定的信息)
通常要用到拋出message的都會用到fail方法。