快速业务通道

追求代码质量 - 测试Struts遗留的应用程序 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-23
sername(username);    user.digestAndSetPassword(newPassword);    DataAccessUtils.getDaos().getUserDao().saveUser(user);   }catch(Throwable thr){     return findFailure(mapping, aForm, req, res);   }   return findSuccess(mapping, aForm, req, res); }

图 1. Action 类的输出耦合

但是,就像在图 1 中可以看到的,在试图隔离 ChangePasswordAction 类并 检验 execute() 方法时,该类给出了一些有代表性的挑战。为了有效地测试 execute() 方法,必须处理三层耦合。首先,到 Struts 自身的耦合;其次, Servlet API 代表一个障碍;最后,到业务对象包的耦合,进一步检查业务对象 包,还会有数据访问层使用 Hibernate 和 Spring。

追求代码质量 - 测试Struts遗留的应用程序(2)

时间:2010-12-12 IBM Andrew Glover

每种情况一个 mock?

即使在我编写本文时,我还可以听到开发人员的嘲笑者 认为我的测试问题通 过明智地使用 mock 对象就能轻易解决。可以 用 mock 对象创建一级隔离,它 会形成更容易的测试;但是,我要说的是,把目标对象通过 mock 排除所需要的 付出级别,比起承认隔离测试困难所需要的付出,要多得多。在这种情况下,我 会采用在更高层次上的测试,这级测试有时叫做集成测试。

对于更高的复杂性,请注意 清单 1 中的代码如何把 aForm 参数转换成 ChangePasswordForm 对象,它是 Struts ActionForm 类型。这些 JavaBeans 有一个 validate 方法,这个方法由 Struts 在调用 Action 类的 execute() 方法之前调用。

犯错误太容易了

在清单 2 中,可以看到所有这个复杂性会在哪里发生。ChangePasswordForm 的 validate() 方法的代码片段演示了保证两个属性(newPassword1 和 newPassword2)不为空并彼此相等的简单逻辑。但是,如果 Struts 发现 errors 集合(类型为 ActionErrors)包含一些 ActionError 对象,就会沿着 错误路径走,例如带着出错消息重新显示 Web 页面。

清单 2. ChangePasswordForm 的验证逻辑

if((newPassword1 == null) || (newPassword1.length() <  1)) {   errors.add("newPassword1",    new ActionError ("error.changePassword.newPassword1Required")); } if((newPassword2 == null) || (newPassword2.length() < 1))  {   errors.add("newPassword2",    new ActionError ("error.changePassword.newPassword2Required")); } if((newPassword1 != null) && (newPassword2 != null))  {   if(!newPassword1.equals(newPassword2)) {    errors.add(ActionErrors.GLOBAL_ERROR,   new ActionError("error.changePassword.passwordsDontMatch"));   } }

清单 1 和 清单 2 的代码不特殊也不特定于某个领域。它是无数应用程序中 都包含的简单口令修改逻辑。如果正在测试 Struts 遗留应用程序,将不得不花 些时间处理口令逻辑,但是如何用可重复的方式测试它呢?

两个测试用例

在企图为 清单 1(间接的是 清单 2)的代码编写测试之前,可能想确定实 际需要测试什么。在这个具体示例中,逻辑清楚地是为了方便用户口令的修改; 所以,应当编写至少两个层次的测试用例:

口令修改在数据正确时是否工作?

如果数据不正确,口令是不是不 修改?

这些测试不会太容易只是个假设。不仅需要对付 Struts,还必须处理数据层 以及数据层与数据库暗含的耦合!在面对复杂性时,我的第一本能是寻求帮助, 在这个示例中,是以 JUnit 的 StrutsTestCase 的形式。

来自 StrutsTestCase 的帮助

StrutsTestCase 是一个 JUnit 扩展,专门针对 Struts 应用程

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