第10章 テスト
10.1. テストシナリオ
テストシナリオは、開発者によるルール、モデル、イベントの機能検証を可能にする強力な機能です。テストシナリオは、ナレッジベースのデプロイおよび実稼働環境への実装前のテスト機能を提供します。
テストシナリオは、1 度に 1 回またはグループ単位で実行できます。グループの実行では、1 つのパッケージのすべてのシナリオが対象になります。テストシナリオは独立したものであり、1 つのシナリオが他のシナリオを変更したり、影響を与えたりすることはありません。
すべてのテストシナリオの実行後に、レポートパネルが表示されます。これには、実行されたテストシナリオについての成功または失敗を示すメッセージが含まれます。
図10.1 テストシナリオ画面
10.2. テストシナリオの作成
テストシナリオの作成には、ファクトまたはプロジェクトモデルのインスタンスと同様の条件のデータを指定する必要があります。テストシナリオは所定のルールセットに対応付けられ、予想される結果が実際の結果に対応付けられる場合は、テストシナリオはパスしたものと見なされます。
新規テストシナリオの作成
-
Business Central で、Authoring
Project Authoring をクリックして Projects ビューを開きます。 - テストシナリオのプロジェクトを選択します。
-
New Item
Test Scenario をクリックします。 - 名前を入力し、パッケージを選択して OK をクリックします。
テストシナリオの編集画面が表示されます。
テストシナリオのモデルのインポート
同じパッケージのデータオブジェクトはデフォルトで利用可能になります。たとえば、パッケージ構造 org.company.project
については、以下が該当します。
-
パッケージ
org.company
のデータオブジェクト Fact1 -
パッケージ
org.company.project
の Fact2
org.company
でテストシナリオを作成する場合、org.company.Fact1
は利用可能ですが、org.company.Fact2
をインポートする必要があります。データオブジェクトをインポートするには、以下を実行します。
- テストシナリオを開きます。
- Data Objects タブをクリックします。
-
New Item をクリックし、インポートを選択して Ok をクリックします。インポートはプロジェクトのデータモデルに固有な場合もあれば、
String
またはDouble
オブジェクトなどのように汎用的なものである場合もあります。
テストシナリオファクトの指定
データオブジェクトのインポート後に、Editor タブをクリックします。最低でも、GIVEN および EXPECT などの 2 つのセクションで入力が必要になります。
- GIVEN: テストの入力ファクトです。
EXPECT: 入力ファクトに基づいて予想される結果です。
入力パラメーターを 仮定した場合 (GIVEN)、これらのルールが有効にされるか、または実行されることが 予想されます (EXPECT)。また、ファクトが表示され、特定フィールドの値を持つことを 予想 できる場合や、ルールが全く実行されないことを 予想 できる場合もあります。
予想される内容が一致する場合、テストシナリオはパスし、ルールが正しいとされます。そうでない場合にテストは失敗します。
仮定 (Given) ファクトの指定
新規ファクトを追加するには、GIVEN ラベルの横にある をクリックします。Data Objects タブでインポートしたデータモデルに基づいて、ファクトデータを New Input ダイアログウィンドウに指定します。
ウィンドウ内で、モデルから特定のデータオブジェクトを選択し、これに Fact Name という変数名を付けるか、または代わりにルールフローグループのアクティブ化を選択することもできます。ルールフローグループをアクティブにすると、事前にグループをアクティブして指定されたルールフローグループのルールをテストすることができます。仮定されるファクトを追加し、ルールフローグループをアクティブ化するには、以下を実行します。
- 仮定ファクトを追加します。
- を再度クリックして、ルールフローグループのアクティブ化を追加します。
オプションで、挿入するオブジェクトに制限を追加します。
Add a field をクリックしてオブジェクトのプロパティーを選択します。
プロパティーの横にある をクリックします。
- プロパティータイプが別のファクトオブジェクトの場合は、Create a new fact をクリックします。
または、Literal value をクリックします。
詳細は、「追加のテストシナリオ機能」 を参照してください。
値を指定します。以下は例になります。
上記の例は、以下に相当します。
Customer fact1 = new Customer(); fact1.setHasInternetService(true); insert(fact1);
予想されるルールの指定
GIVEN 条件に問題がなければ、実行されるルール、作成されるファクト、または変更された既存ファクトのフィールド値を予想できます。EXPECT ラベルの横にある をクリックして予想される結果の追加を開始します。
Given セクションで作成されたデータのセットに基づいて、3 つの予想される内容のいずれかを指定できます。
- Rule: 特定ルールの実行についてチェックできます。実行が予想されるルールの名前を入力するか、またはルールの一覧からこれを選択します。終了したら、OK をクリックします。
Fact value: 特定のオブジェクトインスタンスおよびその値をチェックできます。以下の例では、顧客オブジェクトで
hasInternetService
ブール値がtrue
に設定されている場合に、同じオブジェクトのhasPhoneService
ブール値がtrue
に設定されることが予想されます。Any fact that matches: 作業メモリーのオブジェクトおよびそれらのフィールドの値をチェックできます。以下の例では、インターネットサービスを有する顧客オブジェクトの場合、新規オブジェクトの RecurringPayment が
amount
フィールドが5
にされた作業メモリーに挿入されることが予想されます。
シナリオの確認、保存および実行
- 右上にある Save をクリックしてシナリオを保存します。シナリオは定期的に保存し、確認するようにしてください。
右上の Run scenario をクリックしてテストを実行します。結果は、この画面下の Reporting という新規パネルに表示されます。
- 1 つのファイルに複数のテストを作成した場合、すべてのテストを順番に実行できます。これを実行するには、Run all scenarios をクリックします。
Audit log: では、挿入されたファクトおよび実行されたルールについての通知が表示されることにも留意してください。
10.3. 追加のテストシナリオ機能
前述のテストシナリオ機能に加えて、テストシナリオにはその他のさまざまな機能が含まれます。
メソッドの呼び出し
Call Method
により、ルールの実行開始時に既存ファクトでメソッドを呼び出すことができます。この機能には、CALL METHOD ラベルの横にある をクリックしてアクセスできます。図10.2 メソッドの呼び出し
ドロップダウンリストから既存ファクトを選択した後に、Add をクリックします。緑の矢印ボタン を使って、ファクトに対してメソッドを呼び出すことができます。
図10.3 メソッドの呼び出し
テストシナリオでのグローバル (Global) の使用
グローバル (Global) は、ルールエンジンに表示される名前付きオブジェクトですが、ファクトのオブジェクトとは異なります。そのため、グローバルのオブジェクトの変更によってルールの再評価はトリガーされません。テストシナリオでグローバルフィールドを使用し、検証することができます。
テストシナリオでグローバル変数を利用可能にするには、以下を実行します。
-
New Item
Global Variable(s) をクリックしてグローバル定義を作成します。 - グローバル変数の名前およびタイプを定義します。
- オブジェクトタイプをテストにインポートします。グローバル変数のタイプをインポートしない場合、変数はテストで利用可能になりません。
新規グローバルの追加
(globals) ラベルの横にある をクリックしてグローバルを追加し、Add をクリックします。
フィールドに制限を追加することは、フィールドや制限を Given セクションに追加することに似ています。詳細は、仮定 (Given) ファクトの指定 を参照してください。
ルールの設定
(configuration) ラベルを使用すると、以下のオプションを指定してルールの実行についての追加の制約を設定することができます。
-
Allow these rules to fire:
実行を許可するルールを選択できます。 -
Prevent these rules from firing:
テストシナリオで一部のルールが実行されないようにできます。 -
All rules may fire
: 特定のテストですべてのルールの実行を許可します。
図10.4 設定
-
以下のいずれかを選択します。
- Allow these rules to fire:
Prevent these rules from firing:
ルールを空のフィールドに入力します。空のフィールドの横にある をクリックして、条件の影響を受けるルールを選択します。
図10.5 ルールの選択
- ドロップダウンリストからルールを選択し、OK をクリックします。選択されたルールが、ルール設定オプションの横にあるフィールドに表示されます。
日付と時刻の設定
Use real date and time オプションは、テストシナリオの実行時に実際の時間を使用します。
図10.6 実際の日時
Use a simulated date and time オプションでは、テストシナリオに関連した年、月、日、時間、分を指定することができます。
図10.7 タイトル
詳細のファクトデータ
フィールドを、作成されたファクトの一部として編集可能なプロパティーに指定した後に、 をクリックして Field value ダイアログを開きます。リテラル値を編集するか、または詳細なファクトデータを指定することができます。
図10.8 詳細オプション
Advanced Options… セクションでは、作成されるファクトや特定のテストシナリオで使用されるモデルオブジェクトに基づいて以下のいずれかを選択できます。
- Bound variable: フィールドの値を、選択された変数にバインドされたファクトに設定します。フィールドタイプは、バインドされた変数タイプに一致している必要があります。
- Create new fact: 新規ファクトを作成し、これを親ファクトのフィールド値として割り当てることができます。各種フィールド値のドロップダウンで指定されるフィールド値として割り当てられるファクトをクリックします。これらの値には、詳細なフィールド値が指定される場合があります。
その他のセクションの追加
- Editor タブを使って、GIVEN、CCALL METHOD、 and EXPECT セクションをシナリオに追加できます。これを実行するには、EXPECT セクションの下にある More をクリックします。これにより、 をクリックして削除できる 3 つのすべのセクションを含むブロックが開かれます。
既存ファクトの変更または削除
1 つのファイルに複数のテストを作成する場合、以前のテストで挿入されたファクトを削除することが推奨されます。新規の GIVEN ファクトを挿入する際には、以下のフィールドに留意してください。
- Modify an existing fact: ナレッジベースの実行間でファクトを編集できます。
Delete an existing fact: 実行間でファクトを削除できます。
図10.9 既存ファクトの変更および削除