web-dev-qa-db-de.com

Datengetriebene Tests mit jUnit

Was verwenden Sie zum Schreiben datengesteuerter Tests in jUnit?

Ein (von mir definierter) datengesteuerter Test ist ein Test, der Daten aus einer externen Quelle (Datei, Datenbank, ...) liest, einen Test pro Zeile/Datei/was auch immer ausführt und die Ergebnisse in einem Testlauf als ob anzeigt Sie hatten separate Tests - das Ergebnis jedes Laufs wird separat angezeigt, nicht in einem großen Aggregat.

29
ripper234

In JUnit4 können Sie den Parametrisierten testrunner für datengetriebene Tests verwenden.

Es ist nicht besonders gut dokumentiert, aber die grundlegende Idee ist die Erstellung einer statischen Methode (kommentiert mit @Parameters), die eine Collection von Object-Arrays zurückgibt. Jedes dieser Arrays wird als Argument für den Testklassenkonstruktor verwendet. Anschließend können die üblichen Testmethoden mithilfe von Feldern ausgeführt werden, die im Konstruktor festgelegt sind.

Sie können Code schreiben, um eine externe Textdatei mit der @Parameters-Methode zu lesen und zu analysieren (oder Daten aus einer anderen externen Quelle abrufen). Anschließend können Sie neue Tests hinzufügen, indem Sie diese Datei bearbeiten, ohne die Tests neu zu kompilieren.

39
matt

Dies ist, wo TestNG mit seiner @ DataSource glänzt. Das ist ein Grund, warum ich es lieber als JUnit halte. Die anderen sind Abhängigkeiten und Parallelthreadtests.

9
duffymo

Ich verwende eine In-Memory-Datenbank wie hsqldb , so dass ich entweder die Datenbank mit einem "Produktionsstil" -Datensatz vorbelegen kann, oder ich kann mit einer leeren hsqldb-Datenbank beginnen und sie mit Zeilen füllen, die ich Ich muss meine Tests durchführen. Außerdem schreibe ich meine Tests mit JUnit und Mockito .

8
digiarnie

Ich verwende eine Kombination aus dbUnit , jMock und jUnit 4. Dann können Sie es als Suite oder separat ausführen

4
Bostone

Es empfiehlt sich, TestCase um eine "DataDrivenTestCase" zu erweitern, die Ihren Anforderungen entspricht. Hier ist ein Beispiel für die Arbeit: http://mrlalonde.blogspot.ca/2012/08/data-driven -tests-with-junit.html

Im Gegensatz zu parametrisierten Tests können Testfälle mit gutem Namen genannt werden.

3
Mathieu

Ich bin bei @ DroidIn.net, genau das tue ich aber, um Ihre Frage wörtlich zu beantworten "und zeigt die Ergebnisse in einem Testläufer an, als ob Sie separate Tests hätten", müssen Sie sich den JUnit4 Parametrisierten Läufer anschauen. DBUnit macht das nicht. Wenn Sie viel davon tun müssen, ist TestNG ehrlich gesagt flexibler, aber Sie können es in JUnit absolut schaffen.

Sie können sich auch den JUnit Theories-Läufer ansehen, aber ich erinnere mich daran, dass er für datengesteuerte Datensätze nicht besonders gut geeignet ist. Dies ist sinnvoll, da JUnit nicht mit großen Mengen externer Daten arbeitet.

1
Yishai

Obwohl dies ein ziemlich altes Thema ist, dachte ich immer noch daran, meinen Beitrag beizutragen. Ich glaube, dass JUnits Unterstützung für datengesteuertes Testen zu wenig und zu unfreundlich ist. zum Beispiel Um parametrisiert zu verwenden, müssen wir unseren Konstruktor schreiben. Mit Theories Runner haben wir keine Kontrolle über die Menge der Testdaten, die an die Testmethode übergeben werden.

Es gibt weitere Nachteile, die in dieser Blogpost-Serie aufgeführt sind: http://www.kumaranuj.com/2012/08/junits-parameterized-runner-and-data.html

Mit EasyTest gibt es jetzt eine umfassende Lösung, die sich aus JUnit zusammensetzt und den Benutzern viele Funktionen bietet. Das Hauptaugenmerk liegt darauf, datengesteuerte Tests mit JUnit durchzuführen, obwohl Sie nicht mehr auf JUnit angewiesen sein müssen. Hier ist das Github-Projekt für Refernece: https://github.com/anujgandharv/easytest

Wenn jemand daran interessiert ist, seine Gedanken/Code/Vorschläge einzubringen, dann ist es an der Zeit. Sie können einfach zum github-Repository gehen und Probleme erstellen.

1
Anuj

Einige Tests eignen sich für die Schnittstelle.

Wenn die Datenbank-/Datei-Lesevorgänge durch einen Schnittstellenaufruf abgerufen werden, holen Sie einfach Ihren Komponententest ein, um die Schnittstelle zu implementieren, und die Komponententestklasse kann die gewünschten Daten zurückgeben.

0
Fortyrunner

Wir haben derzeit eine Requisitendatei mit unseren ID-Nummern darin. Das ist schrecklich spröde, aber es ist leicht, etwas in Gang zu setzen. Unser Plan sieht vor, diese ID-Nummern zunächst mit -D-Eigenschaften in unseren Ant-Builds überschreiben zu lassen. 

Unsere Umgebung verwendet eine ältere Datenbank mit furchtbar verschlungenen Daten, die vor einem Lauf nicht geladen werden können (z. B. von dbUnit). Schließlich möchten wir zu dem Punkt gelangen, an dem ein Komponententest die Datenbank abfragen würde, um eine ID mit der zu testenden Eigenschaft zu finden, und dann diese ID im Komponententest verwenden. Dies wäre langsam und wird eher als Integrationstest bezeichnet, nicht als "Komponententest". Wir würden jedoch mit realen Daten testen, um zu vermeiden, dass unsere App perfekt mit Testdaten ausgeführt wird, die aber mit echten Daten nicht funktioniert.

0
Ed Griebel

Normalerweise verwenden datengesteuerte Tests eine kleine überprüfbare Komponente, um die Daten zu verarbeiten. (Dateileseobjekt oder Mock-Objekte) Bei Datenbanken und Ressourcen außerhalb der Anwendung werden Mocks verwendet, um andere Systeme zu simulieren. (Webservices und Datenbanken usw.). Normalerweise sehe ich, dass es externe Dateien gibt, die die Daten und die Ausgabe verarbeiten. Auf diese Weise kann die Datendatei zum VCS hinzugefügt werden. 

0
monksy