Uso de DBUnit

DBUnit  es una utilidad que nos permite realizar test unitarios de clases que manipulan datos de base de datos. Cuando en una clase de test se implementan varios métodos de test, estos no se ejecutan en un orden determinado, de modo que si alguno de ellos altera los datos en la base de datos, el resto de pruebas podrían fallar. La idea es cargar las tablas de nuestra base de datos con los datos de prueba, lanzar el test unitario de prueba y finalmente restaurar los datos en la base de datos, de modo, que el siguiente test de prueba se encuentre la base de datos en el estado original.

DBUnit, utiliza archivos xml, para cargar los datos de prueba en la base de datos, donde el nombre de los elementos se corresponde con el nombre de la tabla, y los atributos se corresponden con las columnas. Cada elemento implica una fila en dicha tabla, por ejemplo:

Vamos a realizar un ejemplo sobre una base de datos Derby, para lo cual, podemos revisar los artículos sobre esta base de datos que ya se han publicado aquí.

Supongamos que nuestra aplicación tiene ya el modelo de datos definido y que ya tenemos datos que nos sirven para realizar las pruebas. En lugar de crear el fichero XML con los datos de prueba, vamos a recuperar los datos de la base de datos y a crear el fichero XML con dichos datos. Seguidamente ejecutaríamos las pruebas sobre la base de datos de test. Como en este ejemplo partimos de cero, vamos a hacerlo todo sobre una única base de datos. Empezamos por definir las dependencias Maven:

Creamos la base de datos de prueba Derby embebida y creamos el modelo y los datos:

Rellenaremos la tabla con una serie de datos de prueba.

El siguiente paso, es crear el fichero XML, con los datos, a partir de los que hay en la base de datos, para ello ejecutaremos el siguiente código:

Al ejecutar esta clase, nos generará un archivo “test-dataset.xml” con el contenido de la base de datos:

Ya tenemos los datos de prueba, de modo, que podemos cargar los datos del fichero xml en la base de datos y eliminarlos las veces que queramos. Antes de nada, vamos a borrar los datos de la base de datos, para comprobar que se cargan bien en la ejecución del test. Lanzamos la sentencia:

Vaciando la tabla usuario

Vaciando la tabla usuario

La consola, nos indica que se han borrado los datos de la tabla usuario:

Crear el caso de prueba

Ya que tenemos el escenario preparado, vamos a crear la clase de prueba, el proyecto debe quedar del siguiente modo:

Archivos en el proyecto

Archivos en el proyecto

En el paquete “src/test/java”, dentro del paquete “com.notodocodigo.dbunit” se encuentra el test:

 

En primer lugar podemos ver que se está utilizando Spring para realizar los test:

Al utilizar la clase JUnit de Spring, para que se muestren bien las trazas, configuramos un logger en el paquete “src/test/resources/log4j.properties” con el siguiente contenido:

Seguidamente, cargamos el xml que contiene el contexto Spring para realizar las pruebas:

El paquete “src/test/resources/test-context.xml” contiene los beans para accesder a la base de datos:

Seguidamente, en la clase “DBUnitTest” podemos ver que se inyectan los beans que vamos a utilizar para acceder a los datos. A continuación se muestra el método “@Before” que se ejecuta antes de todos y cada uno de los métodos de prueba anotados con “@Test”. Este método se encarga de cargar la base de datos con el xml que generamos al principio y que hemos colocado en el paquete de test “/com/notodocodigo/dbunit/test-dataset.xml“.
Como se puede ver estamos utilizando la operación “DatabaseOperation.CLEAN_INSERT”, lo que quiere decir, que en primer lugar se borran todos los datos de las tablas que contenga el fichero “test-dataset.xml” que estamos pasando como parámetro, para a continuación insertar las filas que estén definidas en dicho fichero. Existen muchas operaciones que podemos aplicar, como se indica en la documentación oficial:

 
Al inicializar los datos antes de la ejecución de cada uno de los test, dentro de los test, se pueden realizar todas las operaciones que queramos con la base de datos, de modo que el siguiente test, se encuentre los datos en el estado original.
El método anotado con “@After”, se ejecuta después de todos y cada uno de los test. Lo que realizamos en este caso es eliminar los datos de la tabla usuario, de modo que cuando termine la ejecución de todos los test, la tabla usuario quede vacía.
A modo de ejemplo, únicamente se ha implementado un método de test, con una aserción que comprueba el número de filas que contiene la tabla USUARIO. También se hace un System.out, para ver el contenido de dicha tabla. Por supuesto en un entorno real, no utilizaríamos System.out, pero para esta prueba nos vale. Al ejecutarlo veríamos por consola lo siguiente:

Como se puede ver DBUnit nos facilita la realización de pruebas con bases de datos. DBUnit proporciona numerosas herramientas para comparar datos, etc. Para profundizar en el uso de esta herramienta, se puede consultar su página oficial.

3 comentarios:

  1. Gracias, fue clara tu explicación.

  2. Hola tío, ¿Cómo estas?

    Quiero preguntarte como le haces para que en los inserts de las tablas con dbunit, utilices los valores de sequencias de oracle, para no generar colisión cuando se inserte datos un id ya existente

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *