同期応答メッセージ送信処理を伴う取引単体テストの実施方法

同期応答メッセージ送信処理を伴うウェブアプリケーションで、取引単体テストを行う場合は、Nablarchが提供するモックアップクラスを使用する。

以下に、ウェブアプリケーションで同期応答メッセージ送信処理を行う場合の通常の処理フローと、モックアップクラスを使用して取引単体テストを行う場合の処理フローを示す。

  • 同期応答メッセージ送信処理を伴うウェブアプリケーションの通常の処理フロー
../../../../../../_images/send_sync_online_base.png
  • モックアップクラスを使用して、同期応答メッセージ送信処理を伴うウェブアプリケーションの取引単体テストを行う場合の処理フロー
../../../../../../_images/send_sync_online_mock.png

モックアップクラスは以下の機能を提供する。

  • 任意の応答電文[1]を返却する機能

    画面から同期応答メッセージ送信処理が行われる場合に、送信キューおよび受信キューに接続することなく、取引単体テストを実施するために必要な応答電文を返却できる。

  • 要求電文[1]をログに出力する機能

    画面から同期送信された要求電文をログに出力できる。 出力されたログを確認することで正常にメッセージ送信が行われたかどうかを確認できる。 また、出力されたログをエビデンスとして使用できる。

  • 障害系のテストを行う機能

    同期応答メッセージ送信処理を行う場合に発生するタイムアウトエラーや、メッセージ送受信エラーを発生させることができる。 この機能を使用することで、障害系のテストを行うことが可能となる。

モックアップクラスを使用すればキューを用意する必要がなくなるので、特別なミドルウェアのインストールや環境設定などの準備を行うことなく、取引単体テストを行うことができる。

[1](1, 2) キューへ送信するメッセージのことを「要求電文」、キューから受信するメッセージのことを「応答電文」と称す。

モックアップクラスを使用した取引単体テストの実施方法

モックアップクラスを使用する場合、応答電文のフォーマットおよびデータをExcelファイルに定義する。 また、要求電文についてはフォーマットのみ定義する。

ExcelファイルはリクエストID[2]ごとに用意する。また、ファイルの名前はリクエストIDと一致させる。 たとえば、リクエストIDが「RM21AA0101」ならば、ファイルの名前は「RM21AA0101.xlsx」となる。 ファイルの配置ディレクトリは、設定ファイルに定義する。詳細はExcelファイルの配置場所の設定を参照。

[2]ここで扱うリクエストIDとは、メッセージを送信する相手先システムの機能を一意に識別するために定義するIDのことを指すものであり、 ウェブアプリケーションやバッチ処理で使用するリクエストIDとは意味が異なる点に注意すること。 このリクエストIDにもとづき、要求電文および応答電文のフォーマット、送信キュー名、受信キュー名が決定する。

Excelファイルの書き方

取引単体テストを行う場合は、定められた記述ルールに従いExcelファイルを記載する。

以下にExcelファイルを記述する場合に従うべきルールを示す。

  • シート名は「message」固定。
  • 返却する応答電文のFW制御ヘッダ・本文のフォーマットを定義する。
  • 返却する応答電文のFW制御ヘッダ・本文のデータを定義する。
  • 要求電文のFW制御ヘッダ・本文のフォーマットを定義する。

Excelファイルに定義した応答電文のフォーマットおよびデータは、モックアップクラスが返却する応答電文を生成するために使用される。 また要求電文のフォーマットは、モックアップクラスが要求電文のログを出力するために使用される。

書き方の例

以下に、Excelファイルの記載例を示す。

../../../../../../_images/send_sync_test_data.jpg

電文のフォーマットおよびデータの記載方法

電文のフォーマットおよびデータは以下の書式で記載する。

識別子  
ディレクティブ行 ディレクティブの設定値  
... [3] ...    
no フィールド名称(1) フィールド名称(2) ... [4]
データ型(1) データ型(2) ...
フィールド長(1) フィールド長(2) ...
データ(1-1) データ(2-1) ...
データ(1-2) データ(2-2) ...
... [5] ... ...
[3]これより下側は、同様にディレクティブの数だけ続いていく。
[4]これより右側は、同様にフィールドの数だけ続いていく。
[5]これより下側は、同様にデータの数だけ続いていく。

名称 説明
識別子

電文の種類を示すIDを指定する。本項目が、テストケース一覧のexpectedMessageおよびresponseMessageに記載されたグループIDと紐付けられる。

