2012-03-21 31 views
14

He estado buscando en EasyMock y tutoriales/ejemplos sobre su uso para las pruebas de unidades de las clases DAO, para una prueba de "contenedor externo". Sin embargo, creo que la mayoría habla de probar la capa de servicio en su lugar, burlándose de la clase DAO. Estoy un poco confundido, ¿realmente es así como tu Unidad prueba la capa DAO?Pruebas unitarias DAO

Algunos dirían que las pruebas que interactúan con DB & EJB son en realidad pruebas de Integración y no de Unidad, pero ¿cómo saber si su SQL es correcto (suponiendo que no hay ORM) y su DAO inserta/consulta los datos correctos de su base de datos real (leer, la base de datos local que es similar a la de producción)?

He leído que DBUnit es una solución para tal situación. Pero mi pregunta es sobre el uso de un marco como DBUnit "contenedor externo". ¿Qué pasa si el DAO depende de algunos EJB, cómo manejamos las transacciones, qué pasa si hay activadores que actualizan otras tablas en sus insertos?

¿Cuál es la mejor manera de probar solo los DAO con tales dependencias?

Respuesta

23

Personalmente, pruebo los DAO de la unidad accediendo a algún tipo de base de datos de prueba, preferiblemente el mismo tipo de base de datos (no la MISMA base de datos, obviamente) que su aplicación utiliza en producción.

Creo que si haces eso, la prueba es más una prueba de integración, porque tiene una dependencia en una base de datos en ejecución. Este enfoque tiene la ventaja de que está lo más cerca posible de su entorno de producción en ejecución. Tiene las desventajas de que necesita configuración de prueba, necesita una base de datos de prueba en ejecución (ya sea local para su máquina o en algún lugar de su entorno) y las pruebas pueden tardar más en ejecutarse. También debe asegurarse de revertir los datos de prueba después de la ejecución de las pruebas.

Una vez que se prueban los DAO, definitivamente burleselos para probar sus servicios.

1

Estoy utilizando HSQLDB para las pruebas Dao y Service API. El rendimiento es bueno y también admite transacciones. No estoy usando EJB. Yo uso Hibernate.

Existen algunos problemas que soy consciente de que ejecutar las pruebas en una base de datos diferente puede enmascarar algunos de los problemas de la base de datos compatibles. Pero creo que tales problemas deberían quedar atrapados en las pruebas de aceptación de humo &.

cordiales, Koya

12

lo general con DAOs la idea es tener un envoltorio mínima alrededor de código de acceso a datos, por lo que no hay nada allí para poner a prueba a excepción de la asignación a la base de datos y pruebas de unidad con los simulacros son inútiles . Si en realidad hay lógica en el DAO que vale la pena probar con los simulacros, entonces se podría argumentar que estás haciendo un uso indebido del patrón DAO y que la lógica debería estar en un servicio.

Para probar la asignación a la base de datos DBUnit es útil porque le permite especificar un conjunto de datos inicial antes de la prueba para que la prueba comience desde un estado conocido y le permite especificar el estado final de los datos. , por lo que no tiene que escribir mucho código de prueba unitaria para afirmar que lo que está allí es lo que se espera.

Idealmente, si tiene una herramienta como Hibernate que abstrae la base de datos, puede usar una base de datos en memoria como H2 o HSQLDB, por lo que las pruebas se ejecutan más rápido y no hay base de datos para crear. Si tiene que usar una base de datos real, asegúrese de que sus pruebas lo tengan para sí mismos para que puedan crear y eliminar datos sin impactar o ser afectado por otros procesos. En la práctica, tener una base de datos para usted, tanto a nivel local como en entornos de CI, es poco probable y utilizar la base de datos en memoria es mucho más práctico.

1

Finalmente me conformé con escribir las pruebas de Unidad que pueden ejecutarse fuera del contenedor, con una base de datos activa y para soporte transaccional utilizo un administrador de transacciones independiente (Bitronix), también puedo retroceder. Supongo que esto no hace que la prueba sea todavía prueba de Pure Unit ... Me encantaría escuchar a los que opinen sobre este enfoque.

2

Complementando en las torres Koya, puede usar HSQLDB para las pruebas DAO. Me imagino que has usado Spring e Hibernate en tu proyecto. Necesitaría archivos de configuraciones separadas para apuntar a HSQLDB, necesitaría insertar datos antes de ejecutar las pruebas. Existen algunas limitaciones de lo que puede hacer con HSQLDB, pero está bien para uso general como consultas y combinaciones. Con esta solución se puede usar en un entorno continuo, como jenkins. Las pruebas de integración pueden usar HSQLDB, por lo que esta parte no se burla.