Junit内部解密之: 单元测试用例运行的全过程
我们以一个非常简单的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。