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

Cactus使用

阅读更多

前言:本文章需要JUnit单元测试框架的基础知识,若读者还不具备,请阅读笔者的JUnit文章:http://ray-yui.iteye.com/blog/1914106



UnitTest系列文章:
      使用JUnit开发单元测试:http://ray-yui.iteye.com/blog/1914106
      使用DBUnit扩展JUnit:http://ray-yui.iteye.com/blog/1914979
      使用EasyMock扩展Junithttp://ray-yui.iteye.com/blog/1916170
      使用Spring TestContext测试Spring应用http://ray-yui.iteye.com/blog/1921424
      使用Cobertura生成测试覆盖率报告http://ray-yui.iteye.com/blog/1921958



什么是Cactus?
      Cactus是Apache下的一个开源测试Web层的框架,可以完成模拟J2EE的容器来进行测试,可以测试Servlet,JSP,Filter,EJB等等,以下图片为Cactus官方网站的原理图
                                   

为什么要使用Cactus?
      当测试DAO时我们可以使用DBUnit来进行对数据库的隔离,当我们测试Service的时候可以使用EasyMock来模拟DAO的实现进行Service和DAO的隔离,虽然我们测试Servlet的时候也可以使用EasyMock来对Session,Request等来进行模拟,但实际上我们会发现,使用Mock来模拟Servlet只能测试简单的Servlet,例如Session,Request,Parameter等,对一些Servlet的返回值,返回了什么View等,测试起来还是力不从心,使用Cactus可以产生模拟的容器来对Servlet进行测试,大大减低了测试难度和提高了测试效率

Cactus使用:
      增加Maven依赖

<dependency>
	<groupId>httpunit</groupId>
	<artifactId>httpunit</artifactId>
	<version>1.7</version>
</dependency>
<dependency>
	<groupId>org.apache.cactus</groupId>
	<artifactId>cactus.core.framework.uberjar.javaEE.15</artifactId>
	<version>1.8.1</version>
</dependency>


      在maven管理下的src/test/resources/中增加cactus.properties

cactus.contextURL=http://localhost:8080/test


      以下为被测试的Servlet

package com.accentrix.ray.test.unit;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.accentrix.ray.entity.User;

public class LoginServlet extends HttpServlet {

	/**
	 * 
	 */
	private static final long serialVersionUID = 6916692964267082204L;

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		String userName = req.getParameter("username");
		if (userName == null || "".equals(userName.trim()))
			resp.sendRedirect("/error.jsp");
		else
			req.getRequestDispatcher("/success.jsp").forward(req, resp);
	}
}


      以下为测试类

package com.accentrix.ray.test.unit;

import java.io.IOException;

import javax.servlet.ServletException;

import org.apache.cactus.ServletTestCase;
import org.apache.cactus.WebRequest;
import org.xml.sax.SAXException;

import com.meterware.httpunit.WebResponse;

public class TestLoginServlet extends ServletTestCase {

	private LoginServlet loginServlet;

	/*
	 * 由begin开始的方法,都被视为客户端方法,这里的操作 都应该是从
	 * 客户端发出的,例如客户端传递给服务端的参数就应该从begin方法
	 * 中传入,参数WebRequest为生成request而需要
	 */
	public void beginLogin(WebRequest request) {
		// 通过request.addParameter()来添加parameter
		request.addParameter("username", "Ray");
	}

	/*
	 * 初始化对象
	 */
	public void setUp() {
		loginServlet = new LoginServlet();
	}

	/*
	 * 测试doGet方法
	 */
	public void testDoGet() throws ServletException, IOException {
		// 注意,此时request和response为ServletTestCase的属性
		loginServlet.doGet(super.request, super.response);
	}

	/*
	 * 由end开始的方法,都被视为服务器响应方法,这里操作
	 * 的应该是验证服务器传回来的结果,例如返回的JSP是否正确
	 * ,参数WebResponse为验证提供了大量的方法,例如getTable
	 */
	public void endDoGet(WebResponse response) throws SAXException {
		//返回已编译后的html页面的title
		assertEquals("test", response.getTitle());
		//返回整个html的document
		assertEquals("test", response.getDOM().getElementById("Ray").getNodeValue());
		//返回指定名称的元素
		assertEquals(3, response.getElementsByTagName("input").length);
	}
}


      编写完毕后,还需要把项目布置到服务器当中,开启服务器后运行test case

