`
xnnyygn
  • 浏览: 44106 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

使用cactus测试ssh应用(2)

阅读更多
接1

接下来就是考虑如何测试struts了,之前使用的是servelttestcase,不能作为我实际应用的测试,不过有部分代码可以借鉴,那就是jetty的启动代码(事实上,在linux下,使用tomcat和jetty启动相差不了多少,时间都是耗在启动spring的beans上,当然测试下最好还是轻量级别比较好)。

尝试了cactusstrutstestcase和mockstrutstestcase,使用中发现,cactusstrutstestcase不查找begin开头的方法,另外还是那个config问题,所以最终我还是选择了mockstrutstestcase。

选择了mockstrutstestcase之后,按照要求调用了superclass的setup和teardown,按照strutstestcase网站上的例子(后来,我看了另外《Struts Recipes》,应该说这本比较适合我的这次测试,不过看的时候我的测试快要完成了……)启动,我知道这次启动肯定不会成功。
因为我把struts和spring整合过了,如果没有注入commonServices(我所调用的loginAction的服务接口)的话,是不能通过测试的。不过这次显示的是没有找到配置文件……靠着搜索引擎的帮助,我找到了一个英文版的cactus+struts测试的例子,我注意到里面提醒要设置上下文路径。因为例子中使用的是myeclipse编辑器(我以前用过,不过jsp编辑老是卡死,所以不用了)。我这里使用的是netbeans,其实有点类似,因为netbeans的工程结构和classpath不同,所以我必须设置上下文为工程的web(因为我并没有启动tomcat),那个netbeans放网页什么的地方。后来我发现这里其实也有提示:
http://www.blogjava.net/wangxq/archive/2005/08/22/10713.html

然后启动jetty出现了我想象的contextlistener问题。单纯没有注入的struts类应用是没有问题的,不过考虑到是ssh应用,我必须考虑如何注入。找如何启动spring上下文,注入其实花了我很长时间,吃过一顿中饭,然后一直想这个问题头很痛,又去睡了几个小时。醒来的时候重新找资料,解决问题。

真得很痛苦,找到了资料,然后测试,虽然头不疼了(估计是眼睛痛)。在javaeye的网站上找到了一篇可以使用的例子:
http://www.iteye.com/topic/18492
按照我的习惯修改了其中的代码,成功的界面:


接下来又是一个烦人的问题,就是假如我放入两个test,其实这个testsuite会启动两次(因为是在setup中启动webapplicationcontext),即使是jetty也会很浪费时间。spring+cactus其实资料不是非常正式,看到的都是要么偏spring(基本没有cactus代码的)或者偏cactus的。最终还是在搜索strutstestcase的时候找到了,找到了两篇,其实内容是一样的:
http://www.searchfull.net/1171468.html
http://tide2046.iteye.com/blog/210728

我注意到了里面的JunitHelper,然后复制了里面的代码,按照我自己的习惯修改了代码,最终测试结果如下:


到此基本上就完成了,最终的代码如下:

首先是保存webapplicationcontext的类(静态内容)
package cn.edu.shu.lehu.hako.tests.actions;

import javax.servlet.ServletContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.web.context.support.XmlWebApplicationContext;
import org.springframework.web.context.WebApplicationContext;

/**
 *
 * @author xnnyygn
 */
public class SpringWebContextHelper {

    public static String[] Configuration_Location;
    private static XmlWebApplicationContext wac = null;
    private static ClassPathXmlApplicationContext fsxac = null;


    static {
        Configuration_Location = new String[]{
                    "/WEB-INF/spring-base.xml",
                    "/WEB-INF/spring-services.xml",
                    "/WEB-INF/spring-struts.xml"};
    }

    public static void setWebApplicationContext(ServletContext context) {

        if (context.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE) != null) {
            return;
        }

        if (wac == null) {
            wac = new XmlWebApplicationContext();
            wac.setServletContext(context);
            wac.setConfigLocations(Configuration_Location);
            wac.refresh();
        }

        context.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, wac);
    }
}


然后是启动jetty的类,实际测试过,貌似用swingui或者awtui会出错,不太清楚原因。
package cn.edu.shu.lehu.hako.tests.actions;

import junit.framework.Test;
import junit.framework.TestSuite;
import org.apache.cactus.extension.jetty.Jetty5xTestSetup;

/**
 *
 * @author xnnyygn
 */
public class TestAllWithJetty {

    public static Test suite() {
        System.setProperty("cactus.contextURL", "your webapp url here");
        TestSuite testSuite = new TestSuite("All test with jetty");
        testSuite.addTestSuite(TestLoginAction.class);
        return new Jetty5xTestSetup(testSuite);
    }

    public static void main(String[] args) {
        junit.textui.TestRunner.run(TestAllWithJetty.suite());        
    }
}


最后是有两个测试方法的类:
package cn.edu.shu.lehu.hako.tests.actions;

import cn.edu.shu.lehu.hako.struts.forms.LoginForm;
import java.io.File;

import servletunit.struts.MockStrutsTestCase;

/**
 *
 * @author xnnyygn
 */
public class TestLoginAction extends MockStrutsTestCase {

    private LoginForm loginForm = new LoginForm();

    public TestLoginAction(String testName) {
        super(testName);
    }

    @Override
    protected void setUp() throws Exception {
        super.setUp();
        setContextDirectory(new File("web"));
        SpringWebContextHelper.setWebApplicationContext(context);
    }

    @Override
    protected void tearDown() throws Exception {
        super.tearDown();
    }

    public void testCorrectLogin() {
        setRequestPathInfo("/login");

        loginForm.setUsername("username");
        loginForm.setPassword("password");
        setActionForm(loginForm);

        actionPerform();
        verifyNoActionErrors();
    }

    public void testInCorrectLogin() {
        setRequestPathInfo("/login");

        loginForm.setUsername("username");
        loginForm.setPassword("password2");
        setActionForm(loginForm);

        actionPerform();
        verifyInputForward();
    }
}


最后是所使用的包名:
引用
spring-mock-2.0-rc3.jar
commons-codec-1.3.jar
aspectjrt-1.5.3.jar
cactus-core-framework.uberjar.jar
httpunit.jar(这个不清楚是否必须)
junit-3.8.2.jar
org.mortbay.jetty-5.1.9.jar
strutstest-2.14.jar

分享到:
评论
1 楼 wangdgsc 2009-08-12  
你好,我最近也在搞这个strutstest,不过遇到了一个问题,就是怎样让strutsTestCase能访问web-inf/struts/struts-config.xml文件,我使用的是myEclipse,不知道你能不能帮我一下,谢谢

相关推荐

    cactus的学习笔记(一)

    首先,Cactus并非一种植物,而是Java Web应用的单元测试框架。它由Apache软件基金会开发,其核心理念是让开发者能够在服务器环境中执行单元测试,而不是在客户端或模拟环境中。这是因为Web应用的许多逻辑与服务器...

    jakarta-cactus-12-1.7.1.rar

    Jakarta Cactus是Java开发中的一个开源框架,主要用于Web应用程序的服务器端单元测试。这个"jakarta-cactus-12-1.7.1.rar"压缩包文件包含了Cactus框架的1.7.1版本,这是一个针对Jakarta项目第12次发布的重要更新。 ...

    cactus-1.8.1-bin.zip

    2. **文档**:可能包含用户指南、API文档和其他帮助文档,这些文档详细介绍了如何配置和使用Cactus进行单元测试。 3. **示例**:可能提供了一些示例项目,展示了如何设置Cactus测试,并且演示了如何针对不同类型的...

    使用EJB+Struts1.3+Ant+Cactus+DbUnit+JMeter+StrutsTest实现测试2

    4. Cactus:Cactus是一个用于在服务器环境中进行单元测试的框架,主要针对Java EE应用。它允许开发者在应用服务器内部运行测试,减少了部署到服务器进行测试的需要,提高了测试效率。 5. DbUnit:DbUnit是一个Junit...

    基于Junit的测试组件cactus

    Cactus是一个基于JUnit框架的简单测试框架,用来单元测试服务端Java代码。Cactus框架的主要目标是能够单元测试服务端的使用Servlet对象的Java方法如HttpServletRequest,HttpServletResponse,HttpSession等

    使用EJB+Struts1.3+Ant+Cactus+DbUnit+JMeter+StrutsTest实现测试3

    结合以上技术,项目通过Ant脚本来构建和部署应用,使用Cactus在EJB和Struts的环境下运行单元测试。DbUnit确保了测试数据的一致性,而StrutsTest则专门针对Struts组件进行测试。最后,JMeter进行性能测试,以验证系统...

    使用EJB+Struts1.3+Ant+Cactus+DbUnit+JMeter+StrutsTest实现测试4

    在本文中,我们将深入探讨如何使用一系列技术和工具,如EJB、Struts1.3、Ant、Cactus、DbUnit、JMeter以及StrutsTest,来实现一个完整的测试流程,针对一个基于Java的企业级应用程序进行全面的测试。这些技术在软件...

    cactus-源码.rar

    Cactus与Servlet容器紧密集成,通过拦截Servlet调用来执行测试代码,大大简化了Web应用的测试流程。 二、源码结构分析 Cactus的源码主要包含以下几个部分: 1. **Cactus Core**:这是Cactus的核心模块,实现了与...

    CACTUS

    CACTUS字体如果是商业产品,用户需要确保有合法使用权。 5. 字体应用:字体在网站设计、图形设计、排版、广告、UI设计等多个领域都有广泛应用。CACTUS字体可能特别适合生态、户外或自然主题的设计项目。 6. 字体...

    Developing and Unit Testing with Cactus

    这种集成方式使得开发者能够更方便地使用Cactus来进行测试工作。 #### Cactus的独特之处 除了支持传统的单元测试之外,Cactus还具备了一些独特的特性: - **Ant支持**:虽然本文不会详细展示这一特性,但Cactus的...

    Cactus,MVC权限后台加上一个CMS

    使用Cactus,开发者可以快速构建具备安全控制和内容管理的Web应用程序。在VS2013或VS2015这样的开发环境中,Cactus提供了便捷的集成开发体验。 首先,让我们深入理解MVC模式。MVC是一种设计模式,将应用程序分为三...

    6-Cactus.rar

    为了充分利用这个压缩包,首先需要下载并使用解压工具(如WinRAR、7-Zip等)来打开。在确保来源可靠的情况下,可以查看每个文件,阅读文档,运行程序,或欣赏设计作品。如果涉及到编程代码,可以尝试理解其结构和...

    软件测试技术在J2EE项目中的应用

    JUnit是Java领域广泛使用的单元测试框架,它的Testcase类用于定义测试用例,每个用例包含一系列测试方法,比较实际结果与预期输出,确保代码逻辑正确。TestSuite类则可以组合多个Testcase或TestSuite,实现对多个类...

    Python-Cactus设计师设计的静态站点生成器

    **2. Django模板引擎** Django是Python世界中的一个著名Web框架,它的模板系统允许开发者分离设计与逻辑,使设计师可以专注于页面的视觉呈现。Cactus集成Django模板,意味着用户可以利用其强大的模板语法,如控制...

    jakarta-cactus-13

    The Cactus project is pleased to announce the release of version 1.7.2. Cactus is a unit testing framework for testing server side java code.

    有向cactus判定的证明

    ### 有向Cactus判定的证明 #### 一、引言 有向Cactus图是一种特殊的有向图,其中每条边至多属于一个简单环。...这种方法为解决实际问题提供了一种新的思路和技术手段,对于理解和应用有向Cactus图具有重要意义。

    Python库 | Cactus-3.2.0.tar.gz

    Cactus库的主要目标是简化Web应用的开发过程,提供了一组工具和框架,使得构建复杂的网络服务变得简单。这个库可能包含了模板引擎、路由系统、中间件支持以及数据库集成等功能,这些都是构建Web应用的基础模块。...

    cactus-report.xsl

    cactus-report.xsl cactus-report.xsl cactus-report.xsl

Global site tag (gtag.js) - Google Analytics