2008-12-01 12 views
8

Me parece que la mayoría de las personas escribe sus pruebas en bases de datos en proceso y en proceso de la memoria, como SQLite, cuando trabaja con NHibernate. Lo tengo en funcionamiento pero mi primera prueba (que usa NHibernate) siempre lleva entre 3 y 4 segundos para ejecutarse. La próxima prueba se ejecuta mucho más rápido.¿Cómo hago TDD de manera eficiente con NHibernate?

Estoy usando FluentNhibernate para hacer el mapeo pero obtengo aproximadamente los mismos tiempos con los archivos de mapeo XML. Para mí, la demora de 3-4 segundos interrumpe seriamente mi flujo.

¿Cuál es la forma recomendada de trabajar con TDD y NHibernate?

¿Es posible simular ISession para probar las consultas reales o solo se puede hacer esto en las bases de datos de la memoria?

+0

Esto se vuelve aún más relevante cuando las pruebas tardan entre 3 y 4 minutos en ejecutarse. – bentford

Respuesta

14

Estoy usando el patrón de repositorio para realizar operaciones de base de datos, y cada vez que ejecuto mis pruebas solo ejecuto las pruebas de nivel superior que simulan simular el repositorio (con RhinoMocks).

Tengo un conjunto separado de pruebas que prueban explícitamente la capa Repository y las asignaciones de NHibernate. Y esos generalmente no cambian tanto como el negocio y la lógica GUI sobre ellos.

De esa manera obtener unittests muy rápidos que nunca se dio en el DB, y sigue siendo un capa DB bien probado

+1

Esas pruebas separadas son más en el ámbito de las pruebas de integración de todos modos. Es bueno que puedas automatizarlos, pero es bueno mantenerlos separados.^1 – Mendelt

+0

Sí, nhibernate hace que sea muy fácil hacer esas pruebas haciendo que la base de datos se vuelva a crear cada vez que inicie una prueba. Eso lleva tiempo y mis Pruebas NHibernate tardan alrededor de un minuto en ejecutarse, pero aun así, se ejecutan y sé cuándo las cosas no funcionan. – Tigraine

+0

¿qué hay de los métodos de prueba que requieren datos de consulta o operación de guardado que requieren clave externa, etc. podría imaginar un montón de trabajo para cargar datos para la prueba –

0

Ha intentado cambiar algunos de los valores predeterminados de las propiedades de configuración opcionales? La desaceleración probablemente esté relacionada con ciertas optimizaciones que hace nhibernate con la generación de código.

http://nhibernate.info/doc/nh/en/index.html#configuration-optional

parece una db en la memoria va a ser la forma más rápida para poner a prueba una capa de sus datos. También parece que una vez que comienzas a probar tu capa de datos te mueves un poco más allá del ámbito de una prueba unitaria.

4

Unidad de acceso a datos de pruebas no es posible, pero usted puede probar la integración ella. Creo prueba de integración para mi acceso a datos en un proyecto separado de mis pruebas unitarias. Solo realizo las pruebas de integración (lentas) cuando cambio algo en los repositorios, el mapeo o el esquema de la base de datos. Debido a que las pruebas de integración no se mezclan con las pruebas unitarias, aún puedo ejecutar las pruebas unitarias aproximadamente 100 veces al día sin molestarme.

+0

No estoy seguro de que tenga razón al respecto. Realmente depende de CÓMO escribes las pruebas. Si sus pruebas son Atomic, Order indepenent y isolated, Intention Revealing, Fácil de instalar y Fast. Son en todos los sentidos UnitTests. Ver: http://codebetter.com/blogs/jeremy.miller/archive/2005/07/20/129552.aspx – maz

+0

Algunas pruebas que interactúan con el sistema de archivos, una base de datos o cualquier otro sistema no son independientes, por lo que no es una prueba unitaria. Sé que J.Miller está de acuerdo con eso. Con rápido se puede ejecutar una gran cantidad de pruebas en 10 segundos. Hagas lo que hagas, no alcanzarás esa velocidad con las pruebas de integración de db. – Paco

+0

Sí, estoy de acuerdo en que "... la prueba que interactúa con el sistema de archivos, una base de datos o cualquier otro sistema no es independiente ..." pero de lo que estoy hablando aquí es de correr contra un proceso, en la memoria db. Esto no es diferente de cualquier otro objeto en memoria que pueda tener hoy en sus pruebas. – maz

Cuestiones relacionadas