快速业务通道

分析JUnit框架的代码实现 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-14

可见 runProtected 方法实际上是调用了刚刚实现的 protect 方法,也就是调用了 test.runBare() 方法。另外,这里的 startTest 和 endTest 方法也是 Observer 设计模式中的两个重要的消息更新方法 。

以下分析 junit.framework.TestCase.runBare() 方法:

图 17. junit.framework.TestCase.runBare() 函数代码

分析JUnit框架的代码实现 - 编程入门网

在该方法中,最终的测试会传递给一个 runTest 方法执行,注意此处的 runTest 方法是无参的,注 意与之前形似的方法区别。该方法中也出现了经典的 setUp 方法和 tearDown 方法,追溯代码可知它们 的定义为空。用户可以覆盖两者,进行一些 fixture 的自定义和搭建。 ( 注意:tearDown 放在了 finally{} 中,在测试异常抛出后仍会被执行到,因此它是被保证运行的。 )

主体工作还是在 junit.framework.TestCase.runTest() 方法中 , 代码如下 :

分析JUnit框架的代码实现 - 编程入门网

该方法最根本的原理是:利用在图 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

分析JUnit框架的代码实现 - 编程入门网

测试结果捕捉阶段(返回 Fail 或 Error 并显示)

通过以下代码,我们可以看出失败由第一个 catch 子句捕获,并交由 addFailure 方法处理,而错误 由第三个 catch 子句捕获,并交由 addError 方法处理。

图 20. 失败处理函数代码

分析JUnit框架的代码实现 - 编程入门网

图 21. 失败处理流程图

分析JUnit框架的代码实现 - 编程入门网

分析JUnit框架的代码实现(12)

时间:2011-10-13 IBM 何正华 徐晔

JUnit 执行测试方法,并在测试结束后将失败和错误信息通知给所有的 test listener 。其中 addFailure、addError、endTest、startTest 是 TestListener 接口的四大方法,而 TestListener 涉 及到 Observer 设计模式。

我们尝试看看 addFailure 方法的代码:

图 22. addFailure 方法的代码

分析JUnit框架的代码实现 - 编程入门网

此处代码将产生的失败对象加入到了 fFailures,可联系 图 2,此处的结果在程序退出时作为 测试总体成功或失败的判断依据。而在 for 循环中,TestResult 对象循环遍历观察者(监听器)列表, 通过调用相应的更新方法,更新所有的观察者信息,这部分代码也是整个 Observe r 设计模式架构的重 要部分。

根据以上描述,JUnit 采用 Observer 设计模式使得 TestResult 与众多测试结果监听器通过接口 TestListenner 达到松耦合,使 JUnit 可以支持不同的使用方式。目标对象(TestResult)不必关心有 多少对象对自身注册,它只是根据列表通知所有观察者。因此,TestResult 不用更改自身代码,而轻易 地支持了类似于 ResultPrinter 这种监听器的无限扩充。目前,已有文本界面、图形界面和 Eclipse 集 成组件三种监听器,用户完全可以开发符合接口的更强大的监听器。

出于安全考虑,cloneListeners() 使用克隆机制取出监听器列表:

private synchronized Vector cloneListeners() { return (Vector)fListeners.clone(); }

TestResult 的 addFailure 进一步调用 ResultPrinter 的 addFailure:

图 23. ResultPrinter 的 addFailure 函数代码

分析JUnit框架的代码实现 - 编程入门网

这里并没有将错误信息输出,而只是

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号