開発関連の覚書

1. Cactusとは

 Cactus は サーバー側の java コードをテストするための簡潔なテスト用フレームワークである。(サーブレット、EJB、 JSP のタグライブラリ、フィルター、...)
Cactus の目的とするところはサーバー側で実行されるコードに対してテストを書く為の手間や掛かる時間を低くする事で、Junitをベースに拡張したものである。
Antとの利用を推奨されているが、Antを利用しなくてもCactusを利用することができる。
2. 環境設定

 以下の取得URLよりファイルをダウンロードし、開発プロジェクト(WEB-INF)のLibにすべてのjarファイルをコピーする。
取得URL:http://jakarta.apache.org/builds/jakarta-cactus/release/
3. 基本的なCactus

3.1. 正常なBeansをテストするサンプル

 以下に正常動作するJavaBeansをCactusでテストする手順を説明する。
3.1.1. BookItemクラス(一部省略)
タイトル、ISBNを保持する単純なJavaBeans。
package sample;
import java.beans.*;
public class BookItem extends Object implements java.io.Serializable {
    private String title = null;
    private String isbn = null;
    public BookItem(String title, String isbn) {
        setTitle(title);
        setIsbn(isbn);
    }
    public String getTitle() {
        return this.title;
    }
    public void setTitle(java.lang.String title) {
        this.title=title;
    }
    public void setIsbn(java.lang.String isbn) {
        this.isbn=isbn;
    }
    public String getIsbn() {
        return this.isbn;
    }
}

3.1.2. TestBookItemクラス(一部省略)
package sample;
import junit.framework.*;
import org.apache.cactus.*;
public class TestBookItem extends TestCase
{
    BookItem item;							・・・・・・・・(1)
	public void setUp() {					・・・・・・・・(2)
		item = new BookItem("TITLE", "ISBN");
    }
	public void testGetter() {					・・・・・・・・(3)

		assertEquals("TITLE", item.getTitle());		・・・・・・・・(4)
		assertEquals("ISBN", item.getIsbn());
    }
    public TestBookItem(String theName) { super(theName);}
    public static void main(String[] theArgs) {
        junit.swingui.TestRunner.main(new String[]{
            TestBookItem.class.getName()});
    }
    public static Test suite() {
    TestSuite suite = new TestSuite(TestBookItem.class);
        return suite;
    }
}

(1)	テストするJavaBeans用
(2)	初期化メソッド。終了メソッドはsetDownに定義する。
(3)	getter用のテスト。自動テストするメソッドの先頭に「test」を付けることで自動テストの対象メソッドとなる。
(4)	想定した結果と等しいかの判定をする(コンストラクタでは、"TITLE"を設定しているので"TITLE"で比較している)

3.1.3. Cactus実行結果

3.2. 異常なBeansをテストするサンプル
 以下に異常動作するBeansをCactusでテストする手順を説明する。
3.2.1. BookItemクラス(一部省略)
 タイトル、ISBNを保持する単純なJavaBeansであるが、title、isbnは常にNULL値。
package sample;
import java.beans.*;
public class BookItem extends Object implements java.io.Serializable {
    private String title = null;
    private String isbn = null;
    public BookItem(String title, String isbn) {
        setTitle(title);
        setIsbn(isbn);
    }
    public String getTitle() {
        return this.title;
    }
    public void setTitle(java.lang.String title) {
        this.title=null;
    }
    public void setIsbn(java.lang.String isbn) {
        this.isbn=null;
    }
    public String getIsbn() {
        return this.isbn;
    }
}

3.2.2. TestBookItemクラス(一部省略)

 3.1.2節と同様
3.2.3. Cactus実行結果

4. まとめ

4.1. 長所

・ テストパターンが決まっているクラスを、すべて自動テストできるためテストに費やす時間が大幅に短縮できる。
・ ServletTestCaseクラスを利用したサーブレットのテストでは、テストケースプログラムで直接サーブレットを生成し、必要となるすべてのデータを事前に設定できるので、結合テストレベルのテストもほぼ自動化できる。
・ 自動的にプログラムをテストするために、テスト確認者のために用意する動作確認手順を記述する必要がなくなる。
4.2. 短所

・ テストケースに変更があった場合に、テストプログラムコードの修正が発生する。
・ JavaBeans、サーブレット等のプログラムの大部分を、自動生成できるプログラムが多くなってきているので、Cactusを利用する意味があまりないように感じた。
4.3. 開発時の課題

・ テストケースとテスト仕様書の整合性を保つために、テスト仕様書をjavadoc形式にできないか?
・ 画面入力等のエラーチェックは、サーバー側で判定するのであればCactusでのテストは可能だが、JavaScript等のスクリプトでチェックする場合には、Cactusでテストすることはできない。
4.4. 参考URL

・ http://www.ingrid.org/jajakarta/cactus/