- 浏览: 512589 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
chimpp55:
java.lang.NoSuchMethodError: or ...
基于Junit2.0的StrutsTestCase应用 -
opmic:
<property name="srcDir& ...
使用Eclipse与Ant进行java程序开发 -
univasity:
非常好,谢谢分享。
使用Eclipse与Ant进行java程序开发 -
peanut_sei:
exception handlers 译成 例外处理 倒是第 ...
JavaScript高级应用:例外处理
在我的前一篇文档《测试驱动的开发是重要的》中说过我要写一些测试框架应用方面的文档,今天我要实现我的诺言之一,这篇文章是介绍StrutsTeseCase的,熟悉并采用struts的开发员曾经一定有过这样一个困扰:我的action如何进行测试?(不是说要“测试先行”么?),如果没有一个可行的测试框架那我的struts环境去哪里模拟(方便的、透明的去模拟)?不要着急,接下来的部分我要向你们介绍这样一种可以满足我们要求的测试框架:strutstestcae。
——写在前面
主要内容介绍:
1. StrutsTeseCase是什么?
2. 它的“家”在哪里?
3. 如何让它来为我们工作?(伴随说明:我到底该实施“测试先行”?)
4. 兼容struts1.1开发员
5. 参考资源
“由于在这里没有牵涉到Struts以及Junit入门的知识,所以我假定这篇文章的读者都是有struts开发经验的开发员并熟悉Junit。”
第一部分:StrutsTestCase是什么?
StrutsTestCase是基于Junit的一个方便测试struts框架的测试框架。它提供模拟对象(Mock Object)和Cactus两种方式来“真实”的运行Struts ActionServlet,它允许你在不启动servlet 引擎的情况下测试你的struts代码。因为strutstestcase可以用ActionServlet来测试你的代码,所以它不光可以测试你的action,同时它也可以测试你的(容器中的?)mapping,frombeans以及forwards声明。我前面曾提到过它对我们开发员来说是“透明的”,因为象action,mapping,form beans 以及forward等等,我们真的可以象在常规的XXXAction中一样在我们的测试代码中随意的使用它们。
在最新的版本中它还提供了对tiles和多模块(struts1.1中的功能)的测试。
哇,是不是很奇妙,不要着急,我们很快就可以领略到的它的妙处。
第二部分:它的“家”在哪里?
就象许许多多的开源项目一样,StrutsTestCase的家也在“sourceforge.org”(我们伟大的sourceforge就象一个繁忙的峰槽一样J),你可以通过http://sourceforge.net/project/showfiles.php?group_id=39190来下载它得最新版本。
JavaDoc: http://strutstestcase.sourceforge.net/api/index.html
热点论坛:http://sourceforge.net/forum/forum.php?forum_id=121751
常见问题:http://strutstestcase.sourceforge.net/faq.htm
第二部分:如何让它来为我们工作?
“模仿测试(Mock Testing)VS 容器内测试(In-Container Testing)”
通常测试服务器端代码有两种比较常用的测试方法:
模仿对象(mock objects)它通过假设服务器端容器来达到测试效果;
容器内测试(in-container testing),它则是在真实的容器内达到测试效果;
而我们的StrutsTestCase则在对你的测试代码最小影响下能分别扮演上边两种角色。因此我们不得不说到它的这两种实现是如何完成的?
StrutsTestCase提供两种基类(他们分别继承标准的Junit TestCase):
MockStrutsTestCase:
通过名字也可以知道他是通过第一中方法在不启动servlet的条件下来模仿一些HttpServlet实现假设容器环境的。
CactusStrutsTestCase:
它是体现在容器内测试(真实环境测试)的,其通过另外一种测试框架(Cactus testing framework:http://jakarta.apache.org/cactus)struts代码。
Ps:本文中牵涉的代码都是通过第一中方法(继承MockStrutsTestCase)来完成测试的,要想用CactusStrutsTeseCase你只要简单的让测试代码继承CactusStrutsTeseCase即可。
下面我们着重讲解MockStrutsTestCase是为我们工作的?
首先我们先看看一个简单的LoginAction的简化代码:
public class LoginAction extends Action {
public ActionForward perform(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {
String username = ((LoginForm) form).getUsername(); String password = ((LoginForm) form).getPassword();
ActionErrors errors = new ActionErrors();
if ((!username.equals("Jplateau")) || (!password.equals("sandy"))) errors.add("password",new ActionError("error.password.mismatch"));
if (!errors.empty()) { saveErrors(request,errors); return mapping.findForward("login"); }
// store authentication info on the session HttpSession session = request.getSession(); session.setAttribute("authentication", username);
// Forward control to the specified success URI return mapping.findForward("success");
} |
上边LoginAction完成一个简单的登陆意图,从client搜集登陆数据(用户名和密码),然后做一个验证,如果验证有误返回登陆页;如果登陆成功返回成功页(或业务工作平台)并把用户姓名放入session。
那我们就从上边这个简单的程序入手:
首先,我们应该创建一个测试用例TestLoginAction,其基本架子是这样的:
(请记住此时上边LoginAction的代码你还没有写,并且struts_config.xml中的关于LoginAction的actionmapping也是没有的,这些东西我们要经过边测试边写,但一定是先写测试,天啊,什么都还没有我该怎样测试啊,不要急,且看下去,J)
public class TestLoginAction extends MockStrutsTestCase {
public void setUp() { super.setUp(); }
public void tearDown() { super.tearDown(); }
public TestLoginAction(String testName) { super(testName); }
public void testSuccessfulLogin() {} } |
首先我们头脑总中有这样一个actionmapping(注意只是假设的):
<action path=”/longin” type=”Jplateau.strutstestcase.LonginAction” scope="request" name="userForm"> <forward name="success" path="/main.jsp"/> <forward name="login" path="/login.jsp"/> </action> |
有了这样一个假设,我们就可以从测试代码入手:
public class TestLoginAction extends MockStrutsTestCase {
public void setUp() { super.setUp(); //这里做一些初始化的东西,譬如数据库连接等 }
public void tearDown() { super.tearDown(); //这里关闭你在setup中开启的资源,如关闭数据库连接等 }
public TestLoginAction(String testName) { super(testName); }
public void testSuccessfulLogin() {
//选择你要执行哪一个actionmapping?这里就用我们刚才做的假设材料 this. setRequestPathInfo("/login");
//首先要初始化提交数据:用户名、密码 this.addRequestParameter(“usrename”,”Jplateau”); this.addRequestParameter(“passwd”,”sandy”); //注意有了这个之后,你就可以从formbean中使用提交以后的用户名和密码数据了,下//面我会解释
//好,初始化数据完成以后开始执行action中的execute(),很简单,掉用actionPerform() this. ActionPerform();
//严正返回是否正确?这里就用我们刚才做的假设材料 this verifyForward(“success”);.
//下面验证登陆成功以后session中是否有用户的名称? String expect_username_from_session=”Jplateau”; //这里需要插写内容,就是strutstestcase完全可以在测试代码中使用跟真实action //中一样的环境,譬如可以通过this.getActionForm()得到相应的ActionForm //可以通过this.getRequest()得到HttpRequest //可以通过this.getSession()得到HttpSession,如下: String actual_username_from_session=this.getSession().getAttribute(“authentication”);
this. assertEquals(“”, expect_username_from_session, actual_username_from_session); }
public void testFailureLogin(){ //登陆失败的测试在此就不写了
} } |
上边是一个简单的测试代码,好,运行!他此时肯定是通不过的,首先我们的java代码还没有写,struts-config.xml还没有配,那么,现在你可以现在做这些事情:“用最简单的做法或代码让上边那个测试通过。”
第三部分:兼容struts1.1开发员
下面说写和struts1.1相关的内容:测试tiles和多模块!
测试tiles
评论
at servletunit.struts.Common.verifyForwardPath(Common.java:304)
at servletunit.struts.MockStrutsTestCase.verifyForward(MockStrutsTestCase.java:675)
at jp.co.seanuts.rspl.msc.mscfc40.mscsc4000.TestLoginAction.testSuccessfulLogin(TestLoginAction.java:52)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at junit.framework.TestCase.runTest(TestCase.java:168)
at junit.framework.TestCase.runBare(TestCase.java:134)
at junit.framework.TestResult$1.protect(TestResult.java:110)
at junit.framework.TestResult.runProtected(TestResult.java:128)
at junit.framework.TestResult.run(TestResult.java:113)
at junit.framework.TestCase.run(TestCase.java:124)
at junit.framework.TestSuite.runTest(TestSuite.java:232)
at junit.framework.TestSuite.run(TestSuite.java:227)
at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:131)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
我这个是什么问题,能告诉我吗
发表评论
-
Eclipse快捷键(引用转贴)
2004-09-23 11:47 875本文档从Eclipse软件上整理,是列出了标准的快捷键,未列出 ... -
java Excel API 简介(翻译)
2004-09-23 11:49 996java Excel API 简介(翻译) 版权声明:CSD ... -
spring-richclient开发swing应用程序
2005-09-03 18:00 1962Swing桌面应用程序的开发一直以来都是Java桌面开发者心中 ... -
spring-richclient开发swing应用程序 2
2005-09-03 18:07 12361 Main函数PetClinicStandalone里面基本 ... -
spring-richclient开发swing应用程序 3
2005-09-03 18:36 1800richclient-application-context. ... -
spring-richclient开发swing应用程序 4
2005-09-03 18:50 1280spring-rcp里面简单到极点(相对)的就算是菜单和导航条 ... -
关于Ajaxian JSF的设计原则
2005-09-09 16:05 693目前网上大大小小的Ajax Framework已经计算不清了, ... -
Velocity学习笔记1——Velocity是什么
2006-05-23 22:38 1116Velocity是一个基于Java的模版引擎。它允 ... -
Velocity学习笔记2——Velocity能够做什么
2006-05-24 11:06 996一个 ... -
JDBMonitor全攻略:10秒为任意数据库增加执行日志功能
2006-05-16 22:34 1287JDBMonitor是一个开源项目 ... -
使用JDBMonitor剖析Hibernate的实现机制
2006-05-17 18:20 1097使用JDBMonitor剖析Hibernate的实现机制现在j ... -
Log4j和JDBMonitor的比较
2006-05-17 18:21 851Log4j和JDBMonitor的比较Log4 ... -
Apache Commons Chain简明手册
2007-05-25 01:10 3280基本对象1. 接口。它是Commons Chain中最重要的接 ... -
开始使用Commons Chain (第一部分)
2007-05-25 01:12 1198作为程序开发人员,我 ... -
在JAVA中使用文档对象模型DOM经验小结
2007-07-13 23:20 826文档对象模型 (DOM) 是一个文档标准,对于完备的文档和复杂 ... -
什么时候该用synchronized
2007-07-13 23:48 1415由于同一进程的多个线 ... -
XMLC在eclipse中的使用
2007-07-13 23:50 964关于外部插件的使用可以用link的方式做,如果简单的只把插件丢 ... -
J2EE架构学习者的6个最佳实践
2007-07-14 00:06 818虽然许多文章曾经讨论 ... -
面向Java程序员的Ajax:构建动态Java程序
2007-07-14 00:11 777Ajax(即异步 JavaScript 和 ... -
用java打包成zip
2007-08-21 11:51 1429--- 大家可能对于Zip格式的文件已经司空见惯了,我们可以使 ...
相关推荐
hamcrest-junit-2.0.0.0.jar
Struts2.0则是Apache软件基金会的一个开源MVC(Model-View-Controller)框架,用于构建基于Java的Web应用程序。它提供了强大的动作调度、拦截器、插件架构等功能,使得开发者能够更高效地组织和管理代码。Struts2.0...
【基于Junit的ATM测试】是针对自动取款机(ATM)系统进行的一种软件测试方法,它利用Java编程语言以及JUnit测试框架来验证ATM系统的功能正确性。JUnit是一个广泛使用的Java单元测试框架,它允许开发者编写可重复运行...
你还在为不会python烦恼吗? 你还在为python支持不好烦恼吗? 你还在为手机和web如何进行交互测试烦恼吗? 基于JUnit框架的android终端自动化测试工具包将为你解决你的烦恼
在本压缩包“Android高级应用源码-基于author2.0的新浪微博.zip”中,包含的是一个基于Android平台的高级应用程序源代码,该程序是针对新浪微博的客户端实现。这个项目展示了如何利用Android SDK来开发一个功能丰富...
本文将深入探讨如何利用工具实现基于Junit的测试代码自动化生成,以提高开发效率并确保测试覆盖率。 Junit是一个开源的测试框架,它为Java程序员提供了编写和运行可重复测试的能力。它包含了一组注解,如@Test、@...
本框架基于SpringBoot2.0,旨在提供一个轻量级的Java快速开发平台,帮助开发者高效地构建高质量的应用。 一、SpringBoot2.0的核心特性 1. 自动配置:SpringBoot通过“@EnableAutoConfiguration”注解自动配置项目,...
这个压缩包文件“Android代码-基于author2.0的新浪微博.rar”显然包含了一个使用Android平台开发的、针对新浪微博的应用程序源码。这个应用可能是一个自定义版或者优化版的微博客户端,利用了新浪微博API 2.0版本的...
【标题】: "基于Struts2.0的物流管理系统设计与实现" 【描述】: 这个压缩包文件包含了...综上,这个基于Struts2.0的物流管理系统的设计与实现涵盖了Web应用开发的多个重要方面,是学习和实践Java Web开发的宝贵案例。
标题 "junit-toolbox-2.0.zip" 暗示了这是一个与JUnit相关的工具包,而描述中提到的 "starql.zip, liql的泛型liql查询语言(liql)的泛型实现" 提及了另一个项目,即StarQL,它是LIQL查询语言的一个泛型实现。...
讲解了Junit框架在单元测试过程中的应用
**基于Junit的HttpUnit测试** 在软件开发中,单元测试是确保代码质量的重要环节,它可以帮助开发者在早期发现和修复问题,提高软件的稳定性和可靠性。`JUnit` 是一个广泛使用的 Java 测试框架,而 `HttpUnit` 则是...
Junit4是由Eclipse基金会维护的开源项目,它基于JUnit3进行了重大改进,引入了注解(Annotation)和断言(Assertion)等新特性,使得测试代码更加简洁、易读。例如,@Test注解用于标记测试方法,@Before和@After注解...
Cactus是一个基于JUnit框架的简单测试框架,用来单元测试服务端Java代码。Cactus框架的主要目标是能够单元测试服务端的使用Servlet对象的Java方法如HttpServletRequest,HttpServletResponse,HttpSession等
第4次-2(Junit单元测试应用第4次-2(Junit单元测试应用第4次-2(Junit单元测试应用第4次-2(Junit单元测试应用第4次-2(Junit单元测试应用第4次-2(Junit单元测试应用第4次-2(Junit单元测试应用第4次-2(Junit单元...
JUnit 测试高级应用 JUnit 是一个开发源代码的 Java 测试框架,用于编写和运行可重复的测试。他是用于单元测试框架体系 JUnit 的一个实例(用于 java 语言)。在软件开发中,单元测试是一个非常重要的步骤,它可以...