注意事项:
      1.在cactus.properties文件中,contextURL的值需要注意后面不能添加 '/',
        例如http://localhost:8080/test/ <--这样是错误的,因为Cactus会寻找
        http://localhost:8080/test/ServletRedirector来解释测试类

      2.Cactus1.8.1版本目前还不支持Junit4的Annotation,所以开发这需要遵循
        Junit3.8的规范来开发,例如@Before需要用setUp()来替换

      3.编写test case时,beginXXX testXXX endXXX为一个组合,xxx为自定义名字,
        不同组合的begin和end不会互相影响

      4.在上述例子中endDoGet(WebResponse response)中WebResponse中的类型
        为httpunit中的实现类com.meterware.httpunit.WebResponse,若开发者
        使用的是Cactus中的org.apache.cactus.WebRequest时,将不能使用getTable(),
        getTitle等方法

      Cactus是功能非常强大的Web容器测试框架,除了测试Servlet还可以测试JSP,Filter,EJB等,当有实际需求时,可以上Cactus官方网站进行学习,上面都有非常详细的Demo和解释http://jakarta.apache.org/cactus/



总结:
      笔者在学习Cactus时发现可以使用Jetty嵌入式服务器达到在测试前启动服务器的效果,但学习过后Demo并不能成功运行,所以请有兴趣的读者参考其他资料,笔者觉得在实际开发当中没有使用Cactus的必要,因为Web层是离前台最近的地方,通过界面点击进行参数等的观察都非常方便,测试的价值并没有Service和DAO的大,而且Cactus虽然功能强大,但易用性并不是太好.建议读者遇到实际需求时认真选择是否使用Cactus
  • 大小: 17.2 KB
1
0
分享到:
评论

相关推荐

    cactus的学习笔记(一)

    3. 配置Servlet容器:根据所使用的Servlet容器(如Tomcat、Jetty等),配置Cactus插件或者设置相应的系统属性。 编写Cactus测试用例时,你需要继承自Cactus提供的基类,如`org.apache.cactus.ServletTestCase`。...

    jakarta-cactus-12-1.7.1.rar

    - 创建Cactus测试类,这些类继承自Cactus提供的基类,并使用JUnit注解。 - 在测试方法中,使用Cactus提供的API来模拟HTTP请求,与服务器交互。 - 测试执行后,Cactus会捕获结果并报告测试状态。 4. **Cactus的...

    CACTUS

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

    cactus-1.8.1-bin.zip

    要使用Cactus,开发者需要在Java Web项目中引入Cactus库,然后编写测试类,这些类会扩展Cactus提供的基类。测试代码将在服务器上下文中运行,可以直接访问Servlet API和其他Web服务。这使得测试更加真实,更接近实际...

    6-Cactus.rar

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

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

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

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

    **Python-Cactus设计师设计的静态站点生成器** Python-Cactus是一款专为设计师打造的静态站点生成器,它基于Python编程语言,并采用了强大的Django模板引擎。Cactus的主要目的是简化静态网站的创建流程,使得设计师...

    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-report.xsl

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

    基于Junit的测试组件cactus

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

    有向cactus判定的证明

    ### 有向Cactus判定的证明 #### 一、引言 有向Cactus图是一种特殊的有向图,其中每条边至多属于一个简单环。这类图在计算机科学领域有着广泛的应用,尤其是在网络流问题、图论研究等方面。本文旨在通过对有向Cactus...

    Developing and Unit Testing with Cactus

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

    cactus-源码.rar

    3. **学习注解和反射技术**:Cactus大量使用了Java注解和反射,有助于掌握这两项核心技术。 4. **学习Ant和Maven的插件开发**:对于想深入了解构建工具的开发者,Cactus的Ant任务和Maven插件是很好的学习材料。 ...

    Python库 | Cactus-3.1.0.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:Cactus-3.1.0.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    cactus.core.framework.uberjar.javaEE.14-1.8.1.jar

    一个变态的jar包,按照我当前的工程环境,应该在weblogic8底下,但就是找不到,所以只好在网上找了,记录在这里。 包含的类: org.apache.cactus.server.ServletTestRedirector

    Cactus.zip

    Cactus,Android Keep Alive(安卓保活),Cactus 集成双进程前台服务,JobScheduler,onePix(一像素),WorkManager,无声音乐,博客附件,效果请查看博客相对应项目。

    Python库 | Cactus-3.2.0.tar.gz

    要开始使用Cactus 3.2.0,首先需要将压缩包`Cactus-3.2.0.tar.gz`解压。解压后的文件夹`Cactus-3.2.0`包含库的源代码和其他相关文件。接下来,开发者需要安装依赖并设置环境,以便在项目中导入和使用Cactus库。这...

    Cactus_1920x1080_50.rar

    标题"Cactus_1920x1080_50.rar"暗示这可能是一个包含高清视频帧序列的压缩文件,其中"1920x1080"指的是视频的分辨率,即1920像素宽乘以1080像素高,这是常见的全高清(FHD)分辨率。"50"可能代表帧率,即每秒显示50...

    cactus.dll

    cactus

    org.apache.cactus.eclipse.runner-1.8.0.jar

    org.apache.cactus.eclipse.runner-1.8.0.jar

Global site tag (gtag.js) - Google Analytics