# Unit-Tests bei Datenbankänderungen



## sutcha (26. Jan 2010)

Hallo,


ich stehe vor folgendem Problem:

diverse Java-Anwendungen greifen auf eine DB zu. Diese Anwendungen teste ich mit JUnit auf Funktion, dabei vergleiche ich aber auch die Ergebnisse. Wenn ich also etwas ändere, was das Ergebnis nicht beeinflussen soll, dann sollte nach der Änderung der Test weiterhin durchlaufen. Für das Testen verwende ich eine andere DB als für das produktive System.
Jetzt lösche ich aber Felder in der Datenbank oder benenne sie um. Teilweise manipuliere ich die Test-DB auch. Welche Test-Frameworks könnt ihr mir empfehlen, die einen Snapshot machen, den man aber manuell anpassen kann (Feld-Änderungen)? Es handelt sich dabei um ein DWH.


Viele Grüße


----------



## maki (26. Jan 2010)

DBUnit

Ist aber immer noch Arbeit imho.


----------



## sutcha (26. Jan 2010)

Du hast aber keine persönlichen Erfahrungen damit gemacht oder?

ich schau mir gerade benerator, DBUnit und DDTUnit an.


----------



## maki (26. Jan 2010)

Doch, mit DBUnit hab ich Erfahrung.

Hat ein paar Eingenheiten, zB. die erste Row in der XML Datei muss alle (!) Felder enthalten, sonst wundert man sich 

Wenn du Fragen hast schiess los.


----------



## sutcha (26. Jan 2010)

Zur Eigenheit mit den Feldern in der ersten Reihe der XML-Datei: bedeutet das, dass ich leere Felder manuell ergänzen muss?

Ich bau mir also einen Extractor, der quasi einen Snapshot erstellt. Dieser wird dann in XML-Dateien geschrieben. Wie wird dann auf die unterschiedlichen XML-Dateien zugegriffen? Ich würde pro Tabelle eine XML-Datei erstellen.

Im Testcase verwende ich dann eine DB-Connection, die auf die XML-Dateien zugreift. Klingt ja eigentlich nicht nach so viel Aufwand 

Mein Wunsch-Framework wäre folgendes: ich starte meine JUnit-Tests und ein Proxy, der vor dem DB-Treiber hängt, schreibt zu den Abfragen entsprechend die Ergebnisse in eine externe Datei. Wenn ich dann den Test durchführen will, greift der Proxy nichtmehr auf die DB sondern auf die erstellten Dateien zu. Auf diese Weise wird für identische Daten garantiert, nur mit der Änderung von Feldern wird es wieder schwierig.


----------



## maki (26. Jan 2010)

> Zur Eigenheit mit den Feldern in der ersten Reihe der XML-Datei: bedeutet das, dass ich leere Felder manuell ergänzen muss?


u.U. ja.



> Ich bau mir also einen Extractor, der quasi einen Snapshot erstellt. Dieser wird dann in XML-Dateien geschrieben. Wie wird dann auf die unterschiedlichen XML-Dateien zugegriffen? Ich würde pro Tabelle eine XML-Datei erstellen.


Das kann DBUnit schon.
Kannst dir ja mal die Tutorials auf der DBUnit Seite ansehen.



> Im Testcase verwende ich dann eine DB-Connection, die auf die XML-Dateien zugreift. Klingt ja eigentlich nicht nach so viel Aufwand


DBUnit kann dir die XML Dateien in die DB einspielen, sogar unterschiedlich, refresh-update, delete-insert, usw..



> Mein Wunsch-Framework wäre folgendes: ich starte meine JUnit-Tests und ein Proxy, der vor dem DB-Treiber hängt, schreibt zu den Abfragen entsprechend die Ergebnisse in eine externe Datei. Wenn ich dann den Test durchführen will, greift der Proxy nichtmehr auf die DB sondern auf die erstellten Dateien zu. Auf diese Weise wird für identische Daten garantiert, nur mit der Änderung von Feldern wird es wieder schwierig.


Würde dir empfehlen dir mal DBUnit genauer anzusehen, bietet die Funktionalität ohne Proxy 

Nachtrag:
Lesenswert: Back Door Manipulation at XUnitPatterns.com


----------



## sutcha (26. Jan 2010)

Super, vielen Dank für deine Hilfe  das Tutorial, eigentlich nur ein HowTo, habe ich mir schon angeschaut. Werde mich noch ein bisschen einlesen und dann anfangen


----------



## sutcha (26. Jan 2010)

Eine Frage habe ich noch: das erstellen des Datasets in einer XML geht nur, indem man bestimmte Tabellen vorgibt, die er sich dann läd? Eine schönere Lösung gibt es nicht? Also quasi nur die Daten zu holen, die ich auch wirklich brauche?


----------



## maki (26. Jan 2010)

DbUnit - Frequently Asked Questions

Da findest du Beispiele für einzelne Rows aus Tabellen, ganze Tabellen, und die ganze DB.


----------



## sutcha (26. Jan 2010)

Ja, das benutze ich momentan. Ist nur ein bisschen umständlich, weil ich nicht genau weiß, was ich alles brauche. Alles zu laden wäre zu viel und mit Einschränkungen wird es sehr schwierig. Es sind ca. 30-50 Tabellen


----------



## maki (26. Jan 2010)

Naja, wenn du nicht weisst was du brauchst, woher soll es denn dann DBUnit wissen?


----------



## sutcha (26. Jan 2010)

Naja, das war ja meine Überlegung mit dem Proxy  ich lass den Test einmal auf die DB laufen und hab dann die Daten, die ich brauche. Der Proxy weiß ja, welche Daten ich aus der DB geladen habe und erstellt mir dann ein Dataset.


----------



## Hannes23 (4. Feb 2010)

Jetzt muss ich mal ganz blöd fragen: Kann ich mit DBUnit auch vor Ausführung meiner JUnit-Testfälle die komplette (in meinem Fall MySQL-)Datenbank exportieren und nach Durchführung der Tests wieder restoren? (oder ist vielleicht genau das DIE Aufgabe von DBUnit?)


----------



## maki (4. Feb 2010)

Ja, kannst du.
Aber das geht auch ohne DBUnit (zB mit reinem JDBC + SQL Skripten), DBUnit kann mehr


----------

