- 浏览: 111730 次
- 性别:
- 来自: 北京
最新评论
-
bo_hai:
请问:这样配置可以解决事务回滚的问题吗?
基于spring和ibatis的多数据源切换方案 -
rockydang:
多谢分享。
第一个配置文件中有一块配置错了,估计是手误啊
...
基于spring和ibatis的多数据源切换方案 -
chao121:
[*]啊顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶121 ...
征求方案-关于多个excel,大数据量同时导入 -
jitabc:
效果很不错。
为spring2.5中的jpetstore增加perf4j监控 -
徐风子:
<p>原题来自:http://projecteul ...
一道软件面试题
背景
我们现在项目包含了很多的子项目,其中包含了单纯的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");
发表评论
-
ANT通过sshexec启动weblogic一直不能退出的解决方案
2009-11-24 16:44 3349通常我们通过sshexec来启动weblogic(其他服务器也 ... -
测试配置为连接数据源单独的jar
2009-08-31 09:46 1074问题描述 以前我们做的项目基于未来 ... -
软件测试周期中各种类型的概念汇总
2009-08-19 16:03 1509之前做持续集成环境时 ... -
maven2使用技巧集合(收集)
2009-07-28 22:45 14361.打包时,不在META-INF中生成maven目录 ... -
使用maven2管理spring2.5项目(基于Jpetstore Demo)
2009-07-27 16:31 3595目的:spring好久没有系统的学习了,借这个机会重新学习一下 ... -
teamcity 5.0 EAP 发布了!
2009-07-24 11:25 1543teamcity的维护更新太快了,几周时间就经历了三个版本了, ... -
基于teamcity的持续集成实践(当前不足)
2009-07-24 11:15 1518持续集成到现在基本上是一个可持续运行的环境了,当然还需要完善。 ... -
基于teamcity的持续集成实践(单元测试)
2009-07-23 17:23 1208单元测试,是一种直接面向生产代码的测试,是一种白盒测试。 ... -
基于teamcity的持续集成实践(集成测试)
2009-07-23 15:48 1204我在此所说的集成测试其实就是项目对外的接口测试,包括http接 ... -
基于teamcity的持续集成实践(findbugs)
2009-07-23 14:20 1212FindBugs 是一个静态分析工具,它检查类或者 JAR 文 ... -
基于teamcity的持续集成实践(emma)
2009-07-23 10:35 1642emma是一个统计代码测试覆盖率的工具,teamcity默认集 ... -
基于teamcity的持续集成实践(ant脚本2)
2009-07-23 10:31 1787上一篇,说到了ant脚本如何分类以及何组织的,现在让我们看一下 ... -
基于teamcity的持续集成实践(ant脚本1)
2009-07-22 23:12 1340使用ant来进行构建,最重要的就是脚本的组织,下面我们将con ... -
基于teamcity的持续集成实践(配置)
2009-07-22 14:43 3552本章节仅覆盖svn上的一个简单项目,集成测试覆盖率、代码质量检 ... -
基于teamcity的持续集成实践(安装)
2009-07-21 23:02 2129准备的基础环境是 1。操作系统hp-unix,teamcit ... -
基于teamcity的持续集成实践(简单介绍)
2009-07-21 16:11 2498持续集成Continuous Integration,一句话概 ...
相关推荐
- 利用StrutsTest扩展测试Struts应用中的Action和Form组件,确保MVC结构的正常工作。 - 通过JMeter进行性能测试,分析系统在高并发下的表现,优化性能瓶颈。 这种全面的测试方法能够确保应用的稳定性和可靠性,降低...
在本文中,我们将深入探讨如何使用一系列技术和工具,如EJB、Struts1.3、Ant、Cactus、DbUnit、JMeter以及StrutsTest,来实现一个完整的测试流程,针对一个基于Java的企业级应用程序进行全面的测试。这些技术在软件...
结合以上技术,项目通过Ant脚本来构建和部署应用,使用Cactus在EJB和Struts的环境下运行单元测试。DbUnit确保了测试数据的一致性,而StrutsTest则专门针对Struts组件进行测试。最后,JMeter进行性能测试,以验证系统...
此外,Cactus还支持EJB、JSP、Struts等Web组件的测试,使得整个Web应用的测试覆盖更加全面。 总结一下,Cactus的学习笔记可能包括了Cactus的介绍、安装配置、测试用例编写、运行测试以及如何利用Cactus进行更复杂...
Cactus是一款用于Java Web应用程序单元测试的开源工具。在深入探讨Cactus的1.8.1版本之前,让我们首先理解什么是单元测试以及为什么它在软件开发中至关重要。 单元测试是软件开发过程中的一个关键环节,它允许...
Cactus是一个基于JUnit框架的简单测试框架,用来单元测试服务端Java代码。Cactus框架的主要目标是能够单元测试服务端的使用Servlet对象的Java方法如HttpServletRequest,HttpServletResponse,HttpSession等
- **使用StrutsTestCase(Cactus Mode)**:解释了如何在Cactus模式下使用StrutsTestCase进行测试,该模式可以与Servlet容器集成,提供更接近实际运行环境的测试体验。 - **使用jWebUnit测试JSP**:介绍了如何使用...
Jakarta Cactus是Java开发中的一个开源框架,主要用于Web应用程序的服务器端单元测试。这个"jakarta-cactus-12-1.7.1.rar"压缩包文件包含了Cactus框架的1.7.1版本,这是一个针对Jakarta项目第12次发布的重要更新。 ...
Cactus的一个关键优势在于它支持在容器内进行测试的策略,包括进程内和单个JVM实例内的测试。这种策略有助于提高测试的准确性和效率,因为它们更接近实际运行时的条件。这也符合Application Developer单元测试工具的...
Cactus与Servlet容器紧密集成,通过拦截Servlet调用来执行测试代码,大大简化了Web应用的测试流程。 二、源码结构分析 Cactus的源码主要包含以下几个部分: 1. **Cactus Core**:这是Cactus的核心模块,实现了与...
5. **test**:包括JUnit、Cactus和StrutsTestCase测试用例,确保代码质量。 6. **tools**:包含辅助工具,如Strutsgen,用于从ActionForms生成JSP页面。 7. **web**:包含了JSP、属性文件、图片、脚本和样式表,这些...
1. **基础程序框架**:AppFuse提供了基于Ant、XDoclet、Spring、Hibernate或iBATIS的项目模板,同时也支持Junit、Cactus、StrutsTestCase、WebTest、Struts Menu、Display Tag Library、OSCach和JSTL以及Struts或...
Cactus是一个基于.NET框架,尤其是.NET 4.5.2版本的MVC(Model-View-Controller)架构的后台管理系统,结合了权限管理和CMS(内容管理系统)的功能。使用Cactus,开发者可以快速构建具备安全控制和内容管理的Web应用...
软件测试技术在J2EE项目中的应用至关重要,因为J2EE平台是企业级应用开发的基石,尤其在大型电子商务等领域,软件质量的高低直接影响到企业的运营和用户体验。J2EE基于Java2平台,提供了一种简化企业解决方案开发、...
10. **插件支持**:Struts1有丰富的插件生态系统,如Cactus用于单元测试,Tiles用于视图布局,Castor用于数据绑定等。 描述中提及的"Struts_blank"文档可能是指Struts的示例项目或者模板,可以帮助初学者快速搭建...