Taller creación de pruebas básicas de persistencia

Importante: Se espera que ud. haya leído y entendido Persistencia con JPA y los detalles sobre la estrategia de las pruebas de persistencia que se encuentran en Pruebas de Persistencia antes de realizar el taller.


En este taller implementaremos las pruebas unitarias de la capa de persistencia. Vamos a realizar paso a paso la configuración de las pruebas, el código, la ejecución y la interpretación de los resultados.

Se espera que ud. realice este taller sobre el código de su proyecto. Cada integrante de grupo deberá crear las pruebas de persistencia de las entidades que han estado en sus casos de uso. Por favor utilice una de sus clases de persistencia para realizar el taller. Vamos a suponer que en su proyecto Ud. cuenta con la clase XYZEntity y la clase correspondiente de la persistencia XYZPersistence.

Estas pruebas utilizan varios frameworks y librerías: JUnit, Arquillian, Podam. Las explicaciones de estas herramientas pueden ser encontradas en el enlace siguiente: herramientas para automatización de pruebas.

Es importante tener claro la configuración que debe tener el proyecto antes de poder construir las pruebas.

I. Configuración de la Base de datos para pruebas

Dado que las pruebas van a utilizar una base de datos, se recomienda crear un archivo persistence.xml que defina una base de datos distinta a la de la ejecución normal de la aplicación. En este ejemplo vamos a crear una base de datos utilizando el manejador de base de datos Derby que trae por defecto el contenedor sobre el que vamos a desplegar las pruebas (Glassfish Embedded).

Dado que este archivo solo será usado para pruebas, debemos ubicarlo en el proyecto dentro de la carpeta de los recursos de las pruebas: src/test/resources/META-INF.

En este archivo estamos definiendo que:

  1. Asociado con la unidad de persistencia llamada "NombreProyectoPU" se creará una base de datos:
  2. Nombre: jdbcTest
  3. host y puerto: se ejecutará en: localhost:1527
  4. el login y password del usuario para la base de datos es en ambos casos "APP"
  5. La base de datos esderby.
  6. eclipselink es la implementación de JPA.
  7. Las transacciones van a ser manejadas por el contenedor transaction-type="JTA".
    <?xml version="1.0" encoding="UTF-8"?> <persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> <persistence-unit name="XYZPU" transaction-type="JTA"> <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> <exclude-unlisted-classes>false</exclude-unlisted-classes> <shared-cache-mode>NONE</shared-cache-mode> <properties> <property name="eclipselink.ddl-generation" value="drop-and-create-tables"/> <property name="eclipselink.target-database" value="Derby"/> <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.ClientDriver"/> <property name="javax.persistence.jdbc.url" value="jdbc:derby://localhost:1527/jdbTest"/> <property name="javax.persistence.jdbc.user" value="APP"/> <property name="javax.persistence.jdbc.password" value="APP"/> <property name="eclipselink.logging.level" value="FINE"/> <property name="eclipselink.logging.parameters" value="true"/> </properties> </persistence-unit> </persistence>

II. Pasos del Taller

Elementos en común de las Pruebas

Cada una de las pruebas unitarias para la capa de persistencia, es decir las que están asociadas con un archivo de manejo de persistencia, tienen los siguientes elementos en común:

  • Se crea un despliegue independiente en en el contenedor en el que se ejecutarán las pruebas. De esta manera se asegura que las pruebas utilizan únicamente aquellas clases o paquetes que se añaden explícitamente y que participan en lo que se está probando.
  • Los métodos de prueba se ejecutan dentro de dicho contenedor y tienen acceso al mismo contexto del contenedor. Con esto se puede preparar el ambiente antes de la ejecución de las pruebas, por ejemplo, para definir los datos iniciales en la base de datos de pruebas.

Pasos

  1. Primero vamos a crear el archivo inicial de pruebas donde:
  2. Se ha incluido la lógica para el despliegue de las pruebas
  3. Hay un método de prueba por cada método de la clase que se va a probar. En la primera versión todos estos métodos solo tienen una instrucción de falla de la prueba.
  4. Se definió la lógica de creación de los datos de prueba
  5. Al ejecutar el archivo de pruebas debe salir la ventana de junit roja indicando que todas las pruebas fallaron.
  6. En la segunda iteración completamos:
  7. La lógica de cada uno de los métodos de prueba
  8. Al implementar la clase que se está probando se ejecutará paso a paso las pruebas para ir verificando el correcto comportamiento de la persistencia.

1. Archivo inicial

Paso Detalle
Generar el archivo de pruebas inicial 1.pruebaspersistencia
Definir la configuración de los datos de prueba 2.pruebaspersistencia

2. Completar Código

Crear una entidad XYZEntity en la base de datos

