前言:本文章需要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
分享到:
相关推荐
3. 配置Servlet容器:根据所使用的Servlet容器(如Tomcat、Jetty等),配置Cactus插件或者设置相应的系统属性。 编写Cactus测试用例时,你需要继承自Cactus提供的基类,如`org.apache.cactus.ServletTestCase`。...
- 创建Cactus测试类,这些类继承自Cactus提供的基类,并使用JUnit注解。 - 在测试方法中,使用Cactus提供的API来模拟HTTP请求,与服务器交互。 - 测试执行后,Cactus会捕获结果并报告测试状态。 4. **Cactus的...
CACTUS字体如果是商业产品,用户需要确保有合法使用权。 5. 字体应用:字体在网站设计、图形设计、排版、广告、UI设计等多个领域都有广泛应用。CACTUS字体可能特别适合生态、户外或自然主题的设计项目。 6. 字体...
要使用Cactus,开发者需要在Java Web项目中引入Cactus库,然后编写测试类,这些类会扩展Cactus提供的基类。测试代码将在服务器上下文中运行,可以直接访问Servlet API和其他Web服务。这使得测试更加真实,更接近实际...
为了充分利用这个压缩包,首先需要下载并使用解压工具(如WinRAR、7-Zip等)来打开。在确保来源可靠的情况下,可以查看每个文件,阅读文档,运行程序,或欣赏设计作品。如果涉及到编程代码,可以尝试理解其结构和...
使用Cactus,开发者可以快速构建具备安全控制和内容管理的Web应用程序。在VS2013或VS2015这样的开发环境中,Cactus提供了便捷的集成开发体验。 首先,让我们深入理解MVC模式。MVC是一种设计模式,将应用程序分为三...
**Python-Cactus设计师设计的静态站点生成器** Python-Cactus是一款专为设计师打造的静态站点生成器,它基于Python编程语言,并采用了强大的Django模板引擎。Cactus的主要目的是简化静态网站的创建流程,使得设计师...
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是一个基于JUnit框架的简单测试框架,用来单元测试服务端Java代码。Cactus框架的主要目标是能够单元测试服务端的使用Servlet对象的Java方法如HttpServletRequest,HttpServletResponse,HttpSession等
### 有向Cactus判定的证明 #### 一、引言 有向Cactus图是一种特殊的有向图,其中每条边至多属于一个简单环。这类图在计算机科学领域有着广泛的应用,尤其是在网络流问题、图论研究等方面。本文旨在通过对有向Cactus...
这种集成方式使得开发者能够更方便地使用Cactus来进行测试工作。 #### Cactus的独特之处 除了支持传统的单元测试之外,Cactus还具备了一些独特的特性: - **Ant支持**:虽然本文不会详细展示这一特性,但Cactus的...
3. **学习注解和反射技术**:Cactus大量使用了Java注解和反射,有助于掌握这两项核心技术。 4. **学习Ant和Maven的插件开发**:对于想深入了解构建工具的开发者,Cactus的Ant任务和Maven插件是很好的学习材料。 ...
资源分类:Python库 所属语言:Python 资源全名:Cactus-3.1.0.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
一个变态的jar包,按照我当前的工程环境,应该在weblogic8底下,但就是找不到,所以只好在网上找了,记录在这里。 包含的类: org.apache.cactus.server.ServletTestRedirector
Cactus,Android Keep Alive(安卓保活),Cactus 集成双进程前台服务,JobScheduler,onePix(一像素),WorkManager,无声音乐,博客附件,效果请查看博客相对应项目。
要开始使用Cactus 3.2.0,首先需要将压缩包`Cactus-3.2.0.tar.gz`解压。解压后的文件夹`Cactus-3.2.0`包含库的源代码和其他相关文件。接下来,开发者需要安装依赖并设置环境,以便在项目中导入和使用Cactus库。这...
标题"Cactus_1920x1080_50.rar"暗示这可能是一个包含高清视频帧序列的压缩文件,其中"1920x1080"指的是视频的分辨率,即1920像素宽乘以1080像素高,这是常见的全高清(FHD)分辨率。"50"可能代表帧率,即每秒显示50...
cactus
org.apache.cactus.eclipse.runner-1.8.0.jar