MUnit テスト構造の基礎

MUnit テストスイート

MUnit のベースファイルは、テストスイートファイルです。これは、XML ファイルで、Mule アプリケーションのプロジェクトの ​src/test/munit​ ディレクトリにあります。MUnit テストスイートファイルの数に上限はありません。各 MUnit テストスイートファイルは、MUnit テストのコレクションで、他の MUnit テストスイートとは独立して実行されます。

MUnit テストスイートには、次のコンポーネントのいずれかの組み合わせが含まれています。

  • Before/After Suites

  • Before/After Test

  • MUnit テスト

バックグラウンドでは、各 MUnit テストスイートと Mule 設定ファイルに違いはありません。複数の Mule 最上位要素 (フロー、サブフロー、スクリプトなど) を使用できます。

MUnit 設定

MUnit 設定要素 (​munit:config​) は、MUnit スイートファイルなどの Mule 設定ファイルを識別します。

<?xml version="1.0" encoding="UTF-8"?>
<mule xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:munit="http://www.mulesoft.org/schema/mule/munit" xmlns:munit-tools="http://www.mulesoft.org/schema/mule/munit-tools"
	xmlns="http://www.mulesoft.org/schema/mule/core"
	xsi:schemaLocation="
		http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
		http://www.mulesoft.org/schema/mule/munit http://www.mulesoft.org/schema/mule/munit/current/mule-munit.xsd
		http://www.mulesoft.org/schema/mule/munit-tools  http://www.mulesoft.org/schema/mule/munit-tools/current/mule-munit-tools.xsd">

	<munit:config name="An MUnit Suite" />

	<!-- Tests -->

</mule>

スイートの無視

スイート全体の実行を無視するには、設定の ​ignore​ 属性を使用します。

<munit:config name="A MUnit Suite" ignore="true"/>

最小 Mule バージョン

Mule バージョンが特定のバージョン以降である場合にスイートを実行するように指定するには、設定の ​minMuleVersion​ 属性を使用します。

<munit:config name="A MUnit Suite" minMuleVersion="4.1.4"/>

MUnit テスト

MUnit テストは、MUnit テストスイートの基本的なプロセッサです。これは、試行する各テストシナリオを表します。

MUnit テストは、3 つのスコープに分かれています。

スコープ 説明

Behavior

Behavior スコープは、テストロジックを実行する前にすべての前提条件を設定します。

Execution

Execution スコープには、次のスコープを実行する前にすべてのプロセスが終了するまで待機するテストロジックがあります。

Validation

Validation スコープには、Execution スクープの結果に関連するすべての検証があります。

これらのスコープは省略可能です。

<munit:test name="exampleTest" description="Test to verify scenario 1">>

     <munit:behavior>
         <!-- Processors to set preconditions for the test -->
     </munit:behavior>

     <munit:execution>
         <flow-ref name="exampleFlow"/>
     </munit:execution>

     <munit:validation>
         <!-- Processors to validate result -->
     </munit:validation>
 </munit:test>
munit-test
Figure 1. Studio での MUnit テストの表現

MUnit テストリファレンス

名前 説明

name

テストの名前を定義します。名前は、テストスイート内で一意である必要があります。
この属性は必須です。

description

テストするシナリオを説明します。

ignore

テストを無視する必要があるかどうかを定義します。存在しない場合、テストは無視されません。

tags

テストに割り当てるタグのカンマ区切りリスト。

expectedErrorType

このテストの実行後に受け取る必要があるエラー種別を定義します。

expectedException

このテストの実行後に受け取る必要がある例外を定義します。

expectedErrorDescription

このテストの実行後に受け取る必要があるエラーの説明を定義します。

timeOut

テストが失敗するまでの最大実行時間 (ミリ秒) を定義します。

MUnit テストの説明属性

MUnit では、テストの説明を作成する必要があります。テストするシナリオの内容を反映する有益な説明を作成することが理想的です。この説明は、テストを実行する前のテストコンソールやレポートに表示されます。正確に内容が反映された説明ほど、読みやすく、エラーのトラブルシューティングが容易になります。

テストの無視

テストを停止しなければならない場合があります。どのような原因 (テストの失敗や不都合な副作用) でも関係ありません。MUnit では、特定のテストを無視できるため、コードを手動でコメントアウトする必要はありません。

任意のテストを無視するには、ブール型の ignore をテスト定義に追加します。

<munit:test name="my-flow-Test"
      ignore="true"
      description="Test to verify scenario 1">
</munit:test>

ignore 属性のデフォルト値は ​false​ です。

Anypoint Studio では、​[Ignore Test (テストを無視)]​ オプションをオンにできます。