識別子の書式を以下に示す。

  • 要求電文のヘッダ … EXPECTED_REQUEST_HEADER_MESSAGES=リクエストID
  • 要求電文の本文 … EXPECTED_REQUEST_BODY_MESSAGES=リクエストID
  • 応答電文のヘッダ … RESPONSE_HEADER_MESSAGES=リクエストID
  • 応答電文の本文 … RESPONSE_BODY_MESSAGES=リクエストID
ディレクティブ行 [6] ディレクティブを記載する。ディレクティブ名のセルの右のセルに設定値を記載する(複数行指定可)。
no ディレクティブ行の下の行には必ず「no」を記載する。
フィールド名称 フィールド名称を記載する。フィールドの数だけ記載する。
データ型

そのフィールドのデータ型を記載する。フィールドの数だけ記載する。

データ型は「半角英字」のように日本語名称で記述する。

フォーマット定義ファイル上のデータ型と日本語名称のデータ型のマッピングは、 BasicDataTypeMapping のメンバ変数DEFAULT_TABLEを参照。

フィールド長

そのフィールドのフィールド長を記載する。「-」を記載した場合は、「データ」の欄の記載内容を元にサイズを自動計算する。

フィールドの数だけ記載する。

データ データは、応答電文の場合のみ記載する。そのフィールドに格納されるデータを記載する。複数件応答電文を返却する場合は次の行に続けてデータを記載する。
[6]

ディレクティブを記述する際、フォーマット定義ファイルの以下に対応する内容は記述不要である。

項目 理由
file-type テスティングフレームワークが固定長のみしか対応していないため。
record-length フィールド長に記載したサイズでパディングするため。

補足

フィールド名称、データ型、フィールド長の記述は、外部インタフェース設計書からコピー&ペーストすることで効率良く作成できる。(ペーストする際、「行列を入れ替える」オプションにチェックすること)

Excelファイルの再読み込み

モックアップクラスは、Excelファイルを手動で編集してテストをやり直すケースや、同じデータで繰り返しテストを行うケースを想定し、 Excelファイルのタイムスタンプが更新された場合に、ファイルを再読み込みする機能を提供している。

通常、以下の応答電文を返却するたびにnoのインクリメントが行われ、アプリケーションサーバが起動している間は、noの値が初期化されることはない。

以下のような応答電文データを定義した場合、1回目のメッセージ同期送信ではno.1の応答電文が返却され、 noのインクリメントが行われる。そして2回目のメッセージ同期送信ではno.2の応答電文が返却される。

../../../../../../_images/send_sync_test_data_no.png

しかし、Excelファイルの編集や上書きにより、タイムスタンプを更新することで、アプリケーションサーバ起動中にExcelファイルの再読み込みを行うことができる。

以下に、Excelファイルを編集し、テストをやり直す場合の例を示す。

../../../../../../_images/send_sync_response_count_change.png

障害系のテスト

応答電文の本文の表の最初のフィールドに「errorMode:」から始まる特定の値を設定することで、障害系のテストを行うことができる。

以下に、設定値と、障害系のテストの対応を示す。

最初のフィールドに設定する値 障害内容 自動テストフレームワークの動作
errorMode:timeout メッセージ送信中にタイムアウトエラーが発生する場合のテスト sendSyncメソッドの戻り値としてnullを返却する。
errorMode:msgException メッセージ送受信エラーが発生する場合のテスト MessagingExceptionをスローする。

記載例を以下に示す。

../../../../../../_images/send_sync_test_data_error.png

要求電文のログ出力

要求電文のログはMap形式とCSV形式で出力される。

Map形式のログはデバッグ用に、CSV形式のログはエビデンスとして取得する場合に使用することを想定している。

サンプルでは、Map形式のログは標準出力とアプリケーションログファイルに、CSV形式のログは専用のログファイルに出力する仕様となっているが、ログの設定を修正することで出力先の切り替えが可能である。

ログの出力例を以下に示す。

  • Map形式の場合
2011-10-26 13:16:10.958 MESSAGING_SEND_MAP request id=[RM11AD0101]. following message has been sent:
  message fw header = {requestId=RM11AD0101, testCount=, resendFlag=0, reserved=}
  message body      = {authors=test3, title=test1, publisher=test2}
  • CSV形式の場合
2011-10-26 13:16:10.958 MESSAGING_SEND_CSV request id=[RM11AD0102]. following message has been sent:
header:
"requestId","testCount","resendFlag","reserved"
"RM11AD0102","","0",""
body:
"authors","title","publisher"
"test3","test1","test2"

