【備忘録】S2Junitを使ってみる。 | 23の奇妙な冒険

23の奇妙な冒険

体重減らしたい・・・ハァ・・(ノω=;)

S2Junitを勉強がてら使ってみた。

今回はSAStrutsのサービスクラスに対してのテストを作成しました。

■テストまでの方法
1.テストケースを作成するサービスクラスを右クリックし、[S2Junit4]-[テスティングペアを開く]をクリック。
2.新規の場合だと、「テスティングペアがありません。作成しますか?」とダイアログが出るので、[はい]を選択。
3.新規Junitテストケースのダイアログが出るので、[次へ]を選択
4.テストを行うメソッドを選択する画面が表示されるので、テストを行うメソッドだけチェックを入れて、[完了]を選択。
5.src/test/javaのserviceパッケージにサービス名Test.javaが作成されます。
6.TestContextをインスタンス変数で宣言する。
7.個々のテストに対する初期化メソッド(beforeテスト名)を追加し、DBに今あるデータを一時的にテストデータに置き換えるために設定を追加。
8.テストメソッドで、サービスを呼び出し、その結果とテストコンテキストから取得した期待値を検証する。

6~8に関して、細かい部分は以下のソースを参照。
これで、一つのテストが完了できた。

◆ソース
package jp.co.zz.service;

import static org.seasar.framework.unit.S2Assert.assertEquals;

import java.util.List;

import jp.co.zz.entity.Hoge;

import org.junit.runner.RunWith;
import org.seasar.extension.dataset.DataSet;
import org.seasar.framework.unit.PreparationType;
import org.seasar.framework.unit.Seasar2;
import org.seasar.framework.unit.TestContext;

@RunWith(Seasar2.class)
public class HogeServiceTest {

private HogeService hogeService;
private TestContext ctx;

public void beforeTestFindAll() {
ctx.setPreparationType(PreparationType.ALL_REPLACE);
}

public void testFindAll() {

List<Hoge> hogeList = hogeService.findAll();
DataSet dataSet = ctx.getExpected();
assertEquals(dataSet, hogeList);

}
}


■使ってみて便利なところ
・テストデータをExcelで作って、ファイル名をテストクラス名_テストメソッド名.xlsにすれば勝手に追加して、テストが終わったら削除してくれる。
・期待値もファイル名をテストクラス名_テストメソッド名_Expected.xlsにすれば、TestContextから簡単に使える。
・テストデータと期待値を簡単にチェックできる。

■テストデータについて
テストデータと期待値のファイルは上記のソースを例にすると
テストデータ:HogeServiceTest_testFindAll.xls
期待値データ:HogeServiceTest_testFindAll_Expected.xls
を作成し、テストクラスと同じパッケージ(上記だとjp.co.zz.service)に配置する。

また、テストデータや期待値は1行目にカラム目、2行目以降にデータを書けばよい。

■やっててはまったところ

やっていてはまったところは、データの中にチェックしたくない項目(自動で挿入されるIDやら日付やらのカラム)をチェックから外すにはどうすればいいか悩みました。

S2TestCaseでチェックしているソースを見ればわかったのですが
期待値のファイルにチェックしたくない項目(カラム)自体を書かなければ、
チェックされません。

S2TestCaseの以下の箇所を参照。

            for (int j = 0; j < expected.getColumnSize(); ++j) {
try {
String columnName = expected.getColumnName(j);
Object expectedValue = expectedRow.getValue(columnName);
ColumnType ct = ColumnTypes.getColumnType(expectedValue);
Object actualValue = actualRow.getValue(columnName);
if (!ct.equals(expectedValue, actualValue)) {
assertEquals(message + ":Row=" + i + ":columnName="
+ columnName, expectedValue, actualValue);
}
} catch (AssertionFailedError e) {
errorMessages.add(e.getMessage());
}
}