ignore-test

現在の Mule バージョンまたは現在のオペレーティングシステムに基づいてテストを無視する式を使用することもできます。

オペレーティングシステムに基づくテストの無視
<munit:test name="linux-ignore-test" ignore="#[Munit::osEqualTo('Mac OS X')]">
Mule Runtime Engine バージョンに基づくテストの無視
<munit:test name="mule-version-ignore-test" ignore="#[Munit::muleVersionPriorTo('4.1.4')]">

このテストは、Mule バージョンが ​4.1.4​ より前の場合に無視されます。他にも、​muleVersionEqualTo​ や ​muleVersionNewerThan​ などの関数があります。

タイムアウト属性のテスト

2 分経過しても完了しない場合、各 MUnit テストは自動的に失敗します。​timeOut​ 属性を使用して、テストが失敗するまでのカスタム最大実行時間 (ミリ秒) を定義します。

<munit:test
  name="custom-timeout-test"
  description="This test has a timeout of 10 seconds"
  timeOut="10000" >
  ....
</munit:test>

タグ属性のテスト

MUnit では、テストにタグを付けて、特定のタグのテストを実行できます。次に例を示します。

<munit:test
  name="exampleTest"
  description="A test that works as an example"
  ignore="true"
  tags="integration,http" >
		…
</munit:test>
test-tags
Figure 2. Anypoint Studio では、適切な項目でタグを定義できます。

MUnit テストの想定されるエラーおよび例外属性

テストしているフローまたはサブフローが失敗して、特定のエラーをスローするかどうかを検証したいとします。MUnit では、次のように属性 ​expectedErrorType​、​expectException​、​expectedErrorDescription​ を追加できます。

<munit:test name="MUnit-test-suite"
  description="A test that works as an example"
  expectedErrorType="RETRY_EXHAUSTED"
  expectedException="java.lang.RuntimeException"
  expectedErrorDescription="retries exhausted">
  ...
</munit:test>
munit test concept e7280
Figure 3. Anypoint Studio での視覚表現
  • expectedErrorType​ 属性では、テスト対象アプリケーション内で定義されているエラー ID を想定しています。
    この属性では、アプリケーション内で定義されているエラー種別がスローされるかどうかを検証できます。アプリケーションに存在しない ​errorType​ を定義すると、テストは実行されません。

    <munit:test name="MUnit-test-suite"
      description="Test Error Type"
      expectedErrorType="FTP:ILLEGAL_PATH">
      ...
    </munit:test>

    このエラー種別のテストでは、FTP 操作で ​FTP:ILLEGAL_PATH​ エラーがスローされることを想定しています。
    どのフローも FTP Connector を使用していない場合、このエラー種別がアプリケーション内で定義されていないため、テストは実行されません。

    Mule Runtime に属する ErrorTypes は、類型化する必要はありません。たとえば、​MULE:RETRY_EXHAUSTED​ は、単純に ​RETRY_EXHAUSTED​ として定義できます。

  • 属性 ​expectException​ では、リテラル例外クラス名を想定しています。
    想定している例外の正規クラス名を指定する必要があります。その後、MUnit はスローされた例外の根本原因が、想定しているクラス名の種類とまったく同じであるかどうかを検証します。

    <munit:test name="testExceptions"
      description="Test Exceptions"
      expectedException="java.lang.RuntimeException">
      ...
    </munit:test>

    例外を想定するテストを定義したが、何もスローされない場合、テストは即座に失敗します。

  • 属性 expectedErrorDescription は、エラーの説明を想定しています。
    この属性では、スローされたエラーの説明が想定されるエラーの説明と同じか、スローされたエラーの説明に想定されるエラーの説明が含まれているかどうかを検証できます。エラーを想定するテストを定義したが、何もスローされない場合や、スローされたエラーの説明が一致しない場合、テストは即座に失敗します。

    <munit:test name="testExpectedErrorDescription"
      description="Test Expected Error Description Attribute"
      expectedErrorDescription="An error has occurred">
      ...
    </munit:test>

Before および After スコープ

他のテストフレームワークと同様に、MUnit では MUnit テストまたは MUnit テストスイート全体の実行の前後に実行する処理やアクションを追加できる一連のスコープが提供されます。

  • Before および After Suite スコープ。

  • Before および After Test スコープ。

各コンポーネントの ID 項目は、すべてのアプリケーションで一意である必要があります。Before および After スコープは、それらの間で同じ名前を共有することも、アプリケーションのフローと同じ名前を持つこともできません。

詳細は、​「Before/After スコープ」​リファレンスを参照してください。