トム猫とサボテンのダンス
はじめに
http://jakarta.apache.org/cactus/integration/howto_tomcat.html の和訳です。
Cactusとは、サーバーサイドJavaの単体テストを行うためにテスティングフレームワークです。
#誤訳などありましたら指摘してください。
Tomcat Quickstart について
このチュートリアルはCactus 1.4以上、Tomcat 4.0以上向けです。
この文書では、Tomcat上でCactusを設定して、Cactus testを走らせるまでを10分以内でできるように、1つ1つ説明します。(もちろん、ダウンロード時間は数えないでね :-))
Cactusをアプリケーション内で使うには2つのやり方があります。
あと、Cactusテストを実行するやり方もいくつかあります(TestRunner Howto tutorial http://jakarta.apache.org/cactus/integration/index.html を参照)。ここでは、セットアップがラクチンな、ブラウザを使うやり方でいきます。
Step 1からStep 3は、インストールなので、1回だけやればTomcatでCactusテストができるようになります。
Step 1:Tomcatのインストール
Tomcat 4.0以上をダウンロードして、適当なディレクトリに解凍。このディレクトリを、[tomcat-root]と呼びます。
訳注:2003年10月31日現在の最新バージョンは、Tomcat 4.1.27。
http://sunsite.tus.ac.jp/pub/apache/jakarta/tomcat-4/tomcat-4.1.27.tar.gz
インストールの仕方は、ApacheとTomcatの連携の中で解説してます。
Step 2:Cactus jarsをコピー
Cactus jarsを http://jakarta.apache.org/cactus/downloads.html からダウンロードする。ファイルたちはzip内のlib/に置いてあります。
訳注:zipファイルへの直リンク
J2EE API 1.2:http://ring.asahi-net.or.jp/archives/net/apache/dist/jakarta/cactus/binaries/jakarta-cactus-12-1.5-rc1.zip
J2EE API 1.3:http://ring.asahi-net.or.jp/archives/net/apache/dist/jakarta/cactus/binaries/jakarta-cactus-13-1.5-rc1.zip
次のファイルを [tomcat-root]/common/lib にコピーする。
- cactus.jar
- commons-httpclient.jar
- commons-logging.jar
- junit.jar
- aspectjrt.jar
これは最小セットです。もし後で Cactus HttpUnit integration を使いたければ、httpunit.jarもコピーしておいてください。
訳注:実際にはこんな感じです。(J2EE API 1.3の場合)
[tmp]# wget http://ring.asahi-net.or.jp/archives/net/apache/dist/jakarta/cactus/binaries/jakarta-cactus-13-1.5-rc1.zip
[tmp]# jar xvf jakarta-cactus-13-1.5-rc1.zip
[tmp]# cd jakarta-cactus-13-1.5-rc1/lib/
[lib]# cp cactus-1.5-rc1.jar [tomcat-root]/common/lib/cactus.jar
[lib]# cp commons-httpclient-2.0-rc2.jar [tomcat-root]/common/lib/commons-httpclient.jar
[lib]# cp commons-logging-1.0.3.jar [tomcat-root]/common/lib/commons-logging.jar
[lib]# cp junit3.8.1.jar [tomcat-root]/common/lib/junit.jar
[lib]# cp aspectjrt-1.1.1.jar [tomcat-root]/common/lib/aspectjrt.jar
[lib]# cp httpunit-1.5.3.jar [tomcat-root]/common/lib/httpunit.jar
Step 3:Tomcat web.xmlを編集
[tomcat-root]/conf/web.xml を編集して、ファイルの始め、<web-app>タグの後に次を追加する。
<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>
訳注:wikiの都合上、全角スペースを使ってますので、このままコピペでは使えないっす。半角に変換してね。
以下インデントは全角スペースです。
で、最後の<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>
Step 4:テスト用のサンプルアプリケーションを作る
さあ、とっても簡単なアプリケーションを作って、テストしてみよう。
まず、次のようなディレクトリ構造を作ろう。
[tomcat-root]/webapps
|- test
|- WEB-INF
|- classes
んで、次のような SampleServlet.java ファイルを作ってコンパイル、できた.classファイルを [tomcat-root]/webapps/test/WEB-INF/classes にコピーする。コンパイル済みclassファイルは、http://jakarta.apache.org/cactus/misc/SampleServlet.class からダウンロードすることもできます。
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);
}
}
見てのとおり、完全なサーブレットではありません。しかし、Cactusを使えば、全部書き終えてなくてもテストを始めることができます。Extreme Programmerはそれがお好きでしょ? :-)
では、Cactusテストケース第1号を作ろう。次のような TestSampleServlet.java ファイルを作ってコンパイル、できた.classファイルを [tomcat-root]/webapps/test/WEB-INF/classes にコピーする。コンパイル済みclassファイルは、http://jakarta.apache.org/cactus/misc/TestSampleServlet.class からダウンロードすることもできます。
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"));
}
}
Step 5:テストを実行する
さぁ、いくぞ!Tomcatを起動しよう![tomcat-root]/bin/startup.bat (for windows) or [tomcat-root]/bin/startup.sh (for unix)
ブラウザで、http://localhost:8080/test/ServletTestRunner?suite=TestSampleServlet を開いて。

のように見えるはず。(訳注:Internet Explorerの場合。)
Step 6:もっと面白く!
いいねぇ。でも、XMLじゃなくてHTMLで見たいんだけど?解決法はある。次のXSLT stylesheet( http://jakarta.apache.org/cactus/misc/cactus-report.xsl <junitreport>Ant task で使われるやつを元にしてる )を持ってきて、[tomcat-root]/webapps/test に突っ込もう。そしてブラウザで、http://localhost:8080/test/ServletTestRunner?suite=TestSampleServlet&xsl=cactus-report.xsl を開く。すると、次のようになる。

これは、client-slide XSLT transformationsをサポートしてるブラウザで動きます。(例えば、Internet ExplorerやMozillaは対応してます。訳注:Opera 7.20日本語版ではダメでした。)
おまけ:サーバーサイドで XSLT Transformations
(訳注;別のページ http://jakarta.apache.org/cactus/integration/integration_browser.html より)
前の章では、XSLT Transformationsは、クライアントが行いました。つまり、ブラウザがXSLT transformationsに対応している必要があり、さらにスタイルシートの場所をリクエストパラメータとして付け加えないといけませんでした。
Cactus 1.5からは、ServletTestRunnerがサーバーサイドで変換できます。これを有効にするには、JAXP compliant XSLT processor(例えば Xalan)をweb-applicationで使えるようにすればいいです。
加えて、XSLT stylesheetの場所をServetTestRunnerの初期化パラメータとして与える必要があります。
例えば、
[...]
<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>
[...]
このパスは、web-applicationのルートからの相対パスです。もちろん、スタイルシートはその場にないといけません。クライアントサイドの変換とは対照的に、スタイルシートをWEB-INF内のどこかに置くこともできます。クライアントが直接アクセスすることがないから。
上のことがすべて正しくセットアップできれば、リクエストにtransformパラメータを入れることで変換させることができます。(パラメータの値は何でもいいです。)
例えば、
http://server:port/mywebapp/ServletTestRunner?suite=mytestcase&transform=yes
スタイルシートは、ServletTestRunnerが初期化される時に、初期化パラメータとして与えられます。スタイルシートの変更は、web-applicationがリロードされるまで反映されません。