この章では、Oracle Business Rulesで提供されるルール・テスト・フレームワークを使用して、Oracle JDeveloperのルール・デザイナのルールをテストする方法について説明します。また、Oracle Business Rules関数の作成により、ルールおよびデシジョン表をテストする方法についても説明します。さらに、デシジョン・サービスを介してOracle Business Rulesを使用するSOAアプリケーションの、Oracle Enterprise Manager Fusion Middleware Controlコンソールを使用した実行時のテスト方法についても説明します。
この章の項目は、次のとおりです。
Oracle Business Rulesには、複雑な入力パラメータを使用したルールのテストが可能な、テスト・フレームワークが用意されています。このフレームワークにより、設計時にルールをテストすることが可能になり、用件に応じたルールの検証または改良ができます。
ルールをテストする別の方法はテスト関数を定義することで、これにより入力の作成、ルールの実行、出力の検証ができます。入力の作成や出力の検証がプログラムで行われるため、テスト関数は通常、単純テストで使用され、テスト・フレームワークは総合的なテストで使用されます。また、このテスト関数は、パラメータを使用せずにブール値のみを戻す関数に対してのみアクティブです。
Oracle Business Rulesには、デフォルトの機能が用意されており、特定の一連の入力を行って、定義したルールが正常に動作するかどうかを設計時にテストできます。提供されているテストの粒度は、デシジョン関数レベルです。デシジョン関数をディクショナリに定義する場合、テスト・スイートを定義して、各デシジョン関数に対してそのテスト・スイートを実行できます。
Oracle Business Rulesでは、Javaファクト、XMLファクト、RLファクトおよびADF-BCファクトといった複数タイプのファクトがサポートされています。現在、テスト・フレームワークでは、XMLファクトのみがサポートされています。そのため、定義したデシジョン関数に、XML以外のファクトを参照する入力または出力が存在する場合、そのデシジョン関数をテストするためにテスト・フレームワークを使用することはできません。XML以外のファクトを使用すると、そのデシジョン関数に対してテスト機能が使用できないことを示す、警告メッセージまたはエラー・メッセージが表示されます。
ルールをテストするには、デシジョン関数を前提条件として作成する必要があります。
Oracle JDeveloperを開きます。
アプリケーション・ナビゲータで、テスト対象のルールが存在するディクショナリを含むプロジェクト・ファイル、たとえば「Business Rules」の下の「BaseDictionary.rules」を開きます。
「ディクショナリ」セクションで、「デシジョン関数」をクリックしてデシジョン関数のリストを開きます。
「デシジョン関数」セクションで、「作成」アイコン(プラス記号)をクリックして「デシジョン関数の編集」ダイアログ・ボックスを表示します。
「名前」フィールドに、TestDF
.などのデシジョン関数の名前を入力します。
「入力」タブの「名前」の下に、入力名を入力して[Enter]を押します。この例では、songs
と入力します。
「ファクト・タイプ」リストからファクト・タイプを選択します。必ずXMLファクトを選択してください。この例では、ファクト・タイプとして「Song」を選択します。同様に、artists
という名前の別の入力変数とArtistというファクト・タイプが追加されています。
必要に応じて、「ツリー」または「リスト」を選択します。ツリー・モードまたはリスト・モードのルールの詳細は、第6.2.1項「デシジョン関数の追加または編集方法」を参照してください。
「出力」タブの「名前」の下に、出力名を入力して[Enter]を押します。この例では、songs
と入力します。
「ファクト・タイプ」リストからファクト・タイプを選択します。必ずXMLファクトを選択してください。この例では、「Song」を選択します。
「ルールセットおよびデシジョン関数」で、「使用可能」ボックスから起動するルールセットを選択し、シャトル(>)アイコンを使用して、「選択済」ボックスに移動します。この例では、「SongArtistRules」が選択済になっています。
注意: この例では、サンプル・スキーマと対応するファクトを使用します。 |
「OK」をクリックして、デシジョン関数を作成します。図8-1に、「デシジョン関数の編集」ダイアログ・ボックスを示します。
デシジョン関数を作成すると、デシジョン関数のテストに役立つ、2つのXMLスキーマ(xsdファイル)が自動的に生成されます。これらのスキーマには、それぞれ_TestSuite、_Typesという接尾辞が付けられています。さらに、これらのスキーマは図8-2に示すように、アプリケーション・ナビゲータに表示されている「testsuites」フォルダの下の「xsd」フォルダに格納されています。
_TestSuiteという接尾辞の付いたスキーマに基づき、デシジョン関数用に作成されるテスト・スイートを定義する必要があります。
生成されたスキーマ・ファイルは、次の命名規則に従います。
<ディクショナリ名>_<デシジョン関数名>_TestSuite.xsd: このファイルには、デシジョン関数用のテスト・スイート・スキーマが含まれます。このデシジョン関数用に作成されたテスト・スイートは、このスキーマに準拠する必要があります。次に、TestSuite.xsdファイルのサンプルを示します。
<?xml version = '1.0' encoding = 'UTF-8'?> <schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://xmlns.oracle.com/rules/test" targetNamespace="http://xmlns.oracle.com/rules/test" elementFormDefault="qualified" attributeFormDefault="unqualified" xmlns:df="http://xmlns.oracle.com/rules/BaseDictionary/BaseDF"> <annotation> <documentation> Decision Function Test Suite Schema </documentation> </annotation> <import namespace="http://xmlns.oracle.com/rules/BaseDictionary/BaseDF" schemaLocation="BaseDictionary_BaseDF_Types.xsd"/> <element name="testSuite"> <complexType> <sequence> <element name="decisionFunction" type="string" minOccurs="1" maxOccurs="1"/> <element name="testCase" type="tns:testCaseType" minOccurs="1" maxOccurs="unbounded"/> </sequence> </complexType> </element> <complexType name="testCaseType"> <sequence> <element name="testInput" type="df:parameterList" minOccurs="0" maxOccurs="1"/> <element name="expectedOutput" type="df:resultList" minOccurs="0" maxOccurs="1"/> </sequence> <attribute name="name" type="string" use="required"/> </complexType> </schema>
前述のサンプルで示したように、スキーマにはマスターのtestSuite
要素が含まれており、さらにその下にdecisionFunction
という要素が含まれ、ここにこのテスト・スイートが対応するデシジョン関数が定義されます。testSuite
要素にはまた、1つ以上のtestCase
要素も含まれます。各testCase
には、testInput
要素およびexpectedOutput
要素と名前が含まれます。testInput
値は、テスト・ケースへの入力として使用される値で、expectedOutput
値は、それと実際の出力が照合される値です。testInput
およびexpectedOutput
のタイプ(それぞれparameterList
およびresultList
)は、この次のXSDに定義されています。
<ディクショナリ名>_<デシジョン関数名>_Types.xsd: このスキーマには、parameterList
とresultList
の、2つのcomplexType要素が含まれます。これら2つのタイプはTestSuiteスキーマで使用されますが、ここに定義されています。parameterList
タイプはデシジョン関数の入力に対応し、resultList
タイプはデシジョン関数の出力に対応します。これは、デシジョン関数には固有の入力および出力があるからです。デシジョン関数用にテスト・ケースを記述する場合、テスト・ケースの入力はデシジョン関数により受け取られる入力に対応する必要があり、予期される出力がデシジョン関数の出力に対応する必要があります。paramaterList
とresultList
は別々のcomplexTypeです。たとえば、デシジョン関数が10個の入力と5個の出力を必要とする場合、parameterList
タイプはデシジョン関数の入力として用意する必要がある10の異なる要素を一括して定義する、1つのComplexTypeになります。
次に、Types.xsdのサンプルを示します。
<?xml version = '1.0' encoding = 'UTF-8'?> <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://xmlns.oracle.com/rules/BaseDictionary/BaseDF" attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:tns="http://xmlns.oracle.com/rules/BaseDictionary/BaseDF" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:rules="http://xmlns.oracle.com/bpel/rules" xmlns:ns1="http://xmlns.oracle.com/rulestest/datamodel"> <import namespace="http://xmlns.oracle.com/rulestest/datamodel" schemaLocation="../../xsd/XMLFactTypes2.xsd"/> <import namespace="http://xmlns.oracle.com/bpel/rules" schemaLocation="DecisionFunctionPrimitiveTypes.xsd"/> <complexType name="parameterList"> <sequence> <element name="tSongElement" type="ns1:tSong"/> <element ref="ns1:Artist"/> </sequence> </complexType> <complexType name="resultList"> <sequence> <element name="tSongElement" type="ns1:tSong"/> </sequence> </complexType> </schema>
デシジョン関数の更新があるたびに、対応する2つのスキーマも更新されます。たとえば、デシジョン関数の名前を変更すると、関連するスキーマの名前が変更されます。デシジョン関数を削除すると、対応するスキーマも削除されます。デシジョン関数の入力および出力への変更であっても、関連するスキーマに変更が生じます。このように、デシジョン関数とそれに対応するテスト・スキーマは常に同期されます。
デシジョン関数に何か変更を加えた場合、たとえばデシジョン関数を削除した場合は、通常、スキーマも削除されます。ディクショナリのツールバーにある「元に戻す」アイコンをクリックすると、デシジョン関数が回復されます。ただし、対応するスキーマは削除されたままです。その場合は、デシジョン関数用のスキーマを手動で再生成する必要があります。このように、元に戻す操作とやり直し操作では、デシジョン関数とそれに対応するテスト・スキーマ間の同期は、サポートされていません。
次のように手動でスキーマを再生成します。
図8-3に示すように、ディクショナリのツールバーにある「すべてのデシジョン関数のテスト・スイート・スキーマを生成」アイコンをクリックします。
テスト・スイート・スキーマを再生成するためアイコンをクリックすると、一括で再生成アクティビティが行われ、ディクショナリに存在するすべての利用可能なデシジョン関数に関連するすべてのテスト・スイート・スキーマが再生成されます。スキーマがすでに存在している場合は、上書きされます。
このアクティビティは、特に次のような場合に使用されます。
デシジョン関数を削除または変更してから変更を取り消した場合: これにより、デシジョン関数と関連するスキーマは同期しなくなります。これらを同期させるには、このオプションを使用してスキーマを再生成し、デシジョン関数に対応するようにします。
古いディクショナリを移行した場合: 多数のデシジョン関数が定義された、以前のリリースのディクショナリをすでに持っており、これらのデシジョン関数用のテスト・スイートを定義する機能をテストするルールを使用してテストする状況を考えてみます。この場合は、移行後にエディタ・ウィンドウで各デシジョン関数を開いてから、「OK」ボタンをクリックする必要があります。これにより、対応するテスト・スイート・スキーマが生成されます。しかし、これではデシジョン関数が数百個存在する場合、時間が掛かり過ぎます。この場合、スキーマを再生成するオプションを使用すれば一括で生成が可能です。
注意: 移行したデシジョン関数の入力および出力としてXMLファクトを必ず含むようにしてください。そうしないと、テスト・スイート・スキーマ・ファイルに定義される入力および出力が空になります。 |
ルールをテストするためのデシジョン関数を一度作成すると、ルールをテストできます。
ルールをテストする手順は、次のとおりです。
デシジョン関数名を選択します。この場合は、たとえば「TestDF」を「ディクショナリ」ページで選択してから「テスト」ボタンをクリックし、「デシジョン関数テスト」ダイアログ・ボックスを表示します。
「作成」アイコン(プラス記号)をクリックして「テスト・スイートの作成」ダイアログ・ボックスを表示します。
図8-4に示すように、テスト・スイートの名前、たとえばTestDFTestSuite1
を入力し、「OK」をクリックします。
「デシジョン関数テスト」ダイアログ・ボックスの「閉じる」をクリックします。
テスト・スイートを作成すると、<テスト・スイート名>.xmlファイルが自動的に生成され、「testsuites」フォルダ内の「rules」フォルダの下の「<ベース・ディクショナリ名>」フォルダに格納されます。このファイルは、「アプリケーション・ナビゲータ」ウィンドウで表示できます。テスト・スイートを作成するたびに、対応するXMLファイルが生成されます。
ただし、新規に作成されたテスト・スイート・ファイルは空で、テスト・ケース、入力定義または出力定義はまったく含まれていません。
<テスト・スイート名>.XMLを開き、テスト・スイートのXSDファイル(この場合、「test」の下のデシジョン関数に対応するTestDF XSD)に準拠した、必要なテスト・ケースを記述します。
次に、テスト・ケースを含むテスト・スイート・ファイルのサンプルを示します。
<?xml version = '1.0' encoding = 'UTF-8'?> <testSuite xmlns="http://xmlns.oracle.com/rules/test" xmlns:ns1="http://xmlns.oracle.com/bpel/rules" xmlns:ns2="http://xmlns.oracle.com/rules/BaseDictionary/BaseDF" xmlns:ns3="http://xmlns.oracle.com/rulestest/datamodel"> <decisionFunction>G}-733d3b8f:12f76ddad3a:-7c02</decisionFunction> <testCase name="TestDFTestSuite1_TestCase1"> <testInput> <ns2:tSongElement> <ns3:Title>Come What May</ns3:Title> <ns3:Composer>Artist</ns3:Composer> <ns3:Length>PT3M2S</ns3:Length> <ns3:Year>2010</ns3:Year> <ns3:Artist> <ns3:name>MJ</ns3:name> <ns3:age>20</ns3:age> <ns3:recordLabel>BMG Music</ns3:recordLabel> </ns3:Artist> </ns2:tSongElement> <ns3:Artist> <ns3:name>MJ</ns3:name> <ns3:age>20</ns3:age> <ns3:recordLabel>BMG Music</ns3:recordLabel> </ns3:Artist> </testInput> <expectedOutput> <ns2:tSongElement> <ns3:Title>Come What May</ns3:Title> <ns3:Composer>MJ</ns3:Composer> <ns3:Publisher>BMG Music</ns3:Publisher> <ns3:Length>PT3M2S</ns3:Length> <ns3:Year>2010</ns3:Year> <ns3:Artist> <ns3:name>MJ</ns3:name> <ns3:age>20</ns3:age> <ns3:recordLabel>BMG Music</ns3:recordLabel> </ns3:Artist> </ns2:tSongElement> </expectedOutput> </testCase> </testSuite>
テスト・スイート・ファイルを保存します。
「ディクショナリ」ページを開きます。デシジョン関数名(たとえば「TestDF」)を選択してから、「テスト」ボタンをクリックし、「デシジョン関数テスト」ダイアログ・ボックスを表示します。
図8-5に示すように、「テスト・スイート」リストから「TestDFTestSuite1」を選択し、「テストの実行」をクリックします。
テスト・スイート・ファイル内のすべてのテスト・ケースが実行されます。
デシジョン関数のテストの詳細は、表形式で確認できます。
詳細には、テスト・スイート名、全部の結果、および次のようなテスト・ケースの詳細が含まれます。
テスト・ケース名
テスト・ケースの結果
アサートされたファクト、アクティブ化されたルール、起動されたルールおよび結果として生じたファクトの変更などのトレース情報
図8-6に、テスト結果を示します。
「結果」ページの「コメント」セクションには、テスト・ケースが失敗した場合、すべてのエラーの詳細を表示します。
テスト・スイートXMLファイルが、テスト・スイートXSDファイルに準拠していないという問題が発生することがあります。この場合、「デシジョン関数テスト」ウィンドウを開くと、「テスト・スイート」リスト内のテスト・スイート名のすぐ横に、図8-7に示すように黄色い警告の三角形が表示されます。
誤りを含むテスト・スイートを実行しようとすると、次のエラー・メッセージが表示されます。
テスト・スイートXMLファイルが不完全な形式の場合、「デシジョン関数テスト」ウィンドウのテスト・スイートのリストに、テスト・スイート名は表示されません。また、無効なディクショナリでは、デシジョン関数をテストすると次のエラー・メッセージが表示されます。
ディクショナリが無効です。検証エラーを修正して再試行してください。
ベース・ディクショナリとカスタム・ディクショナリが存在する状況を考えてみます。カスタム・ディクショナリには、ベース・ディクショナリへのリンクが含まれています。
ここで、カスタム・ディクショナリの「デシジョン関数」セクションにナビゲートします。カスタム・ディクショナリのデシジョン関数のリストには、リンク先のベース・ディクショナリのデシジョン関数が含まれることに注意してください。ベース・ディクショナリのデシジョン関数は、カスタム・ディクショナリからテストできます。
テスト・ケースが失敗した場合、「結果」ページの「コメント」セクションには、考えられる失敗の理由が表示されます。
テスト・ケースは次の理由により、失敗する場合があります。
次のように、テスト・ケース用に指定した予期される出力が、実際の出力と異なっている。
「コメント」セクションは、予期される出力と実際の出力の間に明らかな不一致があることを示しています。
次のように、テスト・ケースは実行されたが、出力が生成されなかった。
「コメント」セクションには、テストが結果を生成しなかったことと、考えられる原因についてのより詳細な情報が表示されています。
次のように、テスト・ケースは実行されたが、複数の出力が生成された。
「コメント」セクションには、テストの実行について複数の出力が生成されたことが、考えられる原因についての詳細な情報とともに表示されています。
次のように、テスト・ケースによるルールの起動がまったく行われない。
これは、アサートされたファクトがルールのアクティブ化に失敗し、結果としてルールが起動されなかったことが原因である可能性があります。そのため、「コメント」セクションには、これはルール・モデリング・エラーによる可能性があると表示されています。おそらく、用意された入力がすべてのルール条件との一致に失敗したためです。
デシジョン関数を作成し、そのデシジョン関数をOracle Business Rules関数を使用してルール・デザイナからコールすることで、ルールセットをテストできます。Oracle Business Rules関数本体で、入力ファクトを作成し、デシジョン関数をコールし、デシジョン関数からのファクト出力を検証します。詳細は、第6.1項「デシジョン関数の概要」および第2.5項「Oracle Business Rules関数の使用」を参照してください。
Oracle Business Rules関数を使用してデシジョン関数をテストする手順は、次のとおりです。
ディクショナリが有効であることを確認します。
ディクショナリ検証の詳細は、第4.4.4項「ディクショナリの検証方法」を参照してください。
Rules Designerで、「関数」ナビゲーション・タブを選択します。
「関数」領域で「作成」アイコンをクリックします。
「名前」フィールドに関数名を入力するか、デフォルト名を使用します。
「戻り型」のリストから戻り型を選択します。
テスト関数の場合は、「boolean
」を選択します。
「引数」表で、引数がないことを確認します。テスト関数の場合、引数は指定できません。
「本体」領域に、テスト関数本体を入力します。
テスト関数本体で、assign new
を使用してデシジョン関数をコールし、そのデシジョン関数をコールして戻り値を取得できます(テスト関数本体では、入力ファクトを作成し、デシジョン関数をコールし、デシジョン関数からのファクト出力を検証します)。
デシジョン関数のコールによって、List
が戻されます。つまり、テスト関数でデシジョン関数をテストする手順は、次のとおりです。
必要に応じて、デシジョン関数の入力引数用の入力データを作成します。
テスト関数で作成した引数を使用してデシジョン関数をコールします。
結果をList
形式にします。たとえば、次のようになります。
assign new List resultsList = DecisionFunction_1(testScore)
図8-8に、デシジョン関数をコールするテスト関数を示します。
関数を選択し、「テスト関数」アイコンをクリックします。
関数が実行されます。図8-9に示すように、出力が「関数テスト結果」ダイアログに表示されます。
「OK」をクリックして「関数テスト結果」ダイアログを閉じます。
ルール・デザイナ内でOracle Business Rules関数を使用してデシジョン関数をテストできます。テスト関数を使用する際の注意事項は、次のとおりです。
テストOracle Business Rules関数に関連付けられているディクショナリに検証警告が含まれている場合は、「テスト関数」アイコンがグレー表示されます。「テスト関数」アイコンが表示されるのは、ディクショナリが警告なしに検証された場合のみです。
ロギングを有効化するために、RL.
watch.all()
をコールできます。RL Language関数の詳細は、『Oracle Fusion Middleware Oracle Business Rulesランゲージ・リファレンス・ガイド』を参照してください。このマニュアルでは、RL.watch.all()
はRL Language関数watchAll()
の別名です。
図8-8に示した例のかわりに、例8-1に示されている関数本体を入力することもできます。この関数はRL.watch.all()
を実行し、その出力を表示します。図8-10に示すように、gradeがBの範囲内の場合、ダイアログに"Test Passed"と表示されます。図8-11に示すように、アサートされたgradeがBの範囲外の場合、ダイアログに"Test Failed"と表示されます。
例8-1 trueまたはfalseの戻り値を使用する関数本体
call RL.watch.all() assign new TestScore testScore = new TestScore() modify (testScore, name: "Bill Reynolds", testName: "Math Test", testScore: 81) assign new TestGrade testGrade = (TestGrade)DecisionFunction_1(testScore).get(0) return testGrade.grade == Grade.B
testScore
の値81に対し、この関数は図8-10に示すように、"Test Passed"を戻します。testScore
の値91に対し、この関数は図8-11に示すように、"Test Failed"を戻します。
デシジョン・サービスでOracle Business Rulesを使用するSOAアプリケーションでは、Oracle Enterprise Manager Fusion Middleware Controlコンソールのテスト関数を使用して、実行時にルールのテストを行うことが可能です。
テスト関数の使用の詳細は、『Oracle Fusion Middleware Oracle SOA SuiteおよびOracle Business Process Management Suite管理者ガイド』を参照してください。