新規作成編集差分アップロード | 一覧/検索 | トップページ

Cactusチュートリアル - トム猫とサボテンのダンス

トム猫とサボテンのダンス

はじめに


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 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がリロードされるまで反映されません。