Frage

Ich habe eine Klasse ich Unit-Tests, die ziemlich umfangreichen Datenbank-Setup erfordern, bevor die einzelnen Testverfahren ausgeführt werden können. Dieses Setup dauert eine lange Zeit. Aus Gründen hoffentlich nicht relevant für die Frage auf der Hand, ich brauche die DB programmatisch statt aus einem SQL-Dump zu füllen

Das Problem, das ich habe, ist mit der tear-down. Wie kann ich alle vorgenommenen Änderungen in der db-Setup-Phase leicht Rollback?

Ich bin derzeit Hibernate + Feder Transactional Testing-Unterstützung, so dass meine individuellen Testmethoden eingewickelt werden in Transaktionen verwendet wird.

Eine Lösung wäre, den DB-Setup innerhalb der einzelnen Testverfahren zu tun, so dass der db-Setup automatisch aufgerollt werden würde zurück. Allerdings würden die Testmethoden für immer da jede Methode, um die Datenbank neu prep müßte ausgeführt werden.

Jede andere Ideen? Im Grunde genommen, ich suche nach einer Möglichkeit, meinen db-Setup laufen, laufen meine Einzeltests (jeweils in einer Transaktion gewickelt, die Rollback nach der Ausführung wird) und dann Rollback den anfänglichen db-Setup. Irgendwelche Ideen auf, so dass diese Arbeiten in einem Hibernate / Frühjahr / Junit Mode? Gibt es einen Ruhezustand „fallen alle Tabellen“ entsprechenden Befehl?

War es hilfreich?

Lösung

Sind Sie mit einem bestimmten Datenbank-Anbieter stecken? Wenn nicht, könnten Sie eine In-Memory-Datenbank verwenden, wie zum Beispiel HSQLDB . Wenn Sie mit den Tests fertig sind Sie nur den Zustand wegzuwerfen. Dies ist nur dann sinnvoll, wenn die Tabellen zu Beginn der Testsuite leer sein (vor Ihrer programmatischen Setup, das ist).

Sie müssen noch Tabellen erstellen, aber wenn alles fein säuberlich Hibernate abgebildet wird können Sie sich das hbm2ddl verwenden, um Ihre Tabellen zu erzeugen. Sie folgendes zu Ihrem Test Alles, was Sie tun müssen, ist hinzuzufügen Sitzung Fabrik Definition:

<session-factory>
    ...
    <property name="hibernate.hbm2ddl.auto">create</property>
    ...
</session-factory>

Wenn diese Lösung scheint anwendbar ich darauf erarbeiten kann.

Andere Tipps

Sie möchten bei @AfterClass Anmerkung suchen, für Junit 4. Diese Anmerkung wird ausgeführt, wenn die Tests durchgeführt werden.

http://cwiki.apache.org/DIRxDEV/junit4-primer.html

DNUnit sollten Sie in dieser Hinsicht helfen. Sie können für jeden einzelnen Testfall getrennte Datensätze erstellen, wenn Sie möchten.

DBUnit wird viel dabei helfen. Sie könnten theoretisch autocommits auf JDBC deaktivieren, aber es wird haarig. Die naheliegendste Lösung ist DBUnit zu verwenden, um Ihre Daten in einen bekannten Zustand zu setzen, bevor Sie die Tests ausführen. IF aus irgendeinem Grund Sie Ihre Daten zurück müssen, nachdem die Tests ausgeführt werden, können Sie bei @AfterClass auf eine Suite suchen, die alle Tests ausgeführt wird, aber es ist in der Regel eine bessere Praxis einzurichten Ihre Tests in Betracht gezogen und sie dann laufen, so dass, wenn der Test fehlschlägt, ist es nicht nur, weil es keine prestine Umgebung aufgrund eines Fehler zu bereinigen einen anderen Tests hat. Sie stellen sicher, dass jeder Test direkt seine Umgebung einrichtet.

Eine Lösung, die Sie vielleicht zu prüfen, ist eine „manuelle“ Rollback oder Kompensations Transaktion in db abreißen zu verwenden. Ich nehme an (und wenn es nicht, dann ist es sollte ein trivialer Add-on zu Ihrer Hibernate Entität sein) alle Entitäten Attribut Datetime erstellen anzeigt, wenn sie in die Tabelle eingefügt wurden. Ihre db-Setup-Methode sollte Zeit, bevor alles andere aufzeichnen. Dann haben Sie ziemlich einfaches Verfahren für db abzureißen alle Objekte zu löschen, die erstellt wurden, nachdem Zeit in db Setup recored.

Natürlich wird dies nicht für Updates in db-Setup arbeiten ... Aber wenn Sie Anzahl des Updates beschränkt haben, dann prüft für diese Art von Daten ursprüngliches Bild zu speichern und wiederherstellen während db abzureißen.

Wenn Sie mit relativ kleiner Datenbank arbeiten, und mit einem DBMS, das tun kann Backups / export es relativ schnell (wie MS SQL Server), können Sie erwägen, eine Datenbanksicherung zu schaffen, bevor die Tests, und dann wiederherstellen, wenn alle Tests abgeschlossen ist. Dies ermöglicht Ihnen, eine Entwicklung / Prüfung Datenbank einzurichten und verwenden Sie es als Ausgangszustand für alle Tests.

Ich habe es mit nativen JDBC, Ausführen ‚Backup-Datenbank‘ ‚‘ und ‚‘ Datenbank wiederherstellen ‚‘ T-SQL in-zwischen den Tests, und es funktionierte recht gut.

Allerdings ist dieser Ansatz abhängig von dem DBMS-Server (für eine vernünftige Geschwindigkeit) auf dem lokalen Computer mit, Sie ausreichende Berechtigungen haben (die als kein Problem sein soll), und die Gesamtgröße der Datenbank nicht ein paar Dutzende auf mehr als MB -. zumindest in meiner Erfahrung

Gibt es einen Grund, dass Sie eine Verbindung zur Datenbank haben, haben Sie Ihre Unit-Tests laufen zu lassen? Es klingt wie könnte es einfacher sein, Ihre Klasse, Refactoring, so dass Sie die Interaktion mit der Datenbank spotten können. Sie können Klassen verspotten (mit einigen Ausnahmen) sowie Schnittstellen mit EasyMock (www.easymock.org).

Wenn Ihre Klasse auf einem komplexen vorbestehenden Zustand in einer angeschlossenen Datenbank beruht, wäre es wahrscheinlich einfacher, schneller zu schreiben Durchführung von Tests mit Mocks. Wir wissen nicht, was die Größe des Projektes ist oder wie oft Ihre Tests ausgeführt werden, aber die Ausführungszeit könnte etwas sein, darüber nachzudenken, vor allem in einem großen Projekt.

Hibernate hat eine nette kleine Funktion, die stark unter dokumentiert und unbekannt ist. Sie können ein SQL-Skript während der Session Erstellung direkt nach der Datenbank-Schema Generation ausführen Daten in einer neuen Datenbank zu importieren. Sie müssen nur eine Datei hinzufügen in Ihrem Classpath root und setzen entweder erstellen oder erstellen Drop als hibernate.hbm2ddl.auto Eigenschaft namens import.sql.

http://in.relation.to/Bloggers/RotterdamJBugAndHibernatesImportsql

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