Frage

Ich habe eine Anwendung, wo viele „Einheit“ Tests eine echte Verbindung zu einer Oracle-Datenbank verwenden, während ihrer Ausführung.

Wie Sie sich vorstellen können, diese Tests zu viel Zeit in Anspruch nehmen ausgeführt werden, da sie einige Frühling Kontexte initialisieren müssen, und kommunizieren mit dem Oracle-Instanz. Zusätzlich zu, dass haben wir komplexe Mechanismen, wie Transaktionen zu verwalten, um zu vermeiden, Datenbankänderungen nach der Testausführung (auch wenn wir nützliche Klassen von Spring wie AbstractAnnotationAwareTransactionalTests verwenden).

Also meine Idee, diese Oracle-Test-Instanz durch eine In-Memory-Datenbank schrittweise zu ersetzen ist. Ich verwende hsqldb oder vielleicht besser h2 .

Meine Frage ist, zu wissen, was der beste Ansatz ist, das zu tun. Mein Hauptanliegen ist im Zusammenhang mit dem Bau der In-Memory-Datenbankstruktur und Einfügen von Referenzdaten.

Natürlich kann ich die Datenbankstruktur von Oracle extrahieren, einige Werkzeuge wie SQL Developer oder TOAD verwenden und dann diese Skripte modifizieren sie an die hsqldb oder h2 Sprache anzupassen. Aber ich glaube nicht, das ist der bessere Ansatz.


In der Tat, ich habe bereits, dass an einem anderen Projekt mit hsqldb, aber ich habe manuell alle Skripte geschrieben Tabellen zu erstellen. Zum Glück hatte ich nur wenige Tabellen zu erstellen. Mein Hauptproblem bei diesem Schritt war zu „übersetzen“, um das Oracle-Skripte verwendete Tabellen in die hsqldb Sprache zu erstellen.

Zum Beispiel kann eine Tabelle in Oracle mit dem folgenden SQL-Befehl erstellt:

CREATE TABLE FOOBAR (
    SOME_ID NUMBER,
    SOME_DATE DATE, -- Add primary key constraint
    SOME_STATUS NUMBER,
    SOME_FLAG NUMBER(1) DEFAULT 0 NOT NULL);

needed "übersetzt" für hsqldb werden:

CREATE TABLE FOOBAR (
    SOME_ID NUMERIC,
    SOME_DATE TIMESTAMP PRIMARY KEY,
    SOME_STATUS NUMERIC,
    SOME_FLAG INTEGER DEFAULT 0 NOT NULL);

In meinem aktuellen Projekt, es gibt zu viele Tabellen, die manuell zu tun ...


So meine Fragen:

  • Was sind die Ratschläge können Sie mir geben, um das zu erreichen?
  • Does h2 oder hsqldb bietet einige Werkzeuge, um ihre Skripte aus einer Oracle-Verbindung zu erzeugen?

Technische Informationen

Java 1.6, Spring 2.5, Oracle 10.g, Maven 2


Bearbeiten

Einige Informationen in Bezug auf meinen Unit-Tests:

In der Anwendung, wo ich hsqldb verwendet, hatte ich die folgenden Tests: - Einige „basic“ Unit-Tests, die nichts mit der DB zu tun haben. - Für DAO-Tests verwendete ich hsqldb Datenbank-Manipulationen, wie CRUD auszuführen. - Dann auf der Dienstschicht, benutzen ich meine Mockito DAO-Objekte zu verspotten, um Fokus auf dem Service-Test und nicht die ganzen Anwendungen (d Service + dao + DB)

.

In meiner aktuellen Anwendung haben wir das schlimmste Szenario: Die DAO-Schicht-Tests benötigen eine Oracle-Verbindung ausgeführt werden. Die Dienstschicht hat nicht Verwendung (noch) jeder Mock-Objekte, die DAO zu simulieren. So Dienste Tests auch benötigt eine Oracle-Verbindung.

Ich bin mir bewusst, dass Mocks und In-Memory-Datenbank sind zwei Punkte trennt, und ich werde sie so schnell wie möglich ansprechen. Allerdings ist mein erster Schritt ist es, versuchen , um die Oracle-Verbindung durch eine In-Memory-Datenbank zu entfernen, und dann werde ich meine Mockito Kenntnisse verwenden, um die Tests zu verbessern.

Beachten Sie, dass ich möchte auch separate Einheit Tests von Integrationstests. Letzteres wird einen Zugriff auf die Oracle-Datenbank benötigen, auszuführen „echte“ Tests, aber meine größte Sorge (und dies ist der Zweck dieser Frage) ist, dass fast alle meine Unit-Tests sind heute nicht in Isolation führen.

