• Tester une fonctionnalité complexe avec DBUnit

    J’étais confronté récemment à la problématique suivante : tester une suite de fonctionnalité au sein du même test afin de simuler un process métier. La fonctionnalité en question, met à jour ou insert des données en base. Le but du test étant de vérifier en fin de process la présence et cohérence des données en base. Plutôt que faire des requêtes en fin de test puis tester le résultat, nous ferons plûtot un test sur l’ensemble de la base pour notre assertion.

    DBUnit

    • Etape 1  et 2 : Extraction des données dans la base réel

    Il s’agit de faire une snapshot de la base avant l’execution du test. On va extraire que les données qui nous intéresse et non l’ensemble de la base. Il faut écrire un main java :

    
    ....
    PropertiesConfiguration propertiesConfiguration = new PropertiesConfiguration("maProp.properties");
    String url = propertiesConfiguration.getString("URL");
     String user = propertiesConfiguration.getString("USER");
     String password = propertiesConfiguration.getString("PASSWORD");
     String schema = propertiesConfiguration.getString("SCHEMA");
    // database
    connection Class.forName("oracle.jdbc.driver.OracleDriver");
    Connection jdbcConnection = DriverManager.getConnection(url, user, password);
    IDatabaseConnection connection = new DatabaseConnection(jdbcConnection, schema);
    IDataSet createDataSet = connection.createDataSet();
    FlatDtdDataSet.write(createDataSet, new FileOutputStream("src/main/resources/maBase.dtd"));
    QueryDataSet partialDataSet = new QueryDataSet(connection);
    partialDataSet.addTable("TABLE_PERSONNE", "select * from PERSONNE where AGE < 18");
    FlatXmlWriter datasetWriter = new FlatXmlWriter(new FileOutputStream("jdd.xml"));
    datasetWriter.setDocType("maBase.dtd"); datasetWriter.write(partialDataSet);
     ... 

    Db unit nous fourni un jeu de test au format xml qu’on placera dans les ressources de nos tests.

    • Etape 3 , 4 et 5   : écriture du test et load du jdd en base mémoire et extraction du resultat

    On doit à présent loader le jdd.xml dans notre base H2. La encore Db unit nous fournit des outils pour le faire.

    
    IDatabaseTester databaseTester = MonDBmemoire.getInstance();
    databaseTester.setSetUpOperation(DatabaseOperation.CLEAN_INSERT);
    databaseTester.setDataSet(getDataSetFromFile("path/chemin/jdd.xml"));
    databaseTester.onSetup();
    ...
    // mon traitement pour le test
    ...
    //dump de la base apres execution du traitement
    private String[]  nomTables={"PERSONNE ", "VILLE"};
    IDataSet databaseDataSet = connection().createDataSet(nomTables);
    FlatXmlDataSet.write(databaseDataSet, new FileOutputStream("monDump.xml"));
    

    A cette étape on a extrait de la base mémoire, les données voulues apres l’execution du test. Il faudra faire une analyse fonctionnelle, afin de s’assurer que le résultat obtenu est conforme à ce qui est attendu.

    Pour ce faire on peut  soit analyser le fichier xml (monDump.xml) de sortie ou directement requeter en base mémoire. Si vous opter pour la dernière solution n’oublier pas de commiter vos donner en mémoire après le test ( setAutoCommit(false))   puis lancer la commande  java -cp h2*.jar org.h2.tools.Server pour activer  le GUI de H2 .

    Si le résultat vous convient, placer le fichier monDump.xml dans les ressources de votre test puis  passer à l’étape suivante sinon revoir votre code.

    • Etape 6 : finalisation du test avec assertion 

    A ce stade vous avez valider les données qui ont été inserées/updatées/supprimées en base. Il ne reste plus qu’à comparer l’état de la base mémoire avec le fichier monDump.xml.  Dans notre classe de test on supprimera la partie d’extraction dump qu’on remplcera par le code suivant :

    ...
    private String[]  nomTables={"PERSONNE ", "VILLE"};
    IDataSet databaseDataSet = connction.createDataSet();
    IDataSet expectedDataSet = getDataSetFromFile("path/vers/chemin/monDump.xml");
    for (String tb: nomTables) {
    ITable actualTable = databaseDataSet.getTable(tb);
    
    ReplacementTable expectedTable = new ReplacementTable(expectedDataSet.getTable(tb));
    expectedTable.addReplacementObject("${date-today}", new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
    Assertion.assertEquals(new SortedTable(expectedTable, actualTable.getTableMetaData()),new SortedTable(actualTable, actualTable.getTableMetaData()));
    

    Categories: DbUnit, Java

    Étiquettes : ,

    Comments are currently closed.