1) はじめに
単体テストを行う1では、単体テストクラスの
テンプレートの作成手順と実行手順を解説してきました。
ここでは、テストクラスにテストケースを追加する手順を説明したいと思います。
2) 単体テスト
まずはメッセージ登録アクションのテストクラスである
MessageRegistActionTestクラスから修正してみましょう。
生成されたMessageRegistActionTestテストクラスには、 あらかじめ以下のメソッドが作成されており、 それぞれ以下の役割があります。
また、上記以外に必要なテストケースは自由に追加できます。
では実際にtestDoExecuteメソッドを修正してみましょう。
public class MessageDisplayRegistActionTest extends WeberDbTestCase {
・・・(中略)
/**
* doExecuteメソッドの単体テストを実行します
*/
public void testDoExecute(){
MessageRegistAction action = new MessageRegistAction();
Message bean = new Message();
//beanにデータをセットする処理を記述してください
bean.setCategoryId(1);
bean.setUserName("てすとゆーざ1");
bean.setSubject("てすとです");
bean.setContents("てすとでーたを挿入しました");
try{
assertDoExecute(action, bean, "search");
}catch(Exception e){
fail(e.getMessage());
}
//業務ロジックをテストします
try{
assertDoExecute(action, bean, "search");
}catch(Exception e){
fail(e.getMessage());
}
}
・・・(以下省略)
}
assertDoExecute()がMessageDisplayRegistActionクラスのdoExecuteメソッドを
テストするメソッドになります。
このメソッドにはそれぞれ以下の引数を指定します。
doExecute()の実行結果と第3引数で指定したフォワード名が一致した場合は、テスト成功です。
フォワード名が一致しなかったり、例外が発生した場合はテストに失敗します。
WeberDbTestCaseクラスは、JUnitのテストメソッドに加え、assertDoExecute()メソッド といった、Weber独自のテストメソッドが提供されており、アクションクラスのテストを 簡単に(しかもサーブレットコンテナの起動をすることなく)行うことができるように なっています。
また、assertDoExecute以外にも以下のようなテストメソッドが利用可能です。
ではためしに、テストを実行してみましょう。
MessageRegistActionTestテストクラスを単体で実行する場合は"Shiftキー"+"F6"で実行できます。
テストに失敗してしまいましたね。
これは、テスト用のデータ(親テーブルであるカテゴリデータ)がデータベースに登録されていないため、
メッセージの追加に失敗してしまっているのです。
この場合は、テスト用のデータを準備する必要があります。
テストデータは、モジュールパッケージ単位に"test-db-data.xml"ファイルが用意されており、
これを使ってテストデータを定義します。
今回の例では、test.sample.message.test-db-data.xmlを使います。
テストデータファイルの中身はこんな感じなっています。
<dbdata-config>
<!-- 単体テスト開始時にAUTO_NUMBERを初期化することを推奨します -->
<table name="AUTO_NUMBER"/>
<!-- tableタグの中に単体テスト用のデータを定義します -->
<!-- -->
<!-- 単体テストデータの書式は以下の通りです -->
<!-- -->
<!-- 【書式】 -->
<!-- <record フィールド名1="データ1" フィールド名2="データ2"・・・ /> -->
<!-- -->
<!-- ※データ型が文字列型、日付型の場合は"'データ'"のように -->
<!-- ""の中を更にシングルクォーテーションで囲ってください -->
<!-- -->
<!-- ※外部参照キーを持つテーブルが存在する場合は、親テーブル -->
<!-- を先に定義してください -->
<!-- -->
<table name="CATEGORY"></table>
<table name="MESSAGE"></table>
<table name="AUTO_NUMBER"></table>
<table name="ROLE"></table>
<table name="USER"></table>
</dbdata-config>
table要素が1つのテーブルに該当し、その中にテストデータを記述します。
又、テストデータはrecord要素をテストデータ1件につき1レコード作成します。
record要素の中は、各フィールドに対応したデータ項目を記述していきます。
たとえば、以下のような感じになります
<table name="CATEGORY">
<record id="1" name="'てすと1'"/>
<record id="2" name="'てすと1'"/>
</table>
<table name="MESSAGE">
<record category_id="1" id="1" user_name="'hoge'" subject="'test'" contents="'テストメッセージです'" />
<record category_id="1" id="2" user_name="'hoge2'" subject="'こんにちわ'" contents="'はじめまして'" />
<record category_id="1" id="3" user_name="'hoge3'" subject="'こんばんわ'" contents="'まいどです'" />
<record category_id="1" id="4" user_name="'hoge3'" subject="'おやすみなさい'" contents="'まいどです'" />
</table>
テストデータを作成して、もう一度実行してみましょう。
今度はちゃんと通りましたでしょうか?
今度は、ユーザ認証のテストケースを作成してみましょう。
テストケースはこんな感じにしてみました。
/**
* ユーザ認証のテスト実行します(成功パターン)
*/
public void testCheckUserRole(){
MessageRegistAction action = new MessageRegistAction();
User user = new User();
user.setName("admin1");
user.setPwd("admin1");
//adminユーザがログインしている場合のユーザ認証テスト
assertCheckUserRole(action, user, true);
}
/**
* ユーザ認証のテスト実行します(失敗パターン)
*/
public void testCheckUserRoleFail(){
MessageRegistAction action = new MessageRegistAction();
//未ログインは失敗するのでfalseを指定する
assertCheckUserRole(action, null, false);
}
又、テストデータに以下のユーザ情報を登録しておきます。
<table name="ROLE">
<record id="1" name="'admin'"/>
<record id="2" name="'guest'"/>
<record id="3" name="'test'"/>
</table>
<table name="USER">
<record id="1" role_id="1" name="'admin1'" password="'admin1'"/>
<record id="2" role_id="2" name="'guest1'" password="'guest1'"/>
<record id="3" role_id="3" name="'test1'" password="'test1'"/>
</table>
ではテストを実行してみましょう。
全て通りましたでしょうか?