Frage

Was ist die beste Praxis-Test drools Regeln mit JUnit?

Bisher haben wir junit mit DBUnit zu Prüfregeln. Wir hatten Beispieldaten, die auf HSQLDB gesetzt wurde. Wir hatten einige Regelpakete und bis zum Ende des Projektes ist es sehr schwer, einen guter Testeingang zu machen bestimmte Regeln zu testen und nicht Feuer andere.

So ist die genaue Frage ist, wie kann ich Tests in JUnit begrenzen, um eine oder mehrere bestimmten Regel (n) für die Prüfung?

War es hilfreich?

Lösung

Ich persönlich verwende Unit-Tests isoliert Regeln zu testen. Ich glaube nicht, dass es etwas zu falsch mit ihm, so lange wie Sie fallen nicht in ein falsches Gefühl der Sicherheit, dass Ihre Wissensbasis zu arbeiten, weil isoliert Regeln arbeiten. die gesamte Wissensbasis zu testen ist wichtiger.

Sie können die Isolierung von Tests schreiben mit AgendaFilter und 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.

Code-Quelle: http : //blog.athico.com/2007/07/my-rules-dont-work-as-expected-what-can.html

Andere Tipps

Ich habe einfache Bibliothek, die Unit-Tests für geifert schreiben hilft. Eines der Merkmale ist genau das, was Sie brauchen: erklären, insbesondere TFL Dateien, die Sie für Ihre Unit-Test verwenden möchten:

@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());
    }
}

Für weitere Details werfen Sie einen Blick auf Blog-Eintrag: http://maciejwalkowiak.pl/blog/2013/11/24/jboss-drools-unit-testing-with-junit-drools/

Versuchen Sie nicht, zu begrenzen Regelausführung zu einer einzigen Regel für einen Test. Im Gegensatz zu OO-Klassen, sind einzelne Regeln nicht unabhängig von anderen Regeln, so macht es keinen Sinn machen, eine Regel in Isolation in der gleichen Art und Weise zu testen, ob Sie eine einzelne Klasse mit einem Unit-Test prüfen würden. Mit anderen Worten, eine einzige Regel zu testen, testen, dass es die richtige Wirkung in Kombination mit den anderen Regeln.

Stattdessen laufen Tests mit einer kleinen Menge von Daten über all Ihre Regeln, das heißt mit einer minimalen Anzahl von Fakten in der Regel Sitzung und Test der Ergebnisse und vielleicht, dass eine bestimmte Regel wurde gefeuert. Das Ergebnis ist eigentlich nicht so viel anders aus, was Sie im Kopf haben, weil ein minimaler Satz von Testdaten nur eine oder zwei Regeln könnte aktiviert werden.

Wie für die Beispieldaten, ziehe ich es statische Daten zu verwenden und für jeden Test minimal Testdaten zu definieren. Es gibt verschiedene Möglichkeiten, dies zu tun, sondern programmatisch Tatsache Objekte in Java zu schaffen gut genug sein könnte.

Ein Unit-Test mit DBUnit funktioniert nicht wirklich. Ein Integrationstest mit DBUnit tut. Hier ist der Grund: - Eine Einheit Test sollte schnell sein. - Eine DBUnit Datenbank wiederherzustellen, ist langsam. In 30 Sekunden leicht. - Eine echte Anwendung hat viele nicht null-Spalten. So Daten für ein einzelnes Merkmal isoliert, verwendet immer noch leicht die Hälfte der Tabellen der Datenbank. - Eine Einheit Test soll isoliert werden. - für jeden Test die DBUnit Datenbank wiederherstellen, um sie Nachteile getrennt hat: --- alle Tests laufen dauert Stunden (zumal die Anwendung wächst), so dass niemand läuft sie, so ständig brechen sie, so dass sie deaktiviert sind, so gibt es keine Tests, so dass Sie Anwendung voller Bugs ist. --- Erstellen einer halben Datenbank für jede Unit-Test ist eine große Instandhaltungsarbeiten, viel Schaffung der Arbeit, kann leicht ungültig werden (in Bezug auf die Validierung, welche Datenbank-Schema ist nicht unterstützen, siehe Hibernate Validator) und ussually hat eine schlechte Aufgabe der Realität entspricht.

