Cactus

Cactusって?

Cactusはサーバーサイドのテストフレームワークです。 JUnitを拡張して作成されており、 サーブレットやJSPのテストが可能です。

テストって?

プログラムを作るというのは、 コードを書いて終わりじゃないです。 仕様通りの動作をするか確認する必要があります。 この実際に動くかどうか確認することをテストと呼びます。

テストは単に、典型的なパターンで、 1回動けばOKというものではなく、 様々な場合に対応したテストをする必要があります。 例えば、自転車を作ったとき、 ペダルをこいで走ればOKというものではなく、 ブレーキをかければ止まらないといけないし、 ハンドルを引けば曲がらないといけません。 曲がれない、止まれない自転車、10キロ走るとすぐパンクするような自転車 には乗りたくありませんね。

最も簡単なテストの方法は、以下のようにクラスにテスト用のmain()メソッドを 書いて実行する方法です。
/**
 * 三角形クラス
 */
public class TriangleShape{
  /**
   * 面積を取得します。
   * @return 面積
   * @param length 底辺
   * @param height 高さ
   */
  public double getLarge(double length, double height){
    return length * heigth / 2;
  }

  /**
   * テスト用メイン
   */
  public void main(String[] args){
    TriangleShape shape = new TriangleShape();
    int large = shape.getLarge(4, 2);
    System.out.println("large=" + large);
  }
}
この例のようなクラスでも、 引数に渡す数値をゼロにしたり、マイナスにしたり、 様々な引数を想定する必要があります。 この場面のことをテストケースと呼びます。 正常系だけでなく、Exceptionを発生したりする異常系の テストケースも忘れずにテストする必要があります。

これはこれで、簡単でいいんですが、以下のような問題があります。 めんどくさいなぁ。 テストケースを用意、テストケースを実行、結果を確認するのも プログラムして、機械にやってもらおう。 というのがテストフレームワークです。

Javaでテストフレームワークと言えばJUnitが有名です。 こんな感じのテストケースを書きます。
public class TriangleShapeTest extends TestCase{

    public TriangleShapeTest(String name){
        super(name);
    }

    public void testGetLarge1(){
        TriangleShape shape = new TriangleShape();
        double large = shape.getLarge(4, 2);
        assertTrue(large == 4);
    }
}
テストフレームワークを使って便利なのは、 一発で、動作の確認がとれるというところです。 コードに修正を加えても、動作の確認が取れれば安心ですね。

ただ、テストケースを書く手間が必要なため、 最初はメンドクサイかもしれません。 ただ、後から沢山メンドクサイよりは、最初に一寸メンドクサイ 方がよいでしょう。

ちなみに、テストにはいくつか種類があり、 上のような1つのクラスのテストは単体テストと呼ばれます。

サーバーサイド

サーブレットのテストを行う場合、 単なるアプリケーションのテストに加えて、ちょっと問題があります。 それは、サーブレットを実行するのはサーブレットコンテナだということです。 main()やTestCaseからServletは実行できません。

Cactusでは、コンテナの動作を肩代わりする仕組みを提供してくれます。

Cactusを使ってみる

2002/8/27の最新版はCactus1.4です。 ダウンロードは Downloads のページから行えます。 J2EE1.2と1.3用にファイルが分かれています。 また、ANTはCactus独自タグが使われているようなので、 それ用のファイルも必要みたいです。 1.4ではチュートリアルがついてます。
Tomcat Quickstart

まだ手が出ない

とりあえず、簡単な上のチュートリアルを切り貼りして動かしてみました。 でも、その先はまだ行っていません。 Hello Worldを出して満足している感じですが、どうも、 最初がメンドクサイテストケースを書くのが、おっくうです。 一度開発プロジェクトで使おうと決めて、実体験してみないと、 本当にいいのか、使えるのか未だわかりません。。。

参考

WEB+DB Press vol.10

(2002/8/27)
もどる