From Gossip@caterpillar

JUnit Gossip: 第一個 Cactus + Tomcat 測試

來看看如何使用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


執行的結果會以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>

您也可以直接取得Cactus網站上提供的 cactus-report.xsl,並將之放在Web應用程式的目錄下,然後使用以下的方式來取得較易閱讀的訊息:
http://localhost:8080/cactusDemo/ServletTestRunner?
    suite=onlyfun.caterpillar.test.LoginServletTest&xsl=cactus-report.xsl


一個執行的結果網頁畫面如下:
Cactus執行畫面

您也可以在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


指定transfer=yes時可以對XML進行轉換,如果不指定的話,直接輸出XML。