项目描述
Cactus是一个对服务器端Java代码(Servlet,EJBs,Tag Libs, Filters,....)进行单元测试的简单的测试框架。
Cactus的目标是降低编写服务器代码单元测试的成本。它使用并扩展了Junit。
Cactus实现了in-container策略,意味着测试是运行在容器内的。

Cactus系统由一些组件组成:
- Cactus框架:这是Cactus的核心,它是提供编写Cactus测试所用API的引擎。
- Cactus集成模块(Integration Modules):一些front ends和框架,用来提供一种简单的方式来使用Cactus 框架 (Ant scripts, Eclipse plugin, Maven plugin, ...)。
- Cactus示例:一些简单的项目,用来演示如何编写Cactus测试,如何使用集成模块。
单元测试的不同种类
一共有几个不同种类的单元测试框架,我们把它们分为三大类:
- 类型1:代码逻辑单元测试。或许编写这种测试的最好策略就是使用Mock Objects类型的框架。
- 类型2:集成单元测试。Cactus是这种类型中的典型(它是不是最好,我们会让你作出一个评价的^_^)。这种测试会与容器进行交互。
- 类型3:功能性单元测试。这种测试会让你测试从服务端返回来的值。比如HttpUnit()注意HttpUnit也执行标准的功能性测试-Note that HttpUnit also performs standard functional testing - as opposed to functional unit testing -, 让你测试一个完整的用例-比如登录用例,由好几个Request/Response)。which let you test full use cases - a login use case for example, which is comprised of several requests/responses).
最完美的情况是仅仅是要对你的代码进行单元测试,你就要使用3种不同的框架,然后你还要想一下验收测试,系统集成测试... ...
Cactus作为第2种类型测试框架而开发,但是对于类型1和3,也是一个很好的折中,你可以使用Cactus更容易的为一个单独的框架写测试。此外你从来都不用完全的测试你的代码,我们相信Cactus提供了一个中间组(middle groud),可以自信的保证你的代码在发布后可以运行。然而,这是你的选择,你也可以仅使用Cactus进行第2种类型的测试,如果你愿意。
开始使用
想要开始使用Cactus,请阅读Getting Started指南。
序
如果你想快速的体验一下Cactus, 有一个20 minutes tutorial会带领你在Tomcat上完整的运行你的第一个Cactus测试。这个测试仅仅是让你快速的测试了一些东西,但是却没有解释Cactus如何工作或者其它一些细节内容。
我们建议你运行那个快速指南后,回到这里继续往下看,你已经看到了运行中的Cactus并且准备好理解它背后的概念和它的全部的强大功能。
安装Cactus
Cactus没一个真正安装,因为Cactus是一个框架而不是一个应用程序。可是你需要理解它是如何集成 进你的工作环境中的。 为了简单集成这个工作,Cactus提供了several integration modules。 所以,安装Cactus简单的意味着选择一个集成模块,并且学习如何配置和使用它。
系统需求
为了能运行Cactus测试,你的系统上必须已经安装下面的软件:
- Java虚拟机一个Java1.2或以上版本兼容的虚拟机。注意,Servlet引挚的运行需要JVM,所以如果你使用了Servlet,你就必须已经安装了一个JVM。
- Servlet/J2EE引挚一个符合Servlet 2.x/J2EE 1.x 规范的Servlet引挚,用来运行你的Cactus测试。
你也需要一个集成Cactus的开发工具。例如:你计划使用Ant集成,你就必须要安装一个Ant;如果你想从一个IDE上执行Cactus测试,那么这个IDE也是必须已经安装的;等等...
Cactus的文件
现在,你应该下载一个Cactus的分发包(选择你打算使用的J2EE API版本 ),然后将其解压到[cactus root]
目录。
你会在[cactus root]
找到下面的目录:
-
doc/
:包含了 Cactus网站和 API javadocs。 -
lib/
:包含了Cactus jars和相关的扩展库。
-
samples/
:包含了示例应用,展示如何写Cactus测试,如何自动执行它们。
-
samples/ejb
:包含了展示如何用Cactus写EJB单元测试的应用程序。
-
samples/jetty
:包含了展示如何用Cactus写Servlet和Jetty(使用
JettyTestSetup
扩展)单元测试的应用程序。 -
samples/servlet
:contains a sample application showing how to test Servlet/JSPs/Taglibs with Cactus. 包含了展示如何用Cactus写Servlet/JSPs/Taglibs单元测试的应用程序。
-
web/
:包含了JSP redirector文件,如果你使用manual integration时,你需要这个文件。
补充Cactus的Jar包是:
-
cactus.jar
: 主要的Jar包,包含了框架的类,你可以在[cactus root]/lib
下面找到它。 -
cactus-ant.jar
:这个Jar包包含了一些自定义的Ant任务,以便于更容易的跟Ant进行集成。它仅仅在你想使用Ant来自动运行Cactus测试时才需要。关于更多的将Cactus与Ant集成在一起的信息,请看Ant Howto指南。你可在在[cactus root]/lib
下找到这个Jar包。 -
httpclient.jar
: Cactus 依赖Jakarta Commons HttpClient框架处理Cookie。 -
junit.jar
: Cactus扩展了JUnit,所以需要JUnit jar. -
aspectjrt.jar
: Cactus 使用AspectJ完成了一些任务(记录方法的进入和退出,检查配置等等)。 -
commons-logging.jar
: Cactus 使用Jakarta Commons Logging 框架为Cacuts提供与现存的日志框架进行无缝的连接。 Commons HttpClient框架也需要它。 -
servletapi.jar
: 编译Servelt例子时需要它。最理想的是我们应该集成J2EE Jar包(编译EJB例子时会用到),可是Sun的license不允许我们再次分发它,所以你得自己下载去了(请看Sample howto页面)。 -
httpunit.jar
:Cactus使用HttpUnit框架完成complex assertions of returned responses。 Cactus也集成了一个默认的Web响应对象,但是HttpUnit被用来完成复杂的断言。 -
nekohtml.jar
: HttpUnit需要它。
下一步做什么?
现在,你应该理解Cactus是什么,它是如何工作的了。
选择一个你希望在你的开发环境中使用的Cactus integration module,详细阅读它是如何工作的和如何使用它。
然后,你应该阅读TestCase Howto来理解如何编写Cactus测试用例。
最后一步,你或许可能通过running the Cactus Samples来进行实践了,毕竟你也学了那么久了。
Enjoy!
Tomcat Quickstart forewords
本文档演示了如何在10分钟内(当然不包括下载时间^_^)在Tomcat上面安装和运行Cactus测试。
有两种方法可以使你在你的应用程序上执行Cactus测试:
- 把所有的Cactus Jar包放到你的 WEB-INF/lib目录下面,具体描述见Classpath Tutorial,
- 把Cactus Jar包放到你的容器的classpath中,这样Cactus就会使用容器的Context类加载器加载它们了。本指南将会描述这个策略,这也是一种仅用比较的干扰就可以使很多Web应用程度共用Cactus的方法。
另外,有很多种途径可以触发Cactus测试的执行(请看TestRunner Howto指南)。在本指南中,我们将要描述一种最简单的方式在浏览器上安装Cactus。
第1步:安装Tomcat
下载Tomcat4.0或更高版本,将其解压到一个目录,我们称这个目录为[tomcat-root]
。
第2步:拷贝Cactus Jar包
从Cactus download page下载Cactus的Jar包,这些Jar放在压缩文件的lib/
目录下。
将下面的Jar包拷贝到[tomcat-root]/common/lib
下面:
cactus.jar
commons-httpclient.jar
commons-logging.jar
junit.jar
aspectjrt.jar
httpunit.jar
包。
第3步:修改 Tomcat web.xml文件
编辑[tomcat-root]/conf/web.xml
文件,将下面的内容放到文件开头的<webapp>
标签下面。
<servlet> <servlet-name>ServletRedirector</servlet-name> <servlet-class>org.apache.cactus.server.ServletTestRedirector</servlet-class> <init-param> <param-name>param1</param-name> <param-value>value1 used for testing</param-value> </init-param> </servlet> <servlet> <servlet-name>ServletTestRunner</servlet-name> <servlet-class>org.apache.cactus.server.runner.ServletTestRunner</servlet-class> </servlet>
然后,在最后一个<servlet>
定义(除了我们上面的两个<servlet>,Tomcat还提供了一些。)后面加上下面的内容:
<servlet-mapping> <servlet-name>ServletRedirector</servlet-name> <url-pattern>/ServletRedirector</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>ServletTestRunner</servlet-name> <url-pattern>/ServletTestRunner</url-pattern> </servlet-mapping>
web.xml
file. If later on you wish to use the Cactus Ant integration and more specifically if you use the
<cactifywar>
Ant task, you may run into problems. The
<cactifywar>
task automatically adds the needed Cactus redirectors (thus they'll be added twice leading to an error.
第4步:建立一个简单的测试用的应用程序
现在,我们在服务器上建立一个非常非常简单的应用程序,以便于我们来对它进行单元测试。
首先,建立下面的目录结构:
[tomcat-root]/webapps |_ test |_ WEB-INF |_ classes
接着,建立下面的SampleServlet.java
Java源文件,编译并将编译后的.class文件拷贝到[tomcat-root]/webapps/test/WEB-INF/classes
目录下面。
import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; public class SampleServlet extends HttpServlet { public void saveToSession(HttpServletRequest request) { String testparam = request.getParameter("testparam"); request.getSession().setAttribute("testAttribute", testparam); } }
We're now read to create our first Cactus test case. Create the followingTestSampleServlet.java
java source file, compile it and copy the resulting .class file in[tomcat-root]/webapps/test/WEB-INF/classes
.
import junit.framework.Test; import junit.framework.TestSuite; import org.apache.cactus.ServletTestCase; import org.apache.cactus.WebRequest; public class TestSampleServlet extends ServletTestCase { public TestSampleServlet(String theName) { super(theName); } public static Test suite() { return new TestSuite(TestSampleServlet.class); } public void beginSaveToSessionOK(WebRequest webRequest) { webRequest.addParameter("testparam", "it works!"); } public void testSaveToSessionOK() { SampleServlet servlet = new SampleServlet(); servlet.saveToSession(request); assertEquals("it works!", session.getAttribute("testAttribute")); } }
第5步:运行测试
Time to enjoy our hard work ! Start Tomcat by running[tomcat-root]/bin/startup.bat
(for windows) or[tomcat-root]/bin/startup.sh
(for unix).
Open a browser and point it athttp://localhost:8080/test/ServletTestRunner?suite=TestSampleServlet
You should see:

第6步:更多有趣的东西!
很好,但是我怎样才能想看HTML而不是XML?别急,这里有一个方法。Grab the followingXSLT stylesheet(based on the stylesheet used by the<junitreport>Ant task) and drop it in[tomcat-root]/webapps/test
. 然后,打开浏览器,在地址栏输入:http://localhost:8080/test/ServletTestRunner?suite=TestSampleServlet&xsl=cactus-report.xsl
。现在,你应该看到下面的界面了: