快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-14
框架的代码实现(8) 时间:2011-10-13 IBM 何正华 徐晔

加入 TestSuite 的 TestCase 由 createTest(theClass, name) 方法创建,代码如下:

图 13. CreateTest 函数代码

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

TestSuite 和 TestCase 都有一个fName实例变量,是在其后的测试运行及结果返回阶段中该 Test 的 唯一标识,对 TestCase 来说,一般也是要测试的方法名。在 createTest 方法中,测试方法被转化成一 个 TestCase 实例,并通过:

((TestCase) test).setName(name);

用该方法名标识 TestCase 。其中,test 对象也是通过 Refection 机制,通过 theClass 构建的:

test = constructor.newInstance(new Object[0]);

注意:theClass 是图 8 中 getTest 方法的 suiteClassName 字符串所构造的 Class 类实例,而后 者其实是命令行参数传入的带测试类 Calculator,它继承了 TestCase 方法。因此,theClass 完全具备 转化的条件。

至此整个流程的初始化完成。

测试驱动运行阶段(运行所有 TestXXX 型的测试方法)

由图 7 所示 , 我们可以知道初始化完毕,即 testsuit() 创建好后 , 便进入方法 :

doRun(suite, wait);

代码如下 :

图 14. doRun 函数代码

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

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

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

该方法为测试的驱动运行部分,结构如下:

创建 TestResult 实例。

将 junit.textui.TestRunner 的监听器 fPrinter 加入到 result 的监听器列表中。

其中,fPrinter 是 junit.textui.ResultPrinter 类的实例,该类提供了向控制台输出测试结果的一 系列功能接口,输出的格式在类中定义。 ResultPrinter 类实现了 TestListener 接口,具体实现了 addError、addFailure、endTest 和 startTest 四个重要的方法,这种设计是 Observer 设计模式的体 现,在 addListener 方法的代码中:

public synchronized void addListener(TestListener listener) {    fListeners.addElement(listener); }

将 ResultPrinter 对象加入到 TestResult 对象的监听器列表中,因此实质上 TestResult 对象可以 有多个监听器显示测试结果。第三部分分析中将会描述对监听器的消息更新。

计时开始。

run(result) 测试运行。

计时结束。

统一输出,包括测试结果和所用时间。

其中最为重要的步骤为 run(result) 方法,代码如下。

图 15. run 函数代码

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

Junit 通过 for (Enumeration e= tests(); e.hasMoreElements(); ){ …… } 对 TestSuite 中的 整个“树结构”递归遍历运行其中的节点和叶子。此处 JUnit 代码颇具说服力地说明了 Composite 模式 的效力,run 接口方法的抽象具有重大意义,它实现了客户代码与复杂对象容器结构的解耦,让对象容器 自己来实现自身的复杂结构,从而使得客户代码就像处理简单对象一样来处理复杂的对象容器。每次循环 得到的节点 test,都同 result 一起传递给 runTest 方法,进行下一步更深入的运行。

图 16. junit.framework.TestResult.run 函数代码

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

这里变量 P 指向一个实现了 Protectable 接口的匿名类的实例,Protectable 接口只有一个 protect 待实现方法。而 junit.framework.TestResult.runProtected(Test, Protectable) 方法的定义 为:

public void runProtected(final Test test, Protectable p) {   try {     p.protect();   }    catch (AssertionFailedError e) {      addFailure(test, e);   }   catch (ThreadDeath e) { // don''t catch  ThreadDeath by accident     throw e;   }   catch (Throwable e) {     addError(test, e);   } }

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

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

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号