Domanda

Ho una domanda in cui molti "unità" test utilizzare un vero e proprio collegamento a un database Oracle durante la loro esecuzione.

Come potete immaginare, questi test prendono troppo tempo per essere eseguita, in quanto hanno bisogno per inizializzare alcuni contesti di primavera, e comunicare al l'istanza Oracle. In aggiunta a ciò, dobbiamo gestire meccanismi complessi, come le transazioni, al fine di evitare modifiche del database dopo l'esecuzione del test (anche se usiamo classi siti da Spring come AbstractAnnotationAwareTransactionalTests).

Quindi la mia idea è quella di sostituire progressivamente questo caso di prova di 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 in memoria del database e l'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 io non credo che sia l'approccio migliore.


In realtà, ho già fatto su un altro progetto che utilizza hsqldb, ma ho scritto manualmente tutti gli script per creare le tabelle. Per fortuna, ho avuto solo pochi tavoli per creare. Il mio problema principale in questa fase è stato quello di "tradurre" gli script Oracle utilizzati per creare le 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);

necessarie per essere "tradotta" 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 troppi tavoli per farlo manualmente ...


Così le mie domande:

  • Quali sono i consigli che si possono darmi per conseguire tale?
  • non h2 o hsqldb fornire alcuni strumenti per generare i loro script da una connessione Oracle?

Le informazioni tecniche

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


Modifica

Alcune informazioni riguardanti mio test di unità:

Nella domanda in cui ho usato hsqldb, ho avuto le seguenti prove: - Alcuni test di unità "di base", che non hanno niente a che fare con DB. - Per il test DAO, ho usato hsqldb di eseguire manipolazioni database, ad esempio CRUD. - Poi, il livello di servizio, che ho usato Mockito prendere in giro i miei oggetti DAO, al fine di concentrarsi sulla prova di servizio e non l'intero applicazioni (vale a dire il servizio + dao + DB)

.

Nella mia domanda attuale, abbiamo lo scenario peggiore: I test strato DAO hanno bisogno di una connessione Oracle per essere eseguito. Lo strato di servizi fa non l'uso (ancora) alcun finto oggetti per simulare il DAO. Così test servizi anche hanno bisogno di una connessione Oracle.

Sono consapevole che prende in giro e database in memoria sono due punti separa, e io li affrontare al più presto possibile. Tuttavia, il mio primo passo è quello di cercare per rimuovere la connessione Oracle da un database in memoria, e poi userò le mie conoscenze Mockito per migliorare i test.

Si noti che voglio anche a test di unità separate dai test di integrazione. Quest'ultimo avrà bisogno di un accesso al database Oracle, per eseguire i test "reali", ma la mia preoccupazione principale (e questo è lo scopo di questa domanda) è che quasi tutti i miei test di unità non è gestita in modo isolato oggi.

È stato utile?

Soluzione

Usa un in-memory / Java database per il test. Ciò garantirà i test sono più vicino al mondo reale che se si tenta di 'via astratta' il database nel tuo test. Probabilmente tali prove sono anche più facili da scrivere e mantenere. D'altra parte, quello che probabilmente si vuole 'via astratta' nei test è l'interfaccia utente, perché il test dell'interfaccia utente è solitamente difficili da automatizzare.

La sintassi Oracle che hai postato funziona bene con il database H2 (ho appena provato), così sembra H2 supporta la sintassi Oracle meglio di HSQLDB. Disclaimer: io sono uno degli H2 autori. Se qualcosa non funziona, si prega di postare sulla mailing list H2.

Si dovrebbe comunque avere le istruzioni DDL per il database nel vostro sistema di controllo versione. È possibile utilizzare questi script per il test pure. Forse è anche necessario supportare più versioni dello schema - in questo caso si potrebbe scrivere gli script di versione di aggiornamento (ALTER TABLE ...). Con un database Java è possibile testare quelli pure.

A proposito, voi non necessariamente bisogno di utilizzare la modalità in memoria quando si utilizza H2 o HSQLDB. Entrambi i database sono veloci, anche se persistono i dati. E sono facili da installare (solo un file jar) e hanno bisogno di molta meno memoria rispetto a Oracle.

Altri suggerimenti

Ultime HSQLDB sintassi 2.0.1 supporta Oracle per DUAL, ROWNUM, NEXTVAL e CURRVAL tramite un flag di compatibilità di sintassi, sql.syntax_ora = true. Allo stesso modo, la concatenazione di una stringa con una stringa NULL e restrizioni sui NULL a vincoli UNIQUE vengono gestiti con altre bandiere. La maggior parte delle funzioni di Oracle, come TO_CHAR, TO_DATE, NVL ecc, sono già integrati.

Al momento, di utilizzare dei semplici tipi Oracle, come numero, è possibile utilizzare una definizione di tipo:

CREATE TYPE NUMERO come numerico

L'istantanea successiva consentirà NUMERO (N) e altri aspetti della compatibilità tipo ORACLE quando viene impostato il flag.

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

[Aggiornamento:] L'istantanea emessa il 4 ott traduce maggior parte dei tipi specifici di Oracle ai tipi ANSI SQL. HSQLDB 2.0 supporta anche il tipo ANSI SQL INTERVALLO e la data / timestamp aritmetica allo stesso modo di Oracle.

Quali sono i tuoi test di unità per? Se si prova il corretto funzionamento del DDL e stored procedure, allora si dovrebbe scrivere i test più "vicino" a Oracle:. O senza codice Java o senza altre interfacce web bello primavera e del tutto concentrandosi sul db

Se si vuole testare la logica dell'applicazione implementata in Java e primavera allora si può utilizzare finto collegamento oggetti / database per rendere il vostro test indipendente dal database.

Se si desidera verificare il funzionamento nel suo complesso (ciò che è contro lo sviluppo modulare e principio di test) allora si può virtualizzare database e prova su tale istanza, senza avere il rischio di fare alcune modifiche irreversibili brutte.

Fino a quando i test pulire dopo loro stessi (come già sembra di sapere come impostare), non c'è niente di sbagliato con l'esecuzione di test contro una vera e propria istanza di database. In realtà è l'approccio che ho di solito preferisco, perché sarete testando qualcosa di più vicino alla produzione il più possibile.

Le incompatibilità sembrare piccola, ma in realtà finiscono per mordere di nuovo non molto tempo dopo. In un caso buona, si può ottenere via con qualche traduzione brutto sql / ampia presa in giro. In casi gravi, parti del sistema saranno proprio impossibile di prova, che credo sia un rischio inaccettabile per i sistemi business-critical.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top