转自:http://caterpillar.onlyfun.net/GossipCN/JUnit/FirstCactusWithTomcat.htm
来看看如何使用Cactus配合Tomcat来运行一个简单的Servlet测试,我们先取得Cactus相关档案,请至 Cactus 官方网站 下载,下载后解开压缩档案,将其下lib目录中的commons-logging-xxx.jar、aspectjrt-xxx.jar、cactus- xxx.jar、commons-httpclient-xxx.jar与junit-xxx.jar放置在您的Web应用程式的WEB-INF/lib 目录下。
您将使用Cactus的ServletTestRedirector作为之前介绍的Redirector Proxy,并使用Cactus的ServletTestRunner作为执行测试时的TestRunner,这两个被撰写为Servlet,所以您在 web.xml中加以定义:
- web.xml
<?xml version="1.0" encoding="ISO-8859-1"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> <description> Cactus Demo </description> <display-name>Cactus Demo</display-name> <servlet> <servlet-name>ServletRedirector</servlet-name> <servlet-class> org.apache.cactus.server.ServletTestRedirector </servlet-class> </servlet> <servlet> <servlet-name>ServletTestRunner</servlet-name> <servlet-class> org.apache.cactus.server.runner.ServletTestRunner </servlet-class> </servlet> <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-app>
接下来您先撰写测试案例,您将测试Servlet,所以要继承ServletTestCase:
- LoginServletTest.java
package onlyfun.caterpillar.test; import org.apache.cactus.ServletTestCase; import org.apache.cactus.WebRequest; import onlyfun.caterpillar.LoginServlet; public class LoginServletTest extends ServletTestCase { public void beginValidUser(WebRequest webRequest) { webRequest.addParameter("username", "justin"); webRequest.addParameter("password", "123456"); } public void testValidUser() { LoginServlet loginServlet = new LoginServlet(); assertTrue(loginServlet.isValidUser(request)); } public void beginInValidUser(WebRequest webRequest) { webRequest.addParameter("username", "guest"); webRequest.addParameter("password", "123456"); } public void testInValidUser() { LoginServlet loginServlet = new LoginServlet(); assertFalse(loginServlet.isValidUser(request)); } }
TestRunner会呼叫beginXXX()方法(如果有的话),beginXXX()方法接收一个WebRequest 参数,您可以透过这个物件设定一些HTTP相关的讯息,例如加入使用者名称与密码,每一个testXXX()配合一个beginXXX()方法,所以名称 上必须符合,beginXXX()方法会在testXXX()方法之前被呼叫。
在testXXX()方法中您可以看到我们使用request名称,在接收到请求之后,Container 会产生相关的资源物件,ServletTestRedirector会将这些物件设定给request名称来参考,request即 ServletRequest物件,之后您可以使用这些相关物件来执行测试。
根据测试案例的内容,您可以撰写LoginServlet:
- LoginSerlvet.java
package onlyfun.caterpillar; import javax.servlet.http.*; public class LoginServlet extends HttpServlet { public boolean isValidUser(HttpServletRequest request) { String username = request.getParameter("username"); String password = request.getParameter("password"); if(username == null || password == null || !username.equals("justin") || !password.equals("123456")) { return false; } else { return true; } } }
接下来可以启动Container了,可以开启浏览器并指定以下的网址来进行测试:
http://localhost:8080/cactusDemo/ServletTestRunner?
suite=onlyfun.caterpillar.test.LoginServletTest
suite=onlyfun.caterpillar.test.LoginServletTest
执行的结果会以XML传回:
<testsuites>
<testsuite name="onlyfun.caterpillar.test.LoginServletTest"
tests="2" failures="0" errors="0" time="0.781">
<testcase name="testValidUser" time="0.625"/>
<testcase name="testInValidUser" time="0.062"/>
</testsuite>
</testsuites>
<testsuite name="onlyfun.caterpillar.test.LoginServletTest"
tests="2" failures="0" errors="0" time="0.781">
<testcase name="testValidUser" time="0.625"/>
<testcase name="testInValidUser" time="0.062"/>
</testsuite>
</testsuites>
您也可以直接取得Cactus网站上提供的 cactus-report.xsl,并将之放在Web应用程式的目录下,然后使用以下的方式来取得较易阅读的讯息:
http://localhost:8080/cactusDemo/ServletTestRunner?
suite=onlyfun.caterpillar.test.LoginServletTest&xsl=cactus-report.xsl
suite=onlyfun.caterpillar.test.LoginServletTest&xsl=cactus-report.xsl
一个执行的结果网页画面如下:
![Cactus执行画面 Cactus执行画面](http://caterpillar.onlyfun.net/GossipCN/JUnit/images/firstCactusWithTomcat-1.jpg)
您也可以在web.xml中指定cactus-report.xsl的位置,例如:
- web.xml
... <servlet> <servlet-name>ServletTestRunner</servlet-name> <servlet-class> org.apache.cactus.server.runner.ServletTestRunner </servlet-class> <init-param> <param-name>xsl-stylesheet</param-name> <param-value>styles/cactus-report.xsl</param-value> </init-param> </servlet> ...
之后在运行测试时可以于网址列中如下指定:
http://localhost:8080/cactusDemo/ServletTestRunner?
suite=onlyfun.caterpillar.test.LoginServletTest&transform=yes
suite=onlyfun.caterpillar.test.LoginServletTest&transform=yes
指定transfer=yes时可以对XML进行转换,如果不指定的话,直接输出XML。