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

转自:http://blog.sina.com.cn/s/blog_6cf812be0100wbhw.htmlhtml

以前咱们看到了Test接口里面的run方法有个TestResult的参数,不错,这个类就是用来收集测试结果的,是收集TestSuite的运行结果,因此通常状况下,一个TestSuite对应一个TestResult. TestResult存储了全部测试的详细状况,是经过仍是失败。设计模式

若是是失败:Junit会建立一个TestFailure对象,并保存在TestResult中。框架

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

    这里知道了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方法。

相关文章
相关标签/搜索