War es hilfreich?

Lösung

Verwenden Sie eine In-Memory / Java-Datenbank zum Testen. Dies wird die Tests sind näher an der realen Welt als sicher, wenn Sie versuchen, zu ‚abstrahieren‘ die Datenbank in Ihrem Test. Wahrscheinlich sind solche Tests auch einfacher zu schreiben und zu pflegen. Auf der anderen Seite, was Sie wahrscheinlich tun wollen ‚abstrahieren‘ in Ihren Tests ist die Benutzeroberfläche, da UI-Tests in der Regel schwer zu automatisieren.

Die Oracle-Syntax Sie funktioniert gut mit der H2-Datenbank geschrieben (ich es gerade getestet), so scheint es, H2 die Oracle-Syntax besser als HSQLDB unterstützt. Disclaimer: Ich bin einer der Autoren von H2. Wenn etwas nicht funktioniert, wenden Sie sich bitte per Post auf der H2-Mailing-Liste.

Sie sollten auf jeden Fall die DDL-Anweisungen haben für die Datenbank in Ihrem Versionskontrollsystem. Sie können auch diese Skripte zum Testen verwenden. Möglicherweise müssen Sie auch mehrere Schemaversionen unterstützen - in diesem Fall, dass Sie Versions-Update-Skripte (alte table ...) schreiben können. Mit einer Java-Datenbank können Sie diese ebenfalls testen.

Durch die Art und Weise, Sie müssen nicht unbedingt den In-Memory-Modus verwenden, wenn H2 oder HSQLDB verwenden. Beide Datenbanken sind schnell, auch wenn Sie die Daten bestehen bleiben. Und sie sind einfach zu installieren (nur eine JAR-Datei) und benötigen viel weniger Speicher als Oracle.

Andere Tipps

Aktuelle HSQLDB 2.0.1 unterstützt Oracle-Syntax für DUAL, ROWNUM, NEXTVAL und CURRVAL über eine Syntax Kompatibilitätsflag, = sql.syntax_ora wahr. In der gleichen Weise, Verkettung einer Zeichenfolge mit einer NULL-Zeichenfolge und Einschränkungen auf NULL in UNIQUE-Einschränkungen wird mit anderen Flags behandelt. Die meisten ORACLE Funktionen wie TO_CHAR, TO_DATE, NVL usw. sind bereits eingebaut.

Im Moment einfach ORACLE-Typen verwendet werden, wie NUMBER können Sie eine Typdefinition verwenden:

CREATE TYPE NUMBER AS NUMERIC

Der nächste Schnappschuß ermöglicht Anzahl (N) und andere Aspekte der ORACLE-Typ-Kompatibilität, wenn das Flag gesetzt ist.

Download von http://hsqldb.org/support/

[Update:] Der Snapshot am 4. Oktober ausgegeben übersetzt die meisten Oracle bestimmte Typen zu ANSI SQL-Typen. 2.0 HSQLDB unterstützt auch die ANSI SQL INTERVAL Art und Datum / Zeitstempel Arithmetik der gleichen Weise wie Oracle.

Was sind Ihre Unit-Tests für? Wenn sie das ordnungsgemäße Funktionieren von DDLs testen und Stored Procedures, dann sollten Sie die Tests „näher“ an Oracle schreiben:. Entweder ohne Java-Code oder ohne Frühling und anderen netten Web-Schnittstellen an alle auf dem db Fokussierung

Wenn Sie die Anwendungslogik in Java und Spring implementiert testen, dann können Sie Mock-Objekte / Datenbankverbindung verwenden, um Ihre Tests unabhängig von der Datenbank zu machen.

Wenn Sie die Arbeit als Ganzes testen wollen (was gegen die modulare Entwicklung und Testprinzip), dann können Sie Ihre Datenbank und Test auf diese Instanz virtualisieren, ohne das Risiko, dass einige böse irreversible Veränderungen zu tun.

Solange die Tests nach sich aufzuräumen (wie Sie bereits scheinen zu wissen, wie einzurichten), gibt es nichts falsch mit Tests gegen einen realen Datenbankinstanz ausgeführt wird. In der Tat ist es der Ansatz in der Regel ziehe ich es, weil Sie etwas so nah an der Produktion wie möglich testen werde.

Die Inkompatibilitäten scheinen klein, aber wirklich wieder nicht so lange danach beißt am Ende. In einem guten Fall kann erhalten Sie mit irgendwelchen fiesen sql Übersetzung / umfangreichen Spott weg. In schlimmen Fällen Teile des Systems zu testen einfach unmöglich sein, was ich denke, ist ein inakzeptables Risiko für geschäftskritische Systeme.

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