Ho un'applicazione in cui molti "unità" test utilizzano una connessione reale a un database Oracle durante la loro esecuzione.Creare una struttura di database in memoria da un'istanza Oracle
Come potete immaginare, questi test impiegano troppo tempo per essere eseguiti, poiché devono inizializzare alcuni contesti Spring e comunicare con l'istanza Oracle. Oltre a questo, dobbiamo gestire meccanismi complessi, come le transazioni, al fine di evitare modifiche al database dopo l'esecuzione del test (anche se usiamo classi utili da Spring come AbstractAnnotationAwareTransactionalTests
).
Quindi la mia idea è di sostituire progressivamente questa istanza di test Oracle da un database in memoria. Userò hsqldb
o forse meglio h2
.
La mia domanda è sapere qual è l'approccio migliore per farlo. La mia preoccupazione principale è legata alla costruzione della struttura del database in memoria e all'inserimento dei dati di riferimento.
Naturalmente, posso estrarre la struttura del database da Oracle, utilizzando alcuni strumenti come SQL Developer
o TOAD
, e quindi modificare questi script per adattarli alla lingua hsqldb
o h2
. Ma non penso che sia l'approccio migliore.
In realtà, ho già fatto su un altro progetto che utilizza hsqldb
, ma mi hanno scritto manualmente tutti gli script per creare le tabelle. Fortunatamente, avevo solo poche tabelle da creare. Il mio problema principale durante questo passaggio è stato quello di "tradurre" gli script Oracle utilizzati per creare tabelle nella lingua hsqldb
.
Ad esempio, una tabella creata in Oracle utilizzando il seguente comando SQL:
CREATE TABLE FOOBAR (
SOME_ID NUMBER,
SOME_DATE DATE, -- Add primary key constraint
SOME_STATUS NUMBER,
SOME_FLAG NUMBER(1) DEFAULT 0 NOT NULL);
aveva bisogno di essere "tradotto" per hsqldb
a:
CREATE TABLE FOOBAR (
SOME_ID NUMERIC,
SOME_DATE TIMESTAMP PRIMARY KEY,
SOME_STATUS NUMERIC,
SOME_FLAG INTEGER DEFAULT 0 NOT NULL);
Nel mio progetto attuale, ci sono anche molte tabelle per farlo manualmente ...
Quindi le mie domande:
- Quali sono i consigli che puoi darmi per raggiungere questo obiettivo?
h2
ohsqldb
forniscono alcuni strumenti per generare i propri script da una connessione Oracle?
informazioni tecniche
Java 1.6, Primavera 2.5, Oracle 10.g, Maven 2
Modifica
Alcune informazioni riguardanti mio test di unità:
Nell'applicazione in cui ho usato hsqldb
, ho avuto le seguenti prove: - Alcune unità di "base" test, che non hanno nulla a che fare con DB. - Per il test DAO, ho usato hsqldb
per eseguire manipolazioni del database, come CRUD. - Poi, sul livello di servizio, ho usato Mockito
per deridere i miei oggetti DAO, al fine di concentrarmi sul test di servizio e non sulle intere applicazioni (cioè servizio + dao + DB).
Nella mia attuale applicazione, abbiamo lo scenario peggiore: i test di livello DAO richiedono l'esecuzione di una connessione Oracle. Il livello di servizi fa non usa (ancora) qualsiasi oggetto fittizio per simulare il DAO. Quindi i test di servizio anche richiedono una connessione Oracle.
Sono consapevole del fatto che i mock e il database in memoria sono due punti di separazione, e li affronterò il prima possibile. Tuttavia, il mio primo passo è provare per rimuovere la connessione Oracle da un database in memoria, e quindi userò le mie conoscenze Mockito
per migliorare i test.
Nota che voglio anche separare i test di unità dai test di integrazione. Quest'ultimo avrà bisogno di un accesso al database Oracle, per eseguire test "reali", ma la mia preoccupazione principale (e questo è lo scopo di questa domanda) è che quasi tutti i miei test unitari non vengono eseguiti in isolamento oggi.
Dato che il codice DAO sembra strettamente accoppiato a Oracle e il DAO non può essere estratto, questo sembra l'approccio migliore, anche se si spera che il codice DAO non si basi su alcuna peculiarità di Oracle. Meglio sbrogliare i DAO al più presto ... –