2012-06-28 14 views
9

Ich sammle Daten und speichern diese Daten in einer MySQL-Datenbank mit Hilfe von Java verwendet. Außerdem verwende ich Maven zum Erstellen des Projekts, TestNG als Testframework und Spring-Jdbc für den Zugriff auf die Datenbank. Ich habe eine DAO-Ebene implementiert, die den Zugriff auf die Datenbank kapselt. Neben dem Hinzufügen von Daten unter Verwendung der DAO-Klassen möchte ich einige Abfragen ausführen, die die Daten aggregieren und die Ergebnisse in einigen anderen Tabellen speichern (wie materialisierte Ansichten).Was ist der geeignete Weg, um Code zu testen, die MySQL-spezifische Anfragen intern

Nun würde Ich mag einige Testfälle schreiben, die prüfen, ob die DAO-Klassen arbeiten, wie sie sollten. Daher dachte ich über die Verwendung einer In-Memory-Datenbank nach, die mit einigen Testdaten bestückt wird. Da ich auch MySQL-spezifische SQL-Abfragen unter Verwendung von Daten zum Aggregieren, ging ich in einige Schwierigkeiten:

  1. Erstens, ich habe gedacht, einfach mit der eingebetteten Datenbank-Funktionalität von Spring-Jdbc bereitgestellt eine eingebettete Datenbank zu instanziiert . Ich habe mich entschieden, die H2-Implementierung zu verwenden. Dort geriet ich wegen der Aggregationsabfragen in Schwierigkeiten, die MySQL-spezifischen Inhalt verwenden (z. B. Zeitmanipulationsfunktionen wie DATE()). Ein weiterer Nachteil dieses Ansatzes ist, dass ich zwei ddl-Dateien pflegen muss - die eigentliche ddl-Datei, die die Tabellen in MySQL definiert (hier definiere ich die Codierung und füge Kommentare zu Tabellen und Spalten hinzu, beide Funktionen sind MySQL-spezifisch); und die Testddl-Datei, die dieselben Tabellen aber ohne Kommentare usw. definiert, da H2 keine Kommentare unterstützt.
  2. Ich habe eine Beschreibung für den Einsatz von MySQL als eingebettete Datenbank gefunden, die ich in den Testfällen verwenden (http://literatitech.blogspot.de/2011/04/embedded-mysql-server-for-junit-testing .html). Das klang für mich sehr vielversprechend. Leider hat es nicht funktioniert: Eine MissingResourceExcpetion ist aufgetreten "Ressource '5-0-21/Linux-amd64/mysqld' nicht gefunden". Es scheint, dass der Treiber den Datenbank-Daemon auf meinem lokalen Rechner nicht finden kann. Aber ich weiß nicht, wonach ich suchen muss, um eine Lösung für dieses Problem zu finden.
  3. Jetzt bin ich ein bisschen fest und ich frage mich, ob ich die Architektur anders hätte erstellen sollen. Hat jemand ein paar Tipps, wie ich ein entsprechendes System aufbauen soll? Ich habe zwei andere Optionen im Sinn:

  4. Anstatt eine eingebettete Datenbank zu verwenden, werde ich mit einer nativen MySQL-Instanz gehen und eine Datenbank einrichten, die nur für die Testfälle verwendet wird. Diese Option klingt langsam. Eigentlich möchte ich später einen CI-Server einrichten, und ich dachte, dass die Verwendung einer eingebetteten Datenbank besser geeignet wäre, da der Test schneller läuft.
  5. ich löschen Sie alle MySQL-spezifische Sachen aus der SQL-Abfragen und verwenden H2 als eingebettete Datenbank für die Prüfung. Wenn diese Option die richtige ist, müsste ich eine andere Möglichkeit finden, die SQL-Abfragen zu testen, die die Daten in materialisierten Ansichten aggregieren.
  6. Oder gibt es eine dritte Option, die ich im Sinn haben, nicht wahr?

würde ich irgendwelche Hinweise zu schätzen wissen.

Danke, XComp

Antwort

2

Wenn es nicht möglich, erhält die In-Memory-Datenbank MySQL Ich schlage vor, mit der H2-Datenbank für die „einfache“ und testet eine dedizierte MySQL-Instanz zu testen, um zu arbeiten, ist MySQL- spezifische Abfragen.

Zusätzlich können die Tests für die echte MySQL-Datenbank als Integrationstests in einem separaten Maven-Profil konfiguriert werden, so dass sie nicht zum regulären Maven-Build gehören. Auf dem CI-Server können Sie einen zusätzlichen Job erstellen, der die MySQL-Tests regelmäßig ausführt, z. täglich oder alle paar Stunden.Mit einem solchen Setup können Sie Ihre produktspezifischen Abfragen beibehalten und testen, während Ihr regulärer Build nicht langsamer wird. Sie können auch einen normalen Build ausführen, selbst wenn die Testdatenbank nicht verfügbar ist.

Es gibt ein nettes Maven-Plugin für Integrationstests namens maven-failsafe-plugin. Es bietet Pre- und Post-Integration-Testschritte, mit denen Sie die Testdaten vor den Tests einrichten und die Datenbank nach den Tests bereinigen können.

8

Ich habe Maven Plugin genau für diesen Zweck erstellt: jcabi-mysql-maven-plugin. Es startet einen lokalen MySQL-Server auf pre-integration-test Phase und schließt es auf post-integration-test.