`
lujar
  • 浏览: 512624 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

利用StrutsTestCase测试Struts应用程序

阅读更多

本文介绍了一种利用开源工具测试Struts Action的办法. 利用这种办法,开发人员可以不需要发布Struts应用程序,不需要Web服务器就可以测试普通Java Class一样测试Struts Action,从而能够极大地提高Struts的可测试性能,加快Struts程序的开发速度  

一、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.  

三、准备StrutsTestCaseStruts 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里的ActionActionForm的映射把他们转为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 是否发送了ActionErrorActionMessage. 参数为ActionError/Message Key  verifyNoActionErrors/Messages --校验ActionActionServlet controller 没有发送ActionErrorActionMessage  VerifyForward -- 校验Action是否正确转发到指定的ActionForward.  VerifyForwardPath -- 校验Action是否正确转发到指定的URL  verifyInputForward -- 校验Action是否转发到Action Mapping里的input属性  verifyTilesForward/verifyInputTilesForward--和以上类似,应用程序使用到tiles时用的  

六、关于Web.xmlStruts-Config.xml  缺省情况下,StrutsTestCase认为你的Web.xmlstruts-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 configstrust-config-module.xml,  那么必须调用setConfigFile()设置你的struts config文件  

七、结束语  J2EE应用程序的测试在开发过程中占有相当重要的位置,利用StrutsTestCase能极大方便你测试基于Struts的应用程序.版权声明:TechtargetMatrix授权发布,如需转载请联系Matrix
作者:叶枫(http://blog.matrix.org.cn/page/叶枫)
原文地址:http://www.matrix.org.cn/resource/article/44/44008_StrutsTestCase
 

分享到:
评论

相关推荐

    StrutsTestCase-2.1.4(含文档、源码、官方示例).rar

    总之,StrutsTestCase-2.1.4压缩包为用户提供了完整的资源,包括文档、源码和示例,以帮助开发者有效地测试他们的Struts应用程序。通过学习和实践,你可以提高你的测试技能,确保你的Struts应用在上线前具备高质量和...

    Struts的高级应用

    10. **Struts与Spring的集成**:通过Spring-Struts集成,可以利用Spring的强大功能,如依赖注入、事务管理,来管理Struts的Action和业务层对象,提升应用的可维护性和测试性。 总的来说,Struts的高级应用涉及到...

    Jakarta Struts Live

    - **使用StrutsTestCase测试Action**:介绍了如何使用StrutsTestCase测试框架来模拟HTTP请求和响应,以便更全面地测试Action的行为。 - **使用StrutsTestCase(Mock Mode)逐步操作**:给出了使用Mock模式下的...

    struts1.x和struts2.x区别

    Apache Struts是用于构建企业级Web应用程序的开源框架,它提供了MVC(模型-视图-控制器)架构模式的实现,帮助开发者更好地组织代码,提高开发效率。Struts1.x和Struts2.x是该框架的两个主要版本,它们之间存在着...

    struts1.0与struts2.的区别

    Struts是Apache软件基金会的一个开源项目,它提供了一套用于构建企业级Web应用程序的框架。Struts1.0发布于2000年,是最早的一批MVC(模型-视图-控制器)架构框架之一,而Struts2则是在Struts1的基础上进行了大量的...

    Spring与Struts结合测试的问题解答

    在IT行业中,Spring和Struts是两个非常著名的Java Web框架,它们在构建复杂的企业级应用程序中发挥着重要作用。本文将深入探讨Spring与Struts结合时可能会遇到的问题以及相应的解决策略,帮助开发者更好地理解和应对...

    JakartaStrutsLive

    - **应用运行**:说明如何启动和测试构建的第一个Struts应用程序。 #### 使用Struts Console调试`struts-config.xml` - **调试工具介绍**:展示如何利用Struts Console工具检查和调试配置文件。 #### 添加日志支持...

    struts1和struts2的对比

    - 测试Struts1的Action时,通常需要模拟整个Servlet环境,使用如StrutsTestCase等工具进行单元测试。 - **Struts2中的Action** - Struts2采用了更灵活的Action设计,允许Action实现多个接口或者继承自`...

    Struts2和Struts1的不同

    在Struts1框架中,Action是单例模式的,这意味着在整个应用程序生命周期中,只存在一个Action实例。这主要是为了提高性能,但这也意味着Action必须是线程安全的,通常通过实现`Action`接口或继承`ActionForm`类来...

    Struts图书馆管理系统

    Struts图书馆管理系统是一个基于Java EE平台的Web应用程序,它利用了Apache Struts框架来实现对图书馆资源的有效管理和用户交互。Struts是一个开源的MVC(Model-View-Controller)框架,旨在简化创建结构良好、可...

    Struts2和Struts1的一些区别

    ### Struts2与Struts1的主要区别 #### 框架设计原理的不同 - **Action对象的处理方式**:在Struts1中,Action对象...对于希望构建健壮、可扩展的企业级Java Web应用程序的开发者而言,Struts2无疑是一个更佳的选择。

    struts-2.3.16-docs

    Struts 2是Java EE平台上的一个开源MVC框架,用于构建企业级Web应用程序。它在Struts 1的基础上进行了大量的改进和增强,提供了一种更灵活、更强大的方式来组织和控制应用的业务逻辑。Struts 2.3.16是Struts 2的一个...

    struts1.x面试题大全.pdf

    Struts 是一个基于 Java 语言的 MVC 框架,广泛应用于 Web 应用程序开发中。下面是 Struts 的一些重要知识点: Struts 的优点 1. 业界标准:Struts 是一个广泛应用的开源软件,有很多成功的案例和丰富的学习资源...

    Struts1与Struts2的12点区别

    为了进行独立测试,通常需要使用如`StrutsTestCase`之类的第三方工具,通过提供一系列的Mock对象(模拟了`HttpServletRequest`和`HttpServletResponse`)来模拟Web容器环境。 - **Struts2**:提供了更好的测试支持。...

    论坛系统(Struts 2+Hibernate+Spring实现)

    Struts 2、Hibernate 和 Spring 是Java开发领域中三大核心框架,它们的组合常用于构建高效、可维护的企业级Web应用程序,尤其是复杂的论坛系统。在本项目中,这三者协同工作,为论坛的后端架构提供强有力的支持。 1...

    Checked and Unchecked Exception

    StrutsTestCase是Apache Struts框架的一个测试工具,它允许开发者创建单元测试和集成测试来验证Struts应用程序的行为。在使用StrutsTestCase时,开发者可能会遇到各种异常,包括Checked和Unchecked异常。例如,当...

Global site tag (gtag.js) - Google Analytics