- 浏览: 495815 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
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 828本文档从Eclipse软件上整理,是列出了标准的快捷键,未列出 ... -
java Excel API 简介(翻译)
2004-09-23 11:49 937java Excel API 简介(翻译) 版权声明:CSD ... -
spring-richclient开发swing应用程序
2005-09-03 18:00 1920Swing桌面应用程序的开发一直以来都是Java桌面开发者心中 ... -
spring-richclient开发swing应用程序 2
2005-09-03 18:07 11941 Main函数PetClinicStandalone里面基本 ... -
spring-richclient开发swing应用程序 3
2005-09-03 18:36 1746richclient-application-context. ... -
spring-richclient开发swing应用程序 4
2005-09-03 18:50 1249spring-rcp里面简单到极点(相对)的就算是菜单和导航条 ... -
关于Ajaxian JSF的设计原则
2005-09-09 16:05 669目前网上大大小小的Ajax Framework已经计算不清了, ... -
Velocity学习笔记1——Velocity是什么
2006-05-23 22:38 1056Velocity是一个基于Java的模版引擎。它允 ... -
Velocity学习笔记2——Velocity能够做什么
2006-05-24 11:06 965一个 ... -
JDBMonitor全攻略:10秒为任意数据库增加执行日志功能
2006-05-16 22:34 1221JDBMonitor是一个开源项目 ... -
使用JDBMonitor剖析Hibernate的实现机制
2006-05-17 18:20 1060使用JDBMonitor剖析Hibernate的实现机制现在j ... -
Log4j和JDBMonitor的比较
2006-05-17 18:21 796Log4j和JDBMonitor的比较Log4 ... -
Apache Commons Chain简明手册
2007-05-25 01:10 3215基本对象1. 接口。它是Commons Chain中最重要的接 ... -
开始使用Commons Chain (第一部分)
2007-05-25 01:12 1110作为程序开发人员,我 ... -
在JAVA中使用文档对象模型DOM经验小结
2007-07-13 23:20 801文档对象模型 (DOM) 是一个文档标准,对于完备的文档和复杂 ... -
什么时候该用synchronized
2007-07-13 23:48 1387由于同一进程的多个线 ... -
XMLC在eclipse中的使用
2007-07-13 23:50 923关于外部插件的使用可以用link的方式做,如果简单的只把插件丢 ... -
J2EE架构学习者的6个最佳实践
2007-07-14 00:06 769虽然许多文章曾经讨论 ... -
面向Java程序员的Ajax:构建动态Java程序
2007-07-14 00:11 748Ajax(即异步 JavaScript 和 ... -
用java打包成zip
2007-08-21 11:51 1389--- 大家可能对于Zip格式的文件已经司空见惯了,我们可以使 ...
相关推荐
hamcrest-junit-2.0.0.0.jar
junit struts2.0和资源见解,和项目
简单的ATM的代码测试技术,基于Java的代码测试,里面实现了Server类和测试类,需要添加Junit和Elcmma
你还在为不会python烦恼吗? 你还在为python支持不好烦恼吗? 你还在为手机和web如何进行交互测试烦恼吗? 基于JUnit框架的android终端自动化测试工具包将为你解决你的烦恼
有关于java语言的单元测试工具,想研究junit的可以看看
(完整版)软件测试技术试验报告--JUnit的基本应用.pdf(完整版)软件测试技术试验报告--JUnit的基本应用.pdf(完整版)软件测试技术试验报告--JUnit的基本应用.pdf(完整版)软件测试技术试验报告--JUnit的基本应用.pdf...
(完整版)软件测试技术试验报告--JUnit的基本应用.docx(完整版)软件测试技术试验报告--JUnit的基本应用.docx(完整版)软件测试技术试验报告--JUnit的基本应用.docx(完整版)软件测试技术试验报告--JUnit的基本应用.docx...
讲解了Junit框架在单元测试过程中的应用
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单元...
NULL 博文链接:https://mingyang2013.iteye.com/blog/1578214
是Junit4测试工具应用实例,包含测试类,源代码。
starql.zip,liql的泛型liql查询语言(liql)的泛型实现
Junit入门及应用,入门级别的学习资料。
NULL 博文链接:https://jisonami.iteye.com/blog/2202505
JUnit三分钟教程 ---- 实际应用 讲解Junit实际应用的实例
idea 的外部插件junitgenerator-v2 安装在 plugins中 install from disk
单元测试JUnit ——是一个开发源代码的Java测试框架,用于编写和运行可重复的测试。他是用于单元测试框架体系JUnit的一个实例(用于java语言)。
将参数的输入、请求执行、结果解析、数据验证、数据准备与清理各个环节都做了封装,以数据文本文件为...3. 数据准备与清理:构造测试数据的sql,或者service接口底层主要使用的是HttpClient JUnit 标签:iTest