分享
 
 
 

用StrutsTestCase测试Struts应用程序

王朝other·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

一、Struts测试概述

一个具有良好系统架构的J2EE应用程序至少有三层组成,即表现层,商业层和系统

集成层(包括数据存取以及和其他系统集成),目前,Struts是应用比较广泛,实现MVC2模式应用于表现层的一种技术. 在这里面,Struts Action主要用来完成一些简单的数据校验,转换,以及流程转发控制(注意:这里流程不是业务规则). 因此在对整个应用程序进行测试时,我们同时也要测试Struts Action.

但是,测试Struts Action相对测试简单的JavaBean是比较困难,因为Struts是运行在Web服务器中, 因此要测试Struts Action就必须发布应用程序然后才能测试. 我们想象一下,对于一个拥有上千个JSP page和数百甚至数千Java Classes的大规模应用程序,要把他们发布到诸如Weblogic之类的应用服务器再测试,需要多少的时间和硬件资源? 所以这种模式的测试是非常费时费力的.

所以,如果有一种办法能够不用发布应用程序,不需要Web服务器就能象测试普通Java Class一样测试Struts Action,那就能极大地加强Struts的可测试性能,使应用程序测试更为容易,简单快速. 现在这个工具来了,这就是StrutsTestCase.

二、StrutsTestCase 概述

StrutsTestCase 是一个功能强大且容易使用的Struts Action开源测试工具,它本身就是在大名鼎鼎的JUnit基础上发展起来的。因此通过和JUnit结合使用能极大加强应用程序的测试并加快应用程序的开发.

StrutsTestCase提供了两者测试方式,模仿方式和容器测试方式. 所谓模仿方式就是有StrutsTestCase本身来模拟Web服务器. 而容器测试方式则需要Web服务器. 本文要讨论的是前者,原因很简单,不需要Web服务器就能象测试普通的Java Class一样测试Struts Action.

三、准备StrutsTestCase和Struts Action/ActionForm/Config

StrutsTestCase是一个开源工具,可以到http://strutstestcase.sourceforge.net下载. 目前最新版本是2.1.3,

如果你使用Servlet2.3就下载StrutsTestCase213-2.3.jar,使用Servlet2.4的就下载StrutsTestCase213-2.4.jar.

另外StrutsTestCase本身就是从JUnit继承的,所以你还需要下载JUnit3.8.1.

在本文中,我们用一个简单的例子来做测试. 假设我们有一张表Hotline(country varchar2(50),pno varchar2(50)),

我们要做的是根据输入条件从这张表检索相应的记录.检索条件是country.

Value Object:

package sample;

public class HotlineDTO implements Serializable{

private String country = "";

private String pno = "";

/**

* Method HotlineActionForm

*

*

*/

public HotlineDTO () {

super();

}

public void setCountry(String country) {

this.country = country;

}

public void setPno(String pno) {

this.pno = pno;

}

public String getCountry() {

return (this.country);

}

public String getPno() {

return (this.pno);

}

}

ActionForm:

package sample;

import org.apache.struts.action.ActionForm;

public class HotlineActionForm extends ActionForm{

private String country = "";

private String pno = "";

/**

* Method HotlineActionForm

*

*

*/

public HotlineActionForm() {

super();

}

public void setCountry(String country) {

this.country = country;

}

public void setPno(String pno) {

this.pno = pno;

}

public String getCountry() {

return (this.country);

}

public String getPno() {

return (this.pno);

}

}

Action Class:

public class SearchHotlineAction extends Action {

public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,

HttpServletResponse response) throws Exception {

String target = "";

try{

//调用HotlineDAO检索hotline

String country=((HotlineActionForm)form).getCountry();

List hotlineList = HotlineDAO.getHotlineList(country);

if(hotlineList!=null && hotlineList.size()0){

request.setAttribute("hotlineList",hotlineList);

target = "hotlineList";

}else{

target = "notfound";

}

}catch(Exception ex){

....

}

}

Struts Config:

<struts-config

<form-beans

<form-bean name="hotlineActionForm" type="sample.HotlineActionForm" /

.......

</form-beans

<action-mappings

<action path="/SearchHotline"

name="hotlineActionForm"

type="sample.SearchHotlineAction "

scope="request"

validate="false"

<forward name="hotlineList" path="/hotlineList.jsp"/

<forward name="notfound" path="/searchHotline.jsp"/

</action

.....

<action-mappings

