Junit 內部解密之二: TestResult + TestListener + Assert

發表于:2012-06-15來源:新浪博客作者:JerryGao點擊數: 標簽:junit
之前我們看到了Test接口里面的run方法有個TestResult的參數,不錯,這個類就是用來收集測試結果的,是收集TestSuite的運行結果,所以一般情況下,一個TestSuite對應一個TestResult. TestResult存儲了所有測試的詳細情況,是通過還是失敗。

  之前我們看到了Test接口里面的run方法有個TestResult的參數,不錯,這個類就是用來收集測試結果的,是收集TestSuite的運行結果,所以一般情況下,一個TestSuite對應一個TestResult. TestResult存儲了所有測試的詳細情況,是通過還是失敗。

  如果是失?。?STRONG>Junit會創建一個TestFailure對象,并保存在TestResult中。

Junit <wbr>內部解密之二: <wbr>TestResult <wbr>+ <wbr>TestListener <wbr>+ <wbr>Assert

  這里知道了TestResult的作用,這種做法也會引入另外一個設計模式。

  Java設計模式:Collecting Parameter模式

  定義:當你需要從幾個方法中收集結果時,你應當給方法增加一個參數,并傳遞一個會替你收集參數的對象。

  這里TestResult類就是起到了這個作用。但是我們知道TestResult是收集很多運行的Test的運行結果,這里就需要對于這些運行結果進行管理,則TestResult類定義了如下相關的方法:

  public synchronized void addError(Test test, Throwable t) 新增一個錯誤到ArrayList。

  public synchronized void addFailure(Test test, AssertionFailedError t) 新增一個失敗到ArrayList。

  public synchronized void addListener(TestListener listener) 在一個test中注冊一個監聽器到ArrayList,這個監聽器就是TestListener,實現類是TestRunner。

  public synchronized void removeListener(TestListener listener) 從一個test中取消這個監聽器。

  private synchronized List 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方法。

原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97