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

Cactus学习历程

 
阅读更多

项目描述

Cactus是一个对服务器端Java代码(Servlet,EJBs,Tag Libs, Filters,....)进行单元测试的简单的测试框架。

Cactus的目标是降低编写服务器代码单元测试的成本。它使用并扩展了Junit

Cactus实现了in-container策略,意味着测试是运行在容器内的。

The Cactus Ecosystem

Cactus系统由一些组件组成:

  • Cactus框架:这是Cactus的核心,它是提供编写Cactus测试所用API的引擎。
  • Cactus集成模块(Integration Modules):一些front ends和框架,用来提供一种简单的方式来使用Cactus 框架 (Ant scripts, Eclipse plugin, Maven plugin, ...)。
  • Cactus示例:一些简单的项目,用来演示如何编写Cactus测试,如何使用集成模块。

单元测试的不同种类

一共有几个不同种类的单元测试框架,我们把它们分为三大类:

  1. 类型1:代码逻辑单元测试。或许编写这种测试的最好策略就是使用Mock Objects类型的框架。
  2. 类型2:集成单元测试。Cactus是这种类型中的典型(它是不是最好,我们会让你作出一个评价的^_^)。这种测试会与容器进行交互。
  3. 类型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

本指南适用于Cactus1.4以及更高版本、Tomcat4.0以及其更高版本

本文档演示了如何在10分钟内(当然不包括下载时间^_^)在Tomcat上面安装和运行Cactus测试。

有两种方法可以使你在你的应用程序上执行Cactus测试:

  • 把所有的Cactus Jar包放到你的 WEB-INF/lib目录下面,具体描述见Classpath Tutorial
  • 把Cactus Jar包放到你的容器的classpath中,这样Cactus就会使用容器的Context类加载器加载它们了。本指南将会描述这个策略,这也是一种仅用比较的干扰就可以使很多Web应用程度共用Cactus的方法。

另外,有很多种途径可以触发Cactus测试的执行(请看TestRunner Howto指南)。在本指南中,我们将要描述一种最简单的方式在浏览器上安装Cactus。

第1步到第3步是一个保证Cactus能够在Tomcat上运行的步骤,仅需安装一次。

第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
这是运行Cactus所需要Jar的最小集合,如果稍后你想要使用Cactus进行HttpUnit integration,你还需要拷贝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>
警告: Be careful when you modify the global Tomcatweb.xmlfile. 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.javaJava源文件,编译并将编译后的.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);
    }
}
You'll notice that this isn't even a finished servlet ! However, this shows that you can start testing your code with Cactus even before you have finished writing it completely. Extreme Programmers should like this :-)

We're now read to create our first Cactus test case. Create the followingTestSampleServlet.javajava 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:

XML output of ServletTestRunner

第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。现在,你应该看到下面的界面了:


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics