コラム/第9回 デモアプリケーションを使って JBoss BRMS を理解する ~ルールのテスト~
Red Hat
2015年12月7日
第9回 デモアプリケーションを使って JBoss BRMS を理解する ~ルールのテスト~
「第8回 JBoss BRMS における宣言型プログラミング」ではJBoss BRMS でルールを定義する際の基本的な考え方となる宣言型プログラミングについてご紹介しました。今回は、JBoss BRMS で開発したルールをテストする方法についてご紹介します。
ルールのテスト
ビジネスルールのテストでは、入力に対して期待する結果を得られるかを確認するシナリオテスト(複数ルールが対象)と、ルールそのものの定義が正しいかの確認テスト(単一ルールが対象)を行います。また、ルール定義そのものに過不足や不正がないかも確認します。
今回は、Coolstoreデモを使ってビジネスルールのテストの方法を見ていきます。
※Coolstoreデモについては、第5回のコラムでご紹介しておりますので、そちらも併せてご覧ください。
シナリオテスト
ブラウザで
Project Exproler から TEST SCENARIOS を開くと、既にテストシナリオが登録されています。まずは、ビジネスセントラルではDSL(Domain Specific Languge)を使って定義されたテストシナリオの実行方法を見ていきましょう。
左側のペインから"Free Shipping Promotion DLS Test"を選択すると、右側のペインにシナリオと「Run scenario」ボタンが表示されます。Run scenario でテストシナリオを実行すると Audit Log というリンクが出てきますので、こちらをクリックするとどのルールがどのように呼出されたかを確認することができます。
ここで、パラメータを変更したい場合は右側のペインでパラメータを変更して、再度「Run scenario」を実行します。
図 1 テストシナリオの実行
図 2 Audit Log
JUnit
Coolstoreデモには、JUnitを利用したテスト用クラスも一緒に配布されており、テスト用のクラスは src/test/java/com/redhat/coolstore/service/ に保存されています。 Coolstoreデモのpom.xmlファイルを見てみると、次のようにArquillian (※) を利用したテストの方法が記載されていますので、その方法でテストを試してみましょう。 ここでは、Arquillianに関する説明は割愛しますので詳細は http://arquillian.org/ を参照してください。
※Arquillian は Red Hat JBoss Middleware のサポート対象ではありません。
テストメソッドの定義は、普通のJUnitのテスト用クラスと同様です。
com.redhat.coolstore.service.ShoppingCartServiceTest.priceShoppingCartOneItem()メソッドの抜粋
74 ShoppingCartItem sci = new ShoppingCartItem();
75 Product p = new Product();
76 p.setItemId("123");
77 p.setPrice(10.00);
78 sci.setQuantity(2);
79 sci.setProduct(p);
80
81 productService.setProducts(Arrays.asList(p));
82
83 shoppingCart.addShoppingCartItem(sci);
84
85 shoppingCartService.priceShoppingCart(shoppingCart);
86
87 Assert.assertEquals(20, shoppingCart.getCartItemTotal(), 0);
88 Assert.assertEquals(2.99, shoppingCart.getShippingTotal(), 0);
89 Assert.assertEquals(22.99, shoppingCart.getCartTotal(), 0.001);
テスト方法は、(1)JBoss ASのコンテナを立ち上げてそこにデプロイしてテストを実行する方法と、(2)既存のコンテナにデプロイしてテストを実行する方法です。 pom.xml を見てみると、Maven でのテスト方法がコメントとして記載されています。
テスト方法 (1)は
mvn clean test -Parq-jbossas-managed
テスト方法 (2)は
mvn clean test -Parq-jbossas-remote
のように実行します。
テストを実行すると、以下のように(実際にはもっとたくさんの出力があります)テスト結果が出力されます。
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running com.redhat.coolstore.service.PromoServiceTest
Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 71.633 sec
Running com.redhat.coolstore.service.ShippingServiceTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 11.568 sec
Running com.redhat.coolstore.service.ShoppingCartServiceTest
Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 12.874 sec
Results :
Tests run: 9, Failures: 0, Errors: 0, Skipped: 0
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:47 min
[INFO] Finished at: 2015-11-01T07:16:04+08:00
[INFO] Final Memory: 56M/439M
[INFO] ------------------------------------------------------------------------
Verifier
drools-verifier (※) を利用することで、ルールの静的解析を行い、境界値判定に過不足がないかなどを確認することができます。 Verifierはクラスパスまたは、指定したディレクトリからルールを読み込み、 検証を行います。
※現在、Verifier の機能は Red Hat JBoss BRMS 6 ではサポートされていません。
下記のサンプルではクラスパスからSampleRule.drlを読み込み検証を実行します。 9行目でVerifyを実施して、ルールを検証します。このサンプルではVerify結果のメッセージを出力するようにしていますが、 エラー、境界値違反の情報もCollectionとして取得することができます。
01 public class RuleVerificationTest {
02 @Test
03 public void sample() throws Exception {
04 VerifierBuilder vBuilder = VerifierBuilderFactory.newVerifierBuilder();
05 Verifier verifier = vBuilder.newVerifier();
06 verifier.addResourcesToVerify(ResourceFactory.newClassPathResource(
07 "SampleRule.drl", getClass()), ResourceType.DRL);
08 assertFalse(verifier.hasErrors());
09 boolean noProblems = verifier.fireAnalysis();
10 assertTrue(noProblems);
11
12 VerifierReport result = verifier.getResult();
13 Collection<VerifierMessageBase> noteMessages = result.getBySeverity(Severity.NOTE);
14 for (VerifierMessageBase msg : noteMessages) {
15 System.out.println("Note:" + msg.getMessage() + "type: " + msg.getMessageType() + " on: " + msg.getFaulty());
16 }
17
18 verifier.dispose();
19 }
20 }
Verifier を利用する場合には、下記のdependencyをPOMファイルに追加します。
<!-- Verifier -->
<dependency>
<groupId>org.drools<⁄groupId>
<artifactId>drools-verifier</artifactId>
</dependency>
mvn でテストクラスを指定して、テストを実行します。
mvn test -Dtest=RuleVerificationTest
まとめ
業務という観点では、ビジネスルールのテストは、既存のシステムでの処理結果との比較をしながら、期待する結果になっているかなどを検証する必要がありますが、 ルールをプログラムとして捉えて JUnit のようなテストツールでテストを実施することで、テストの自動化なども実現できるようになりますので、Coolstoreデモなどを参考にして、 ルールのテストの自動化にもトライしてみてください。
著者紹介
レッドハット株式会社
JBossサービス事業部
ソリューションアーキテクト 大溝 桂 様
サン・マイクロシステムズにてC言語/Java言語を利用した基幹業務システムの開発などを経験後、2012年にレッドハット株式会社に入社。パートナを担当するプリセールスエンジニアとして、JBoss Middlewareの拡販とパートナ企業の技術者育成に従事。
もっと知る
「Red Hat ソリューション」についてのお問い合わせやお見積もりなど、
お気軽にご連絡ください。