2009-10-29 7 views
16

Ich muss eine sehr große Testsuite für einen komplexen Satz von Geschäftsregeln schreiben, die derzeit in mehreren Tabellenformularen erfasst werden (z. B. wenn die Parameter XYZ so und so sind, sollte der Wert zwischen V1 und V2 liegen). Jede Regel hat einen Namen und eine eigene Semantik.Ist es möglich, JUnit-Testfälle und -Suiten programmgesteuert zu generieren?

Mein Endziel ist es, eine Testsuite zu haben, die in Sub-Test-Suites organisiert ist, mit einem Testfall für jede Regel.

Eine Option besteht darin, alle diese Regeln tatsächlich als Tests fest zu programmieren. Das ist hässlich, zeitaufwendig und unflexibel.

Eine weitere Möglichkeit besteht darin, ein Python-Skript zu schreiben, das die Regeldateien liest und Java-Klassen mit den Komponententests generiert. Ich würde das lieber vermeiden, wenn ich kann. Eine andere Variante wäre die Verwendung von Jython.

Idealerweise würde ich jedoch gerne eine Testsuite haben, die die Dateien lesen würde und dann Sub-Suites und Tests in ihnen definieren würde. Jeder dieser Tests kann mit bestimmten Werten aus den Tabellendateien initialisiert werden, feste Einstiegspunkte in unserem System ausführen und dann eine Validierungsfunktion für die Ergebnisse aufrufen, die auf dem erwarteten Wert basieren.

Gibt es einen vernünftigen Weg, dies nur mit Java zu tun?

Update: Ich habe unsere Regeln etwas vereinfacht. Einige von ihnen sind in der Tat tabellarisch (Excel-Stil), andere sind eher verschwommen. Die allgemeine Frage bleibt jedoch, da ich wahrscheinlich nicht die erste Person bin, die dieses Problem hat.

+0

Sehr interessiert, um darüber zu erfahren; Ich muss mehr über Testfälle erfahren. – I82Much

Antwort

17

In JUnit 4 möchten Sie sich die Parameterized runner ansehen. Es wurde für den von Ihnen beschriebenen Zweck erstellt (datengetriebene Tests). Es wird sie jedoch nicht in Suiten organisieren.

In Juni 3 können Sie TestSuites und Tests programmatisch erstellen. Die Antwort ist in Junit Recipes, die ich erweitern kann, wenn Sie es brauchen (denken Sie daran, dass JUnit 4 Junit 3 Tests ausführen kann).

8

Haben Sie darüber nachgedacht, FIT dafür zu verwenden?

Sie scheinen die Tabellen bereits bereit zu haben, und "Geschäftsregeln" klingt wie "Geschäftsleute schreiben sie mit Excel".

FIT ist ein System zum Überprüfen von Tests basierend auf Tabellen mit Eingabe-> erwartete Ausgabezuordnungen, und eine Open-Source-Java-Bibliothek zum Ausführen dieser Tests ist verfügbar.

+0

Auch gibt es Java-Treiber dafür. –

+0

Das war was ich sagen wollte; Ihr Fall klingt genau wie die Art von Ding, die passend war zu lösen; Ich empfehle Fitnesse (http://fitnesse.org), da dies die aktuellste und aktuellste Implementierung ist, die ich mir vorstellen kann. – Kevlar

+0

Danke. Ich bin vertraut mit FIT, aber war nicht vertraut mit den neuen Implementierungen; Ich werde sie überprüfen. Trotzdem frage ich mich, ob es eine programmatische Möglichkeit gibt, in JUnit zu bleiben. – Uri

1

Wir versuchten FIT und beschlossen, mit Concordion gehen. Die Hauptvorteile dieser Bibliothek sind:

  • die Tests neben der Code-Basis überprüft in (in eine Subversion Repository, zum Beispiel) werden können
  • sie durch einen Standard-JUnit runner ausgeführt
0

Ich habe mit JUnit etwas sehr ähnliches geschrieben. Ich hatte eine große Anzahl von Testfällen (30 Seiten) in einer XML-Datei. Anstatt zu versuchen, verschiedene Tests zu generieren, habe ich alles in einem einzigen Test gemacht, was gut funktioniert hat.

Mein Test sah etwa so aus:

void setup() { 
    cases = read in the xml file 
} 

void test_fn_works() { 
    for case in cases { 
    assert(case.expected_result, fn(case.inputs), 
     'Case ' + case.inputs + ' should yield ' + case.expected_result); 

    } 
} 

mit Ruby, ich habe genau das, was Sie saying-- Erzeugungstests im laufenden Betrieb sind.Dies in Java zu tun ist jedoch komplex und ich denke nicht, dass es sich lohnt, da es einen anderen, durchaus vernünftigen Ansatz gibt.

Hoffe, das hilft.