質問

何がベストプラクティスを試験droolsル程度php,c#,d?

今まで使用しました程度php,c#,dにとdbunit試験則による。またサンプルデータを置いていたhsqldb.またプルールパッケージによるプロジェクト終了時には非常に難しい事をしておくの試験入試についてのある規則や火事ではない。

なので、正確な質問であるかを制限することはできま験程度php,c#,dには一定のルール(s)のための実験をしていますか?

役に立ちましたか?

解決

個人としての利用ユニットテストにテストし。ないと思うかも間違っているので、どん落ち込むと警るお知識ベースを作で孤立した規則が働いているという。試験全体の知識ベースがより重要だと考えます。

おに記述することができるの単離試験 AgendaFilter とStatelessSession

StatelessSession session = ruleBase.newStatelessSesssion();

session.setAgendaFilter( new RuleNameMatches("<regexp to your rule name here>") );

List data = new ArrayList();
... // create your test data here (probably built from some external file)

StatelessSessionResult result == session.executeWithResults( data );

// check your results here.

コードソース: http://blog.athico.com/2007/07/my-rules-dont-work-as-expected-what-can.html

他のヒント

よだれのユニットテストを作成するのに役立つシンプルなライブラリを作成しました。機能の1つは、まさに必要なものです。ユニットテストに使用する特定のDRLファイルを宣言します。

@RunWith(DroolsJUnitRunner.class)
@DroolsFiles(value = "helloworld.drl", location = "/drl/")
public class AppTest {

    @DroolsSession
    StatefulSession session;

    @Test
    public void should_set_discount() {
        Purchase purchase = new Purchase(new Customer(17));

        session.insert(purchase);
        session.fireAllRules();

        assertTrue(purchase.getTicket().hasDiscount());
    }
}

詳細については、ブログ投稿をご覧ください。 http://maciejwalkowiak.pl/blog/2013/11/24/jboss-drools-unit-testing-with-junit-drools/

テストのために、ルールの実行を単一のルールに制限しようとしないでください。 OOクラスとは異なり、単一のルールは他のルールとは独立していないため、ユニットテストを使用して単一のクラスをテストするのと同じように、ルールを単独でテストすることは意味がありません。言い換えれば、単一のルールをテストするために、他のルールと組み合わせて正しい効果があることをテストします。

代わりに、すべてのルールに関する少量のデータを使用してテストを実行します。つまり、ルールセッションで最小限の事実を備えたもので、結果をテストし、おそらく特定のルールが起動されたことをテストします。結果は、最小限のテストデータのセットが1つまたは2つのルールのみをアクティブにする可能性があるため、実際には念頭に置いているものとはそれほど違いはありません。

サンプルデータについては、静的データを使用し、各テストの最小テストデータを定義することを好みます。これを行うにはさまざまな方法がありますが、Javaでプログラム的にファクトオブジェクトを作成するだけで十分かもしれません。

dbunitを使用したユニットテストは実際には機能しません。 dbunitとの統合テストはそうです。その理由は次のとおりです。-ユニットテストは速いはずです。 -DBunitデータベースの復元は遅いです。簡単に30秒かかります。 - 実際のアプリケーションには、null列ではない多くのアプリケーションがあります。そのため、単一の機能に対して分離されたデータは、データベースのテーブルの半分の半分を簡単に使用します。 - 単位テストを分離する必要があります。 - すべてのテストを分離するためにすべてのテストのdbunitデータベースを復元するには欠点があります:---すべてのテストには数時間かかります(特にアプリケーションが増加するにつれて)。テストはないので、アプリケーションにはバグがたくさんあります。 ---すべてのユニットテストの半分のデータベースを作成することは、多くの作成作業、多くのメンテナンス作業であり、簡単に無効になる可能性があります(データベーススキーマがサポートしていない検証に関して、Hibernate Validatorを参照してください)。現実を表現する仕事。

代わりに、dbunitを使用して統合テストを書き込みます。 -1つのdbunit、すべてのテストで同じ。 1回だけロードします(500個のテストを実行しても)。 - 各テストをトランザクションでラップし、テストするたびにデータベースをロールバックします。ほとんどの方法では、とにかく必要な伝播を使用しています。テストダーティのみを設定します(次のテストがある場合は、次のテストでリセットするには)伝播が必要な場合にのみ。 - そのデータベースにコーナーケースを入力します。ビジネスルールをテストするために厳密に必要なものよりも多くの一般的なケースを追加しないでください。そのため、通常、2つの一般的なケースのみ(「1つから多く」をテストできるように)。 - 将来の防止テストの記述: - アクティブ化されたルールの数または挿入された事実の数をテストしないでください。 - 代わりに、結果に特定の挿入された事実が存在するかどうかをテストします。結果を特定のプロパティをxに設定し(そのプロパティの共通値とは異なります)、そのプロパティをxに設定して挿入されたファクトの数をテストします。

ユニットと統合テストを備えたJavaコードと同じアプローチを選択してみませんか?ユニットテストとは、最小限のコードを取得し、仕様を定義する可能性のあるすべてのユーザーケースをテストすることです。統合テストを使用すると、目標はすべての可能なユーザーキャスではなく、一緒に機能するいくつかのユニットの統合です。ルールでも同じことをします。ビジネスの意味と目的によってルールを分離します。最も単純な「テスト中のユニット」は、シングルまたは 高い説教 一般的なDSL定義ファイルや決定表のように、一連のルールとそれが機能するために必要なもの(もしあれば)。統合テストの場合、意味のあるサブセットまたはシステムのすべてのルールを取得できます。

このアプローチを使用すると、影響を受けない多くの孤立したユニットテストがあり、それぞれのビジネスシナリオをテストするために入力データのサブセットを備えた一連のビジネスルールを隔離するため、新しいルールを追加するときにサポートを必要としません。また、「一般的なシナリオ」を再現およびテストするための一般的な入力データが限られている統合テストはほとんどありません。統合テストに新しいルールを追加するには、テスト出力を更新する必要があり、新しいルールが一般的なデータフローにどのように影響するかを反映します。

検討 Junitテストルール これにより、リソースを宣言的な方法でロードし、実際にトリガーされたルールを主張する可能性が得られます。これは、内部のアサーションの障害を維持し、一目で何がうまくいかなかったかを示唆する不一致をトリガーするルールを報告します。ロギングは、イベント間の原因となる関係に光を当てます。で動作します SpringRunner.class スプリング統合テスト用。

例:

@DroolsSession(resources = {
        "classpath*:/org/droolsassert/rules.drl",
        "classpath*:/com/company/project/*/{regex:.*.(drl|dsl|xlsx|gdst)}",
        "classpath*:/com/company/project/*/ruleUnderTest.rdslr" },
        ignoreRules = { "before", "after" })
public class DroolsAssertTest {

    @Rule
    public DroolsAssert drools = new DroolsAssert();

    @Test
    @AssertRules("atomic int rule")
    public void testInt() {
        drools.insertAndFire(new AtomicInteger());
        assertEquals(1, drools.getObject(AtomicInteger.class).get());
    }
}

見る rules.drl
もっと: https://github.com/droolsassert/droolsassert

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top