2016-05-03 17 views
1

Ich verwende DBUnit zum Testen meiner Datenbank. Meine Datenbank ist nicht leer. Also möchte ich bestehende Elemente ignorieren und nur die von meinem Test eingefügten Daten testen.So ignorieren Sie vorhandene Elemente von Tabellen beim Testen der Datenbank mit DBUnit

Dies ist ein Beispiel dafür, wie Test durchgeführt wird:

1- Tabelle 10 Elemente einige Daten aus dem Datensatz

2- DBUnit einzufügen enthält (3 Elemente)

3- My Prüfeinsatz Daten (1-Element)

4- Mys erwartete Datensatz enthält 4 Elemente, die der 3 elemnts definiert in dem ersten Datensatz und das Element zuletzt hinzugefügt durch den Test

sind

5- Also, wenn ich ein Assert gleich der tatsächlichen und der erwarteten Tabelle mache, zeigt es mir einen Fehler, der normal ist, weil meine Tabelle bereits Elemente enthält.

Die Frage ist: Gibt es eine Möglichkeit, Elemente in der Datenbank in der Geltendmachung zu ignorieren? Ich möchte nur Daten von Datensatz und Test getestet testen.

Dies ist der Code:

@Override 
    protected IDataSet getDataSet() throws Exception { 
     // transforme fichier XML en BDD 
     URL url = this.getClass().getResource("/dataset-peqt2-init.xml"); 
     File testFile = new File(url.getFile()); 
     return new FlatXmlDataSetBuilder().build(testFile); 
    } 



    @Override 
    protected DatabaseOperation getSetUpOperation() throws Exception 
    { 
     return DatabaseOperation.REFRESH; 
    } 


    /** 
    * Reset the state of database 
    * Called before every test 
    */ 
    @Override 
    protected DatabaseOperation getTearDownOperation() throws Exception 
    { 
     return DatabaseOperation.DELETE; 
    } 


    /** 
    * get the actual table from the database 
    * @param tableName 
    * @return 
    * @throws Exception 
    * @throws SQLException 
    * @throws DataSetException 
    */ 
    private ITable getActualTable(String tableName) throws Exception, SQLException, DataSetException { 
     // get the actual table values 
     IDatabaseConnection connection = getConnection(); 
     IDataSet databaseDataSet = connection.createDataSet(); 
     return databaseDataSet.getTable(tableName); 
    } 

    /** 
    * get the expected table from the dataset 
    * @param tableName 
    * @param fileName 
    * @return 
    * @throws Exception 
    */ 
    private ITable getExpectedTable(String tableName, String fileName) throws Exception { 
     // get the expected table values 
     URL url = this.getClass().getResource("/"+fileName); 
     File testFile = new File(url.getFile()); 
     IDataSet expectedDataSet = new FlatXmlDataSetBuilder().build(testFile); 
     return expectedDataSet.getTable(tableName); 
    } 


    @Test 
    public void test01_insert() throws SQLException, Exception { 
     File file = new File(SynchroDerbi.class.getResource("/test-insert.lst").getFile()); 
     log.debug("test01_insert() avec ref : "+file.getName()); 
     SynchroDerbi.run(file); 
     String fileName = "dataset-insert-expected.xml"; 
     actualTable = getActualTable("equipment"); 
     expectedTable = getExpectedTable("equipment",fileName); 

     Assertion.assertEqualsIgnoreCols(expectedTable, actualTable, new String[]{"id","idSite"}); 

    } 

Antwort

1

DatabaseOperation.CLEAN_INSERT; in getSetUpOperation() tun. Auf diese Weise löscht die Operation zuerst alle Tabellendatensätze und fügt dann Ihren Datensatz ein.

0

Ihre Tests sollten nicht vom aktuellen Zustand des Systems abhängen. Anstatt also auf Gleichheit zu setzen, sollten Sie "contains" -Kontrollen verwenden. Sie erhalten die Ergebnisse von select und bestätigen dann, dass diese die Ergebnisse enthalten, die Sie gerade eingefügt haben.

Wenn Sie strenger mit Ihren Prüfungen sein wollen (was die Wartbarkeit der Tests beeinflussen kann), können Sie das N der Datensätze VORHER wählen, dann Einsätze und dann prüfen, ob BEFORE + N = AFTER.

PS: DBUnit ist kein sehr flexibles und wartbares Werkzeug. Stattdessen können Sie den Code Ihres Systems verwenden, um den Status zu speichern. Wenn sich eine Spalte ändert, müssen Sie die DBUnit-Daten nicht ändern. Um sicherzustellen, dass Ihre Tests nicht aufeinander treten, verwenden Sie data randomization. Die Verwendung des Systemcodes kann bei der Isolation weiter helfen, wenn Sie Rollback Transaktionen innerhalb der Tests starten können.