ログの出力設定は、log.propertiesにて行う。設定例を以下に示す。

# CSV形式のメッセージログのライタ(./messaging-evidence.logに出力する)
writer.MESSAGING_CSV.className=nablarch.core.log.basic.FileLogWriter
writer.MESSAGING_CSV.filePath=./messaging-evidence.log
writer.MESSAGING_CSV.formatter.className=nablarch.core.log.basic.BasicLogFormatter
writer.MESSAGING_CSV.formatter.format=$message$

# CSV形式のメッセージログのロガー
loggers.MESSAGING_CSV.nameRegex=MESSAGING_CSV
loggers.MESSAGING_CSV.level=DEBUG
loggers.MESSAGING_CSV.writerNames=MESSAGING_CSV

# Map形式のメッセージログのロガー
loggers.MESSAGING_MAP.nameRegex=MESSAGING_MAP
loggers.MESSAGING_MAP.level=DEBUG
loggers.MESSAGING_MAP.writerNames=stdout,appFile

フレームワークで使用するクラスの設定

これらの設定は取引単体テストでのみ必要な設定である。そのため、テスト用のプロファイルにこれらを設定する。 環境ごとにコンポーネントを切り替える方法については 環境ごとにコンポーネントを切り替える方法(モックに切り替える方法) 参照。

通常、これらの設定はアーキテクトが行うものでありアプリケーションプログラマが設定する必要はない。

モックアップクラスの設定

コンポーネント設定ファイルに、取引単体テストで使用するモックアップクラスを設定する。

<!-- モックのメッセージングプロバイダ -->
<component name="messagingProvider"
           class="nablarch.test.core.messaging.MockMessagingProvider">
</component>

Excelファイルの配置場所の設定

コンポーネント設定ファイルで、Excelファイルの配置場所のパスを設定する。

<component name="filePathSetting"
         class="nablarch.core.util.FilePathSetting" autowireType="None">
   <property name="basePathSettings">
     <map>
       <!-- Excelファイルの配置場所のパスを指定する -->
       <entry key="sendSyncTestData" value="file:///C:/nablarch/workspace/Nablarch_sample/test/message" />
       <entry key="format" value="classpath:web/format" />
     </map>
   </property>
   <property name="fileExtensions">
     <map>
       <!-- Excelファイルの拡張子(xlsx)を定義する-->
       <entry key="sendSyncTestData" value="xlsx" />
       <entry key="format" value="fmt" />
     </map>
   </property>
</component>

以下に、Excelファイルの配置イメージを示す。

../../../../../../_images/send_sync_test_data_structure.png

補足

配置ディレクトリのパスは、クラスパス(classpath:)ではなく、ファイルシステムのパス(file:)で指定することを推奨する。 ファイルシステムのパスを指定することで、サーバ起動中に直接Excelファイルの内容を編集し、テストすることが可能となる。

テストデータ解析クラスの設定

コンポーネント設定ファイルに、取引単体テストで使用するテストデータ解析クラスを設定する。

 <!-- TestDataParser -->
<component name="messagingTestDataParser" class="nablarch.test.core.reader.BasicTestDataParser">
  <property name="testDataReader">
    <component name="xlsReaderForPoi" class="nablarch.test.core.reader.PoiXlsReader"/>
  </property>
  <property name="interpreters" ref="messagingTestInterpreters" />
</component>
 <!-- テストデータ記法の解釈を行うクラス群  -->
<list name="messagingTestInterpreters">
  <component class="nablarch.test.core.util.interpreter.NullInterpreter"/>
  <component class="nablarch.test.core.util.interpreter.QuotationTrimmer"/>
  <component class="nablarch.test.core.util.interpreter.CompositeInterpreter">
    <property name="interpreters">
      <list>
        <component class="nablarch.test.core.util.interpreter.BasicJapaneseCharacterInterpreter"/>
      </list>
    </property>
  </component>
</list>

必要な単体テストライブラリをpom.xmlへの追加

以下のdependencyをpom.xmlへ追加する

<dependency>
  <groupId>com.nablarch.framework</groupId>
  <artifactId>nablarch-testing</artifactId>
  <exclusions>
    <exclusion>
      <groupId>org.mortbay.jetty</groupId>
      <artifactId>*</artifactId>
    </exclusion>
    <exclusion>
      <groupId>com.google.code.findbugs</groupId>
      <artifactId>*</artifactId>
    </exclusion>
  </exclusions>
</dependency>