Before  Home  Next 


 単体テストを行う2



1) はじめに

単体テストを行う1では、単体テストクラスの テンプレートの作成手順と実行手順を解説してきました。
ここでは、テストクラスにテストケースを追加する手順を説明したいと思います。


2) 単体テスト

まずはメッセージ登録アクションのテストクラスである MessageRegistActionTestクラスから修正してみましょう。

生成されたMessageRegistActionTestテストクラスには、 あらかじめ以下のメソッドが作成されており、 それぞれ以下の役割があります。

  • MessageRegistActionTest()
  • initTablesメソッドを実行し、テーブルの 初期化とテストデータの登録を行います

  • testDoExecute()
  • MessageRegistActionのdoExecuteメソッドをテストします

  • testCheckUserRole()
  • MessageRegistActionのユーザ認証をテストします

  • testValidateSuccess()
  • MessageRegistActionの入力チェックをテストします

  • testValidateFail()
  • MessageRegistActionの入力チェックに失敗したケースをテストします


    また、上記以外に必要なテストケースは自由に追加できます。

    では実際に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メソッドを テストするメソッドになります。
    このメソッドにはそれぞれ以下の引数を指定します。

    assertDoExecute()
    アクションクラスのdoExecute()をテストします

  • 第1引数 アクションをセットします
  • 第2引数 フォームオブジェクトをセットします
  • 第3引数 アクション実行後のフォワード名を指定します

  • doExecute()の実行結果と第3引数で指定したフォワード名が一致した場合は、テスト成功です。
    フォワード名が一致しなかったり、例外が発生した場合はテストに失敗します。

    WeberDbTestCaseクラスは、JUnitのテストメソッドに加え、assertDoExecute()メソッド といった、Weber独自のテストメソッドが提供されており、アクションクラスのテストを 簡単に(しかもサーブレットコンテナの起動をすることなく)行うことができるように なっています。

    また、assertDoExecute以外にも以下のようなテストメソッドが利用可能です。

    assertCheckUserRole()
    ユーザ認証をテストします

  • 第1引数 アクションをセットします
  • 第2引数 ユーザをセットします
  • 第3引数 認証結果を指定します。成功パターンをテストする場合はtrueをセットします

  • assertValidate()
    アクションクラスのdoValidateメソッド(入力チェック)をテストします

  • 第1引数 アクションをセットします
  • 第2引数 doValidateメソッドの戻り値を指定します。

  • ではためしに、テストを実行してみましょう。
    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>
    


    ではテストを実行してみましょう。



    全て通りましたでしょうか?



    Before  Home Next