分析JUnit框架的代码实现 - 编程入门网
晔
可见 runProtected 方法实际上是调用了刚刚实现的 protect 方法,也就是调用了 test.runBare() 方法。另外,这里的 startTest 和 endTest 方法也是 Observer 设计模式中的两个重要的消息更新方法 。 以下分析 junit.framework.TestCase.runBare() 方法: 图 17. junit.framework.TestCase.runBare() 函数代码 在该方法中,最终的测试会传递给一个 runTest 方法执行,注意此处的 runTest 方法是无参的,注 意与之前形似的方法区别。该方法中也出现了经典的 setUp 方法和 tearDown 方法,追溯代码可知它们 的定义为空。用户可以覆盖两者,进行一些 fixture 的自定义和搭建。 ( 注意:tearDown 放在了 finally{} 中,在测试异常抛出后仍会被执行到,因此它是被保证运行的。 ) 主体工作还是在 junit.framework.TestCase.runTest() 方法中 , 代码如下 : 该方法最根本的原理是:利用在图 13 中设定的 fName,借助 Reflection 机制,从 TestCase 中提取测试方法: runMethod = getClass().getMethod(fName, (Class[]) null); 为每一个测试方法,创建一个方法对象 runMethod 并调用: runMethod.invoke(this, (Object[]) new Class[0]); 只有在这里,用户测试方法的代码才开始被运行。 在测试方法运行时,众多的 Assert 方法会根据测试的实际情况,抛出失败异常或者错误。也是在“ runMethod.invoke(this, (Object[]) new Class[0]); ”这里,这些异常或错误往上逐层抛出,或者被 某一层次处理,或者处理后再次抛出,依次递推,最终显示给用户。 分析JUnit框架的代码实现(11)时间:2011-10-13 IBM 何正华 徐晔流程图如下 : 图 19. JUnit 执行测试方法,并在测试结束后将失败和错误信息通知所有 test listener 测试结果捕捉阶段(返回 Fail 或 Error 并显示) 通过以下代码,我们可以看出失败由第一个 catch 子句捕获,并交由 addFailure 方法处理,而错误 由第三个 catch 子句捕获,并交由 addError 方法处理。 图 20. 失败处理函数代码 图 21. 失败处理流程图 分析JUnit框架的代码实现(12)时间:2011-10-13 IBM 何正华 徐晔JUnit 执行测试方法,并在测试结束后将失败和错误信息通知给所有的 test listener 。其中 addFailure、addError、endTest、startTest 是 TestListener 接口的四大方法,而 TestListener 涉 及到 Observer 设计模式。 我们尝试看看 addFailure 方法的代码: 图 22. addFailure 方法的代码 此处代码将产生的失败对象加入到了 fFailures,可联系 图 2,此处的结果在程序退出时作为 测试总体成功或失败的判断依据。而在 for 循环中,TestResult 对象循环遍历观察者(******)列表, 通过调用相应的更新方法,更新所有的观察者信息,这部分代码也是整个 Observe r 设计模式架构的重 要部分。 根据以上描述,JUnit 采用 Observer 设计模式使得 TestResult 与众多测试结果监听器通过接口 TestListenner 达到松耦合,使 JUnit 可以支持不同的使用方式。目标对象(TestResult)不必关心有 多少对象对自身注册,它只是根据列表通知所有观察者。因此,TestResult 不用更改自身代码,而轻易 地支持了类似于 ResultPrinter 这种监听器的无限扩充。目前,已有文本界面、图形界面和 Eclipse 集 成组件三种监听器,用户完全可以开发符合接口的更强大的监听器。 出于安全考虑,cloneListeners() 使用克隆机制取出监听器列表:
TestResult 的 addFailure 进一步调用 ResultPrinter 的 addFailure: 图 23. ResultPrinter 的 addFailure 函数代码 这里并没有将错误信息输出,而只是 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |