Junit内部解密之三: 单元测试用例运行的全过程

发表于:2012-06-20来源:新浪博客作者:JerryGao点击数: 标签:单元测试
我们以一个非常简单的TestCalculator类为例,只有一个测试方法: Public class TestCalculator extends TestCase {

  我们以一个非常简单的TestCalculator类为例,只有一个测试方法:

  Public class TestCalculator extends TestCase

  {

  Public void testAdd()

  {

  Calculator calculator = new Calculator();

  Double result = calculator.add(10, 50);

  assertEquals(60, result);

  }

  }

  当我们使用Run in Junit 的时候,之前说到过的几个核心类之间是怎么运行的呢?我们先看下基本过程:

  TestRunner启动界面框 —》创建一个TestSuite ––》创建一个TestResult—》执行testadd方法。

  由于我们的TestCalculator测试类里面没有显式的suite方法,大部分情况下都是类似,这样的话,TestRunner创建了一个默认的TestSuite对象,看下图:

  那么同时TestRunner还需要创建包含测试结果(成功,失败或出错)的TestResult对象,具体过程如下:

  1.最开始的时候,TestRunner实例化了一个TestResult对象,在测试顺序执行的时候,这个对象将用于保存测试结果。

  2.TestRunner向TestResult注册,就是add一个监听器,这样的话在执行测试过程中,TestRunner就可以收到各种事件,TestResult会广播如下方法:测试开始(startTest); 测试失败(addFailure); 遇到测试错误(addError); 测试结束(endTest)

  3.知道了这些事件后,TestRunner就可以随着测试的进行而显示进度条了,并且在失败或错误的时候显示出来。

  4.TestRunner通过调用TestSuite的run(TestResult)方法来开始测试

  5.TestSuite为它所拥有的每个Test Case实例调用run(TestResult)方法。

  6.Test Case使用传递给它的TestResult实例来调用其run(Test)方法,并把自身作为参数传递给run方法,这样TestResult 立马就可以用runBare()来回调它。

  接着就是执行测试方法了:

  这里需要说明的是对于每个TestCase都会调用runBare()方法,这里只有一个testAdd方法,所以只调用一次,请看下图:

  1.runBare()方法将调用setUp, testAdd, teardown 方法,顺序执行。

  2.如果调用3个方法的过程出现任何失败或错误,那么TestResult就会分别调用addFailure 和addError来通知它的所有Listener。

  3.这样TestRunner就会收到这些错误或失败,也会罗列出这些错误,否则进度条就是绿色的,让你知道测试方法没有问题。

  4.当tearDown方法执行完后,测试也就完成了,TestResult 会通过调用endTest把这个结果通告给所有的Listener。

原文转自:http://www.ltesting.net