@Test public void createXYZEntityTest() { PodamFactory factory = new PodamFactoryImpl(); XYZEntity newEntity = factory.manufacturePojo(XYZEntity.class); XYZEntity result = persistence.create(newEntity); Assert.assertNotNull(result); XYZEntity entity = em.find(XYZEntity.class, result.getId()); Assert.assertNotNull(entity); Assert.assertEquals(newEntity.getName(), entity.getName()); }
Línea Detalle
3 Crea una fábrica para construir objetos aleatorios
4 Utiliza la fábrica para construir un objeto aleatorio de la clase XYZEntity
6 Invoca el método que se está probando: crear la entidad en la base de datos utilizando el método create de la clase persistence.
El método recibe de argumento la entidad que va a crear y retorna la entidad que creó.
Esta entidad que retorna trae el valor del id que la base de datos le asignó.
8 Verifica que el resultado no sea null
9 Utiliza el manejador de persistencia para hacer un find en la base de datos con el id que retornó el método de creación.
10 Verifica que el objeto exista en la base de datos
11 Compara si el nombre del objeto que se persistió es el mismo del que se trajo con el manejador de persistencia

Obtener la lista de entities de la base de datos

@Test public void getXYZsTest() { List<XYZEntity> list = persistence.findAll(); Assert.assertEquals(data.size(), list.size()); for (XYZEntity ent : list) { boolean found = false; for (XYZEntity entity : data) { if (ent.getId().equals(entity.getId())) { found = true; } } Assert.assertTrue(found); } }
Línea Detalle
Antes de esta método se ejecutó el método anotado con @Before insertData() que creó 3 entities en la base de datos. Estas entities están en una lista llamada data.
3 Invoca el método que se está probando: obtener todas las entidades de la base de datos utilizando el método findAll() de la clase persistence.
4 Verifica que el tamaño de la colección resultado sea el mismo que el tamaño de la colección inicial data.
5 Por cada elemento en la lista compara el id con el id del correspondiente en la colección data

Obtener una entidad XYXEntity de la base de datos

@Test public void getXYZTest() { XYZEntity entity = data.get(0); XYZEntity newEntity = persistence.find(entity.getId()); Assert.assertNotNull(newEntity); Assert.assertEquals(entity.getName(), newEntity.getName()); }
Línea Detalle
Antes de esta método se ejecutó el método anotado con @Before insertData() que creó 3 entities en la base de datos. Estas entities están en una lista llamada data.
3 La variable entity apunta a la primera entitie de la lista data.
4 Invoca el método que se está probando: obtener una entidad de la base de datos utilizando el método find(id) de la clase persistence.
El método recibe de argumento el id de la entitie que se va a buscar. En este caso es el del primer elemento de la lista creada en data, esto es, entity.getId().
5 Verifica que la entidad que retornó no sea null.
6 Verifica que el nombre de la entidad que trajo es el mismo de entity.

Obtener una entitie de la base de datos dado su nombre

@Test public void getXYZByNameTest() { XYZEntity entity = data.get(0); XYZEntity newEntity = persistence.findByName(entity.getName()); Assert.assertNotNull(newEntity); Assert.assertEquals(entity.getName(), newEntity.getName()); }
Línea Detalle
Antes de esta método se ejecutó el método anotado con @Before insertData() que creó 3 entities en la base de datos. Estas entities están en una lista llamada data.
3 La variable entity apunta a la primera entitie de la lista data.
4 Invoca el método que se está probando: obtener una entidad de la base de datos utilizando el método findByName(name) de la clase persistence.
El método recibe de argumento el id de la entitie que se va a buscar. En este caso es el del primer elemento de la lista creada en data, esto es, entity.getName().
5 Verifica que la entidad que retornó no sea null.
6 Verifica que el nombre de la entidad que trajo es el mismo de entity.

Actualizar una entitie de la base de datos

@Test public void updateXYZTest() { XYZEntity entity = data.get(0); PodamFactory factory = new PodamFactoryImpl(); XYZEntity newEntity = factory.manufacturePojo(XYZEntity.class); newEntity.setId(entity.getId()); persistence.update(newEntity); XYZEntity resp = em.find(XYZEntity.class, entity.getId()); Assert.assertEquals(newEntity.getName(), resp.getName()); }
Línea Detalle
Antes de esta método se ejecutó el método anotado con @Before insertData() que creó 3 entities en la base de datos. Estas entities están en una lista llamada data.
3 La variable entity apunta a la primera entitie de la lista data.
4 Utiliza la fábrica para construir un objeto aleatorio de la clase XYZEntity llamado newEntity
5 Al nuevo objeto le asigna el id del objeto que se va a actualizar
7 Invoca el método que se está probando: actualizar una entidad de la base de datos utilizando el método update de la clase persistence.
El método recibe de argumento la nueva entidad.
9 Obtiene el objeto actualizado.
11 Verifica con el nombre que el objeto se actualizó.

Borrar una entitie de la base de datos

@Test public void deleteXYZTest() { XYZEntity entity = data.get(0); persistence.delete(entity.getId()); XYZEntity deleted = em.find(XYZEntity.class, entity.getId()); Assert.assertNull(deleted); }
Línea Detalle
Antes de esta método se ejecutó el método anotado con @Before insertData() que creó 3 entities en la base de datos. Estas entities están en una lista llamada data.
3 La variable entity apunta a la primera entitie de la lista data.
5 Invoca el método que se está probando: borrar una entidad de la base de datos utilizando el método delete de la clase persistence.
6 Trata de obtener la entidad borrada
7 Verifica que el resultado sea null

Diagra de clases con las clases de pruebas

#

results matching ""

    No results matching ""