2008-09-06 5 views
8

Ich habe versucht, Unit-Tests zu implementieren und habe derzeit einige Codes, macht folgende:JUnit für Datenbank-Code

  1. Abfrage externe Datenbank, in einen Zuführtisch
  2. Abfrage eine Ansicht geladen, das ist ein Delta von meinem Feed und Daten Tabellen, die Aktualisierung Datentabelle Zuführtisch

meine Einheit Teststrategie ist dies zum Spiel:

Ich habe eine Testdatenbank, die ich frei manipulieren kann.

  1. im Setup-Programm(),
  2. mein Code ausführen, meine Prüfung db als Quelle verwenden
  3. die Datentabelle überprüfen, die Überprüfung für Zählungen und die Existenz/Nicht Existenz einige Daten in meinem Test db laden bestimmte Datensätze
  4. klaren Test db,
  5. wieder
  6. Laufcode in einem anderen Satz von Daten geladen
  7. inspiziert Datentabelle wieder

Offensichtlich habe ich die Datensätze, die ich in die Source-Datenbank laden, so dass ich weiß, dass bestimmte Datensätze hinzugefügt, gelöscht, aktualisiert werden, etc.

Es scheint wie dies ist ein bisschen umständlich und es sollte ein einfacher Weg? irgendwelche Vorschläge?

Antwort

8

Ist es Ihre Absicht, die Ansicht zu testen, die die Deltas generiert, oder zu testen, ob Ihr Code die Ansicht korrekt hinzufügt, löscht und aktualisiert?

Wenn Sie die Ansicht testen möchten, können Sie ein Tool wie DBUnit verwenden, um Ihre Feed- und Datentabellen mit verschiedenen Daten zu füllen, deren Delta Sie manuell berechnet haben. Dann würden Sie für jeden Test verifizieren, dass die Ansicht einen passenden Satz zurückgibt.

Wenn Sie testen möchten, wie Ihr Code auf von der Sicht erkannte Diffs reagiert, würde ich versuchen, den Zugriff auf die Datenbank zu vereinfachen. Ich stelle mir eine Java-Methode vor, zu der Sie eine Ergebnismenge (oder eine Liste von POJO/DTOs) übergeben können und eine Liste von Parametern, die Objektarrays (wieder oder POJOs) hinzugefügt werden sollen, zurückgibt. Andere Methoden würden die Diff-Liste für zu entfernende und zu aktualisierende Elemente analysieren. Sie könnten dann eine falsche Ergebnismenge oder Pojo's erstellen, diese an Ihren Code übergeben und überprüfen, ob die richtigen Parameter zurückgegeben wurden. Alles ohne eine Datenbank zu berühren.

Ich denke, der Schlüssel ist, Ihren Prozess in Teile zu brechen und jeden von ihnen so unabhängig wie möglich zu testen.

6

DbUnit wird Ihren Bedürfnissen entsprechen. Eine Sache, auf die Sie achten sollten, ist, dass sie SLF4J anstelle von JCL als Protokollierungsfassade verwenden. Sie können SLF4J so konfigurieren, dass die Protokollierung an JCL weitergeleitet wird, aber Sie werden gewarnt, wenn Maven DbUnit standardmäßig in ihrem Nop-Protokoll-Provider saugt, so dass Sie in letzter Zeit einen Ausschluss, I blogged, über diesen Konflikt verwenden müssen.

1

Ich benutze DbUnit, aber ich arbeite auch sehr hart, um nicht gegen die DB zu testen. Tests, die gegen die Datenbank laufen, sollten nur zum Testen der Datenbankschnittstelle existieren. So habe ich Mock-Db-Verbindungen, die ich die Daten für die Verwendung in allen anderen meiner Tests festlegen kann.

1

Wenn Sie Maven verwenden, ist eine Option, die sql-maven-plugin zu verwenden. Es ermöglicht Ihnen, Datenbankinitialisierungs-/Populationsskripts während des Maven-Build-Zyklus auszuführen.

1

Abgesehen von der bereits vorgeschlagenen DBUnit, möchten Sie vielleicht in Unitils suchen. Es verwendet DBUnit, bietet jedoch mehr als das (von der Site zu zitieren):

  • automatische Wartung von Datenbanken, mit Unterstützung für inkrementale, wiederholbare und Nachverarbeitung Skripte
  • automatisch Constraints deaktivieren und stellen Sequenzen ein Minimalwert
  • Unterstützung für Oracle, HSQLDB, MySQL, DB2, PostgreSQL, MsSql und Derby
  • Vereinfachen Testdatenbank Verbindungsaufbau
  • Einfaches Einfügen von Testdaten mit DBUnit * Führen Sie Tests in einer Transaktion
  • JPA Entity Manager Erstellung und Injektion für Hibernate, Toplink und * Hibernate Session Erstellung und Sitzung
  • automatisch die Zuordnung von JPA-Entitäten testen/Hibernate abgebildet Objekte mit der Datenbank