Stattdessen Schreibintegrationstests mit DBUnit: - Ein DBUnit, das gleiche für alle Tests. Laden Sie es nur einmal (auch wenn Sie 500 Tests durchgeführt). - Wickeln Sie jeden Test in einer Transaktion und Rollback der Datenbank nach jedem Test. Die meisten Methoden verwenden Ausbreitung ohnehin erforderlich. Stellen Sie nur die Testdaten schmutzig (zurückgesetzt es in dem nächsten Test, ob es ein nächster Test ist) nur dann, wenn Ausbreitung requires_new ist. Füllen Sie die Datenbank mit Eckfällen -. Nicht häufige Fälle hinzuzufügen, als streng Ihre Geschäftsregeln zu testen benötigt, so ussually nur zwei gemeinsame Fälle (in die Lage seines test „one to many“). - schreiben zukunftssichere Tests: - Testen Sie die Anzahl der aktivierten Regeln oder die Anzahl der eingefügten Fakten. - Stattdessen Test, ob eine bestimmte eingefügte Tatsache ist in dem Ergebnis. Filtern Sie das Ergebnis auf einer bestimmten Eigenschaft auf X (unterschiedlich von dem gemeinsamen Wert dieser Eigenschaft) testen und die Anzahl der eingefügten Tatsachen mit dieser Eigenschaft auf X.

Warum nicht denselben Ansatz zu wählen, wie wir für Java-Code mit Modul- und Integrationstests haben? Unit-Test ist über mindestens Stück Code zu nehmen und testen alle möglichen usecases definieren Spezifikation. Mit Integration testet Ihr Ziel nicht alle möglichen Anwendungsfälle ist aber die Integration von mehreren Einheiten, dass die Arbeit zusammen. Machen Sie dasselbe mit den Regeln. Segregate Regeln von Unternehmen Sinn und Zweck. Einfachstes ‚Einheit unter dem Test‘ konnte Datei mit einzelnen oder hohe cohension Satz von Regeln und was für sie zu arbeiten (falls vorhanden) erforderlich, wie gemeinsamen dsl-Definitionsdatei und Entscheidungstabelle. Für Integrationstest können Sie sinnvolle Teilmenge oder alle Regeln des Systems übernehmen.

Mit diesem Ansatz werden Sie viele isolierten Unit-Tests haben, die erheblich belastet werden und wird nicht Unterstützung benötigen, wenn Sie neue Regeln hinzufügen, weil Sie mit Teilmenge von Eingangsdaten isoliert Satz von Geschäftsregeln haben werden jeweilige Business-Szenarien zu testen. Und Sie werden mit begrenzten Menge von gemeinsamen Eingangsdaten einige Integrationstests haben zu reproduzieren und zu testen ‚gemeinsame Szenarien‘. Das Hinzufügen von neuen Regeln zu Integrationstest wird Update Testausgabe erfordern und reflektiert, wie neue Regeln Auswirkungen gemeinsamer Datenfluss.

JUnit Testregel das gibt Ihnen die Möglichkeit zu Last Ressourcen in deklarativen Art und Weise und assert Regeln tatsächlich ausgelöst. Es wird innere Assertionsfehler bewahren und alle Regeln berichten Mismatch auslösenden dass Hinweise, die Ihnen über das, was auf einen Blick schief gelaufen ist. Logging gibt Aufschluss über Ursache-Wirkungs-Beziehungen zwischen den Ereignissen. Kompatibel mit SpringRunner.class für Frühjahr Integrationstests.

Beispiel:

@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());
    }
}

Siehe rules.drl
Mehr: https://github.com/droolsassert/droolsassert

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top