........ <struts-config

四、初试StrutsTestCase

当采用模拟方式时,所有的StrutsTestCase测试Class都是从MockStrutsTestCase继承下来的.

下面我们就创建一个最简单的测试Class.

public class SearchHotlineAction extends MockStrutsTestCase {

public void setUp()throws Exception{

}

public void tearDown()throws Exception{

}

public void testSearchHotline() throws Exception{

setRequestPathInfo("/SearchHotline.do");

addRequestParameter("country", "CN");

actionPerform();

}

}

上面的Class相信用过JUnit的朋友都很熟悉.

好了,一个简单的测试例子就完成了,如果你用的是Eclipse就选择Run-Run...-JUnit-New就可以直接运行.不需要发布你的程序,不需要任何的Web服务器支持,就可以测试Struts Action,这就是StrutsTestCase带来的好处.下面简单地介绍一下它是怎么工作的.

在上面的例子中,我们调用setRequestPathInfo()告诉StrutsTestCase我们要模拟JSP调用SearchHotline.do这个Action,并且调用addRequestParameter()增加了一个参数country.最后调用actionPerform()运行.

看到这里,大家发现一个问题没有? 在上面Action的源代码里我们是通过

String country=((HotlineActionForm)form).getCountry();

也就是ActionForm来取得输入的参数值,可我们在testSearchHotline()方法里并没有设置ActionForm?

那么它是怎么出来的呢? 其实大家如果熟悉Struts的运行流程的话就知道,JSP接受用户的输入并发请求时都是类似这样的http://hostname/servletName?param1=value1¶m2=value2. 只是Struts接受到这些参数后再根据Struts Config里的Action和ActionForm的映射把他们转为ActionForm后传给Action的.

在上面的例子,我们只是简单地运行了Action,那么Action是否正确执行以及返回的结果是不是我们想要的呢?

我们继续完善一下testSearchHotline()这个Method.

public void testSearchHotline() throws Exception{

setRequestPathInfo("/SearchHotline.do");

addRequestParameter("country", "CN");

actionPerform();

verifyNoActionErrors();

verifyForward("hotlineList");

assertNotNull(request.getAttribute("hotlineList"));

List hotlineList = (List) request.getAttribute("hotlineList");

for (Iterator it = hotlineList.iterator();it.hasNext();){

....

}

}

我们在actionPerform()后增加了几行语句来断定Struts Action是否正确执行.

verifyNoActionErrors() -- 判断Action里没有任何的Action;

verifyForward("hotlineList") -- 判断Action确实转发到hotlineList;

assertNotNull(request.getAttribute("hotlineList")) -- 判断Action确实返回了hotlineList并且不为空

到这里,我们已经基本上讨论完了StrutsTestCase的核心部分. 从头到尾,我们没有发布应用程序,也不需要Web服务器,对我们来讲,Struts Action就象普通的Java Class一样容易调试测试.这就是StrutsTestCase给我们带来的方便.

五、深入StrutsTestCase

除了以上我们用到的几个断定和校验方法外,StrutsTestCase还提供了其他几个方法便于我们测试Struts Action. 下面我一一讲述,具体的大家可以参考文档.

verifyActionErrors/Messages --

校验ActionActionServlet controller 是否发送了ActionError或ActionMessage.

参数为ActionError/Message Key

verifyNoActionErrors/Messages --校验ActionActionServlet controller 没有发送ActionError或ActionMessage

VerifyForward -- 校验Action是否正确转发到指定的ActionForward.

VerifyForwardPath -- 校验Action是否正确转发到指定的URL

verifyInputForward -- 校验Action是否转发到Action Mapping里的input属性

verifyTilesForward/verifyInputTilesForward--和以上类似,应用程序使用到tiles时用的

六、关于Web.xml和Struts-Config.xml

缺省情况下,StrutsTestCase认为你的Web.xml和struts-config.xml的路径分别是:

/WEB-INF/web.xml和/WEB-INF/struts-config.xml

1. 假如你的web.xml/struts-config.xml的路径是d:/app/web/WEB-INF/web.xml(struts-config.xml)的话,就需要把d:/app/web加到classpath.

2. 假如你的struts config是strust-config-module.xml,那么必须调用setConfigFile()设置你的struts config文件

七、结束语

J2EE应用程序的测试在开发过程中占有相当重要的位置,利用StrutsTestCase能极大方便你测试基于Struts的应用程序.

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有