2010-09-28 16 views
8

Sono nuovo per i test automatici e dbUnit. Quindi apprezzerei il tuo consiglio.Come ripristinare il database allo stato iniziale utilizzando dbUnit?

Ho intenzione di creare una suite di test, che verrà eseguito nel modo seguente:

  • creare un database di H2 in memoria
  • script run DDL per la creazione di tabelle
  • corsa DBUnit inserire iniziale dati (chiamiamolo STATE0) che verrà utilizzato da tutti i test.
  • test run

Fino ci sembra bello per me, ma quello che non capisco, è come faccio Ripristinare il database alla State0 dopo una corsa di prova e ha cambiato i dati?

Posso farlo con dbUnit?
Oppure con qualcos'altro?
Devo ricreare il database prima di ogni test?

Le transazioni di prova semplici non eseguite nei test non sono appropriate per me, poiché i test alla fine eseguiranno più di una transazione potrebbero essere più di una connessione al database.

risposta

7

DBUnit può eseguire automaticamente il lavoro automaticamente se si scrivono correttamente i metodi @BeforeClass, @Before e @After. Per esempio. nel nostro progetto, mediante Derby, uno di questi casi di test sembra

public class MyTest { 
    protected static IDataSet getDataSet() throws Exception { 
     URL url = MyTest.class.getClassLoader().getResource("MyDataSet.xml"); 
     return new XmlDataSet(new FileInputStream(url.getPath())); 
    } 

    private static JdbcDatabaseTester databaseTester; 

    @BeforeClass 
    public static void setUpClass() throws Exception { 
     // Init test environment, session etc. 
     databaseTester = new JdbcDatabaseTester(
       "org.apache.derby.jdbc.ClientDriver", 
       "jdbc:derby://localhost:1527/myschema", 
       "username", "password"); 
     databaseTester.setDataSet(getDataSet()); 
    } 

    @AfterClass 
    public static void tearDownClass() { 
     // Close session etc. 
    } 

    @Before 
    public void setUp() throws Exception { 
     databaseTester.onSetup(); 
    } 

    @After 
    public void tearDown() throws Exception { 
     databaseTester.onTearDown(); 
    } 

    @Test 
    public void test() throws Exception { ... } 
} 

Questo codice mette di nuovo (un sottoinsieme) dello schema DB allo stato definito da MyDataSet.xml dopo ogni prova. (Si noti che, come ha commentato @Pascal, il ripristino potrebbe non essere sempre pieno - se un test modifica un tavolo che non è nel set di dati, non sarà influenzato dalle @Before/@After metodi.)

+1

Fa veramente "resettare" il DB? Voglio dire, se il mio test inserisce alcuni dati nella tabella 'FOO' e se' MyDataSet.xml' non include 'FOO',' FOO' non sarà "resettato", giusto? –

+0

@Pascal, probabilmente hai ragione. Essendo umano, è sempre consigliabile ricontrollare che se eseguo test che coinvolgono la tabella 'FOO', quella tabella è effettivamente inclusa nel set di dati. –

+0

éter Sono d'accordo. È solo che il nitpicker in me non era pienamente convinto dal fraseggio dell'ultima frase :) +1 comunque. –

5

Per inizializzare il database per il set di dati iniziale, basta implementare questi metodi nel caso di test:

@Override 
protected DatabaseOperation getSetUpOperation() throws Exception 
{ 
    return DatabaseOperation.CLEAN_INSERT; // by default (will do DELETE_ALL + INSERT) 
} 

@Override 
protected DatabaseOperation getTearDownOperation() throws Exception 
{ 
    return DatabaseOperation.NONE; // by default 
} 

Si può avere chiavi esterne vincoli se alcuni dei vostri test inserire righe in una tabella vuota (non definito nel set di dati iniziale, per esempio).

Basta aggiungere questa tabella vuota nel set di dati senza alcuna fila:

<mydb_mypopulatedtable id="1" name="toto" alias="funky"/> 
<mydb_mypopulatedtable id="2" name="titi" alias="groovy"/> 
<mydb_mypopulatedtable id="3" name="tutu" alias="creepy"/> 

<mydb_myemptytable /> 

Qui, myemptytable ha una chiave esterna per mypopulatedtable. Se myemptytable non fosse definito, DBUnit proverebbe a cancellare il mypopulatedtable ma fallirà a causa del vincolo. Se definito, DBUnit eliminerà le righe myemptytable prima.

+0

State cercando questo da sempre! – suguspnk

Problemi correlati