快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-14
用该方法。 JUnit 源代码频繁使用了 Reflection 机制,不仅充分发挥了 Java 语 言在系统编程要求下的超凡能力,也使 JUnit 能在用户自行编写的测试类中游刃有余地分析并提取各种 属性及代码,而其它测试框架需要付出极大的复杂性才能得到等价功能。

若 JUnit 无法找到 siute 方法,则抛出异常,流程进入情况 B 代码;若找到,则对用户提供的 suite 方法进行外部特征检验,判断是否为类方法。最后,JUnit 自动调用该方法,构造用户指定的 TestSuite:

test = (Test)suiteMethod.invoke(null, (Object[]) new Class[0]);

情况 B:

图 10. 自动判断并提取 TestSuite 流程图

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

当 suite 方法未在 test case 中定义时,JUnit 自动分析创建一个 test suite 。代码由 :

return new TestSuite(testClass);

处进入 TestSuite(Class theclass) 方法为 TestSuite 类的构造方法,它能自动分析 theclass 所 描述的类的内部有哪些方法需要测试,并加入到新构造的 TestSuite 中。代码如下:

图 11. TestSuite 函数代码

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

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

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

TestSuite 采用了Composite 设计模式。在该模式下,可以将 TestSuite 比作一棵树,树中可以包含 子树(其它 TestSuite),也可以包含叶子 (TestCase),以此向下递归,直到底层全部落实到叶子为止 。 JUnit 采用 Composite 模式维护测试集合的内部结构,使得所有分散的 TestCase 能够统一集中到一 个或若干个 TestSuite 中,同类的 TestCase 在树中占据同等的位置,便于统一运行处理。另外,采用 这种结构使测试集合获得了无限的扩充性,不需要重新构造测试集合,就能使新的 TestCase 不断加入到 集合中。

在 TestSuite 类的代码中,可以找到:

private Vector fTests = new Vector(10);

此即为内部维护的“子树或树叶”的列表。

红框内的代码完成提取整个类继承体系上的测试方法的提取。循环语句由 Class 类型的实例 theClass 开始,逐级向父类的继承结构追溯,直到顶级 Object 类,并将沿途各级父类中所有合法的 testXXX() 方法都加入到 TestSuite 中。

合法 testXXX 的判断工作由:

addTestMethod(methods[i], names, theClass)

完成,实际上该方法还把判断成功的方法转化为 TestCase 对象,并加入到 TestSuite 中。代码如下 图 :

图 12. addTestMethod 函数代码

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

首先通过 String name= m.getName(); 利用 Refection API 获得 Method 对象 m 的方法名,用于特 征判断。然后通过方法

isTestMethod(Method m)

中的

return parameters.length == 0 && name.startsWith("test") &&  returnType.equals(Void.TYPE);

来判别方法名是不是以字符串“ test ”开始。

而代码:

if (names.contains(name))    return;

用于在逐级追溯过程中,防止不同级别父类中的 testXXX() 方法重复加入 TestSuite 。

对于符合条件的 testXXX() 方法,addTestMethod 方法中用语句:

addTest(createTest(theClass, name));

将 testXXX 方法转化为 TestCase,并加入到 TestSuite 。其中,addTest 方法接受 Test 接口类型 的参数,其内部有 countTestCases 方法和 run 方法,该接口被 TestSuite 和 TestCase 同时实现。这 是 Command 设计模式精神的体现,

Command 模式将调用操作的对象与如何实现该操作的对象解耦。在运行时,TestCase 或 TestSuite 被当作 Test 命令对象,可以像一般对象那样进行操作和扩展,也可以在实现 Composite 模式时将多个 命令复合成一个命令。另外,增加新的命令十分容易,隔离了现有类的影响,今后,也可以与备忘录模式 结合,实现 undo 等高级功能。

分析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号