`
eddysheng
  • 浏览: 111730 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

基于cactus和StrutsTestCase容器内测试struts1.2应用

阅读更多

背景

 

    我们现在项目包含了很多的子项目,其中包含了单纯的war应用,它的特征是适用struts1.2作为其mvc组件,没有自己的数据库操作dao层和service层,它的所有数据操作都是通过调用服务层模块的ejb接口来实现的。前一阶段一直在构建持续集成的环境,对于这样的模块的测试一直没有做,因为没有找到好的方式来做,前几天看了一下cactus和strutstestcase,发现这正是我所需要的。其实我本来对单元测试没有什么意见,但是因为其繁琐性和单一性以及费时费力,所以我更喜欢集成测试,而cactus和strutstestcase恰巧有容器内集成测试的功能。

 

    cactusstrutstestcase相当于在测试客户端和测试服务端架起的一座桥梁,它将客户端测试的运行委托给已部署在服务端的测试用例来执行,执行结果又通过其传导给测试客户端,因此测试代码在测试服务端和测试客户端基本上各自要保持一份对等的测试用例,这样就很好的解决了容器内测试。从其名字上可以看出,它很依赖cactus和struts,因此其中的很多细节都跟这两个组件有关联。

 

    另外,cactus也可以容器内测试servlet,ejb等组件,cactusstrutstestcase只是对于cactus测试servlet的一个包装。

 

依赖

 

    cactus 1.4

    stutstestcase2.1.4

    其他

 

    其jar包的依赖,如下

 

                                                              图1 来自cactus站点

各自还要依赖strutstest-2.1.4.jar

 

其配置文件依赖如下图

                                                                   图2 来自cactus站点

 

 

    这些依赖的jar包和配置文件在strutstestcase的下载文件中都能找到,虽然cactus已经更新到了1.8版本,但是strutstestcase最新版本因为还在使用1.4版本,所以我也适用其1.4版本。

 

 

实现

 

 

   一个action

public class LoginAction extends Action {
    public final static String FORWARD_SUCCESS = "success";
    public final static String FORWARD_FAILURE = "failure";
    public final static String FORWARD_ERROR = "error";

    public ActionForward login(ActionMapping mapping, ActionForm form,
			HttpServletRequest req, HttpServletResponse res) throws Exception {
		LoginForm loginForm = (LoginForm) form;
		String msisdn = loginForm.getMsisdn();
		String pwd = loginForm.getPwd();

		ServiceFactory serviceFactory = ServiceFactory.getInstance();

                TestPortalService selfCareService = serviceFactory.getSelfCareService();
		SelfCareUser selfCareUser = selfCareService.login(msisdn, pwd);
      
       req.getSession().setAttribute("user", selfCareUser);


		return mapping.findForward(FORWARD_SUCCESS);
	}
}
 

   一个actionform

public class LoginForm extends ActionForm{

	private String msisdn;
	private String pwd;

	public String getMsisdn() {
		return msisdn;
	}
	public void setMsisdn(String msisdn) {
		this.msisdn = msisdn;
	}
	public String getPwd() {
		return pwd;
	}
	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
}
 

   一个servicefactory

public class ServiceFactory {
        private static boolean local = true;
	private static ServiceFactory instance;

	private static InitialContext initialContext;

	private final static String factory_initial = "weblogic.jndi.WLInitialContextFactory";

	private static Map homeMap = new HashMap();

	private static Map servicesMap = new HashMap();

	private static Logger logger = Logger.getLogger(ServiceFactory.class);

	public static ServiceFactory getInstance() {

		if (instance == null) {

			syncServiceFactory();

		}
		return instance;
	}

	public synchronized static void syncServiceFactory() {
		if (instance == null)
			instance = new ServiceFactory();
	}

	public InitialContext setupInitialContext() {
		if (initialContext == null) {
			syncInitialContext();
		}
		return initialContext;
	}

	public synchronized  void syncInitialContext() {
		if (initialContext == null) {
			if (local == true) {
				try {
					initialContext = new InitialContext();
				} catch (NamingException e) {
					logger.error("serviceFacotry localEJB" + e.toString());
				}
			} else {
				Hashtable serverEnv = new Hashtable();
				serverEnv.put("java.naming.factory.initial", "weblogic.jndi.WLInitialContextFactory");
				serverEnv.put("java.naming.provider.url", "t3://16.158.48.31:8001");
				try {
					initialContext = new InitialContext(serverEnv);
				} catch (NamingException e) {
					logger.error("serviceFacotry remoteEJB" + e.toString());
				}
			}

		}
	}

      private Object getServices(String jndi, Class homeClass) {

		setupInitialContext();

		Object service = servicesMap.get(jndi);
		try {
			if (service == null) {
				Object home = homeMap.get(jndi);
				if (home == null) {
					Object obj = initialContext.lookup(jndi);
					home = PortableRemoteObject.narrow(obj, homeClass);
					homeMap.put(jndi, home);
				}
				service = homeClass.getMethods()[0].invoke(home, null);
				servicesMap.put(jndi, service);
			}
		} catch (Exception e) {
			logger.error("Can't get remote selfcare service!"
					+ e.toString());
			// throw new Exception("Can't get remote selfcare service!", e);
		}
		return service;
	}


     public TestPortalService getSelfCareService() {
		return (TestPortalService) getServices("ejb/TestPortalService",
                        TestPortalServiceHome.class);
	}

  }   
        
 

   一个struts-config。xml

 

<struts-config>
    <!-- ========== Form Bean Definitions =================================== -->
    <form-beans>
        <form-bean name="loginForm" type="LoginForm"/>
    </form-beans>
    <!-- ========== Global Forward Definitions ============================== -->
    <global-forwards>
        <forward name="login" path="/login/login.jsp"/>
        <forward name="success" path="/main/success.jsp"/>
    </global-forwards>
    <!-- ========== Action Mapping Definitions ============================== -->
    <action-mappings>
        <!-- Process a user logon -->
        <action path="/login" type="LoginAction" name="loginForm" input="/login/login.jsp" scope="request" />
    </action-mappings>  

</struts-config>
 

   一个testcase

public class TestportalTest extends CactusStrutsTestCase {
	
	public TestportalTest(String s) {
        super(s);
    }

	public void testSuccessfulLogin() throws Exception{
		
		addRequestParameter("msisdn","15800001000");
        addRequestParameter("pwd","111111");
        setRequestPathInfo("/login");
        actionPerform();
        verifyForward("success");
	    verifyForwardPath("/index.jsp");
        verifyNoActionErrors();
	}
}
 

   一个web。xml部分

<servlet>
        <servlet-name>ServletRedirector</servlet-name>
        <servlet-class>org.apache.cactus.server.ServletTestRedirector</servlet-class>
    </servlet>

<servlet-mapping>
        <servlet-name>ServletRedirector</servlet-name>
        <url-pattern>/ServletRedirector</url-pattern>
    </servlet-mapping>
 

 

客户端运行测试

public class TestportalTest extends CactusStrutsTestCase {
	
	public TestportalTest(String s) {
        super(s);
        System.setProperty("cactus.contextURL", "http://16.158.48.31:8001/testportal");
		System.setProperty("cactus.servletRedirectorName", "ServletRedirector");
		System.setProperty("cactus.enableLogging", "true");
    }

	public void testSuccessfulLogin() throws Exception{
		
		addRequestParameter("msisdn","15800001000");
        addRequestParameter("pwd","111111");
        setRequestPathInfo("/login");
        actionPerform();
        verifyForward("success");
	    verifyForwardPath("/index.jsp");
        verifyNoActionErrors();
	}
}
 

 

其他

 

    如果多个struts配置文件是通过分模块分目录如下配置

 

<servlet>
        <servlet-name>action</servlet-name>
        <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
        <init-param>
            <param-name>config</param-name>
            <param-value>/WEB-INF/struts-config.xml</param-value>
        </init-param>
        <init-param>
            <param-name>config/1</param-name>
            <param-value>/WEB-INF/struts-config-1.xml</param-value>
        </init-param>
        <init-param>
            <param-name>config/2</param-name>
            <param-value>/WEB-INF/struts-config-2.xml</param-value>
        </init-param>
        <init-param>
            <param-name>debug</param-name>
            <param-value>3</param-value>
        </init-param>
        <load-on-startup>2</load-on-startup>
    </servlet>

 时,在测试其中非主struts配置中的action时,可以通过CactusStrutsTestCase的setConfigFile来指定模块,譬如setConfigFile("2", "/WEB-INF/struts-config-2.xml");

 

 

 

 

 

 

0
0
分享到:
评论

相关推荐

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

    - 利用StrutsTest扩展测试Struts应用中的Action和Form组件,确保MVC结构的正常工作。 - 通过JMeter进行性能测试,分析系统在高并发下的表现,优化性能瓶颈。 这种全面的测试方法能够确保应用的稳定性和可靠性,降低...

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

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

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

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

    cactus的学习笔记(一)

    此外,Cactus还支持EJB、JSP、Struts等Web组件的测试,使得整个Web应用的测试覆盖更加全面。 总结一下,Cactus的学习笔记可能包括了Cactus的介绍、安装配置、测试用例编写、运行测试以及如何利用Cactus进行更复杂...

    cactus-1.8.1-bin.zip

    Cactus是一款用于Java Web应用程序单元测试的开源工具。在深入探讨Cactus的1.8.1版本之前,让我们首先理解什么是单元测试以及为什么它在软件开发中至关重要。 单元测试是软件开发过程中的一个关键环节,它允许...

    基于Junit的测试组件cactus

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

    Jakarta Struts Live

    - **使用StrutsTestCase(Cactus Mode)**:解释了如何在Cactus模式下使用StrutsTestCase进行测试,该模式可以与Servlet容器集成,提供更接近实际运行环境的测试体验。 - **使用jWebUnit测试JSP**:介绍了如何使用...

    jakarta-cactus-12-1.7.1.rar

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

    Developing and Unit Testing with Cactus

    Cactus的一个关键优势在于它支持在容器内进行测试的策略,包括进程内和单个JVM实例内的测试。这种策略有助于提高测试的准确性和效率,因为它们更接近实际运行时的条件。这也符合Application Developer单元测试工具的...

    cactus-源码.rar

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

    AppFuse Architecture

    5. **test**:包括JUnit、Cactus和StrutsTestCase测试用例,确保代码质量。 6. **tools**:包含辅助工具,如Strutsgen,用于从ActionForms生成JSP页面。 7. **web**:包含了JSP、属性文件、图片、脚本和样式表,这些...

    appfuse开发文档

    1. **基础程序框架**:AppFuse提供了基于Ant、XDoclet、Spring、Hibernate或iBATIS的项目模板,同时也支持Junit、Cactus、StrutsTestCase、WebTest、Struts Menu、Display Tag Library、OSCach和JSTL以及Struts或...

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

    Cactus是一个基于.NET框架,尤其是.NET 4.5.2版本的MVC(Model-View-Controller)架构的后台管理系统,结合了权限管理和CMS(内容管理系统)的功能。使用Cactus,开发者可以快速构建具备安全控制和内容管理的Web应用...

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

    软件测试技术在J2EE项目中的应用至关重要,因为J2EE平台是企业级应用开发的基石,尤其在大型电子商务等领域,软件质量的高低直接影响到企业的运营和用户体验。J2EE基于Java2平台,提供了一种简化企业解决方案开发、...

    Struts1.1.6

    10. **插件支持**:Struts1有丰富的插件生态系统,如Cactus用于单元测试,Tiles用于视图布局,Castor用于数据绑定等。 描述中提及的"Struts_blank"文档可能是指Struts的示例项目或者模板,可以帮助初学者快速搭建...

Global site tag (gtag.js) - Google Analytics