Ich habe eine Anwendung, wo viele "Einheit" Tests eine echte Verbindung zu einer Oracle-Datenbank während ihrer Ausführung verwenden.Erstellen einer In-Memory-Datenbankstruktur aus einer Oracle-Instanz
Wie Sie sich vorstellen können, benötigen diese Tests zu viel Zeit, um ausgeführt zu werden, da sie einige Spring-Kontexte initialisieren und mit der Oracle-Instanz kommunizieren müssen. Darüber hinaus müssen wir komplexe Mechanismen wie Transaktionen verwalten, um Datenbankänderungen nach der Testausführung zu vermeiden (selbst wenn wir nützliche Klassen von Spring wie AbstractAnnotationAwareTransactionalTests
verwenden).
Also meine Idee ist, diese Oracle-Test-Instanz schrittweise durch eine In-Memory-Datenbank zu ersetzen. Ich werde oder vielleicht besser h2
verwenden.
Meine Frage ist zu wissen, was der beste Ansatz ist, um das zu tun. Mein Hauptanliegen betrifft den Aufbau der In-Memory-Datenbankstruktur und das Einfügen von Referenzdaten.
Natürlich kann ich die Datenbankstruktur von Oracle extrahieren, verwenden einige Werkzeuge wie SQL Developer
oder TOAD
, und dann diese Skripte modifizieren sie an die hsqldb
oder h2
Sprache anzupassen. Aber ich denke nicht, dass das der bessere Ansatz ist.
In der Tat, ich habe bereits, dass an einem anderen Projekt hsqldb
, aber ich habe manuell alle Skripte geschrieben Tabellen zu erstellen. Glücklicherweise hatte ich nur wenige Tabellen zu erstellen. Mein Hauptproblem während dieses Schrittes war das "Übersetzen" der Oracle-Skripte, die zum Erstellen von Tabellen verwendet wurden, in die Sprache hsqldb
.
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);
benötigt "ü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 gibt es auch viele Tabellen, um das manuell zu tun ...
Also meine Fragen:
- Was sind die Ratschläge können Sie mir geben, das zu erreichen?
- Bietet
h2
oderhsqldb
einige Tools zum Generieren ihrer Skripts von einer Oracle-Verbindung?
Technische Informationen
Java 1.6, Spring 2.5, 10 Oracle.g, Maven 2
bearbeiten
Einige Informationen in Bezug auf meine Unit-Tests:
In der Anwendung, wo ich hsqldb
verwendet, hatte ich die folgenden Tests: - Some "basic" Einheit Tests, die nichts mit DB zu tun haben. - Für DAO-Tests habe ich hsqldb
verwendet, um Datenbankmanipulationen wie CRUD auszuführen. - Dann, auf der Service-Schicht, habe ich Mockito
verwendet, um meine DAO-Objekte zu verspotten, um sich auf den Service-Test und nicht die ganzen Anwendungen (d. H. Service + dao + DB) zu konzentrieren.
In meiner aktuellen Anwendung haben wir das schlimmste Szenario: Die DAO-Layer-Tests müssen eine Oracle-Verbindung ausgeführt werden. Die Dienstebene verwendet nicht (noch) beliebige Mock-Objekte, um das DAO zu simulieren. So Dienste Tests auch benötigen eine Oracle-Verbindung.
Ich bin mir bewusst, dass Mocks und In-Memory-Datenbank zwei getrennte Punkte sind, und ich werde sie so schnell wie möglich ansprechen. Mein erster Schritt ist jedoch, versuchen, 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 Unit-Tests auch von Integrationstests trennen möchte. Letzteres benötigt einen Zugriff auf die Oracle-Datenbank, um "echte" Tests durchzuführen, aber mein Hauptanliegen (und das ist der Zweck dieser Frage) ist, dass fast alle meine Unit-Tests heute nicht isoliert ausgeführt werden.
Da der DAO-Code eng mit Oracle gekoppelt ist und die DAO nicht abstrahiert werden kann, scheint dies der beste Ansatz zu sein - obwohl der DAO-Code hoffentlich nicht auf irgendwelche Oracle-Besonderheiten angewiesen ist. Am besten, die DAOs so schnell wie möglich zu abstrahieren ... –