2010-02-22 10 views
8

¿Existe un marco para escribir pruebas unitarias para la capa de acceso a datos? Hay varios problemas en esto.
1. ¿Cómo rellenar su base de datos?
2. ¿Cómo nos aseguramos de que una prueba no modifique valores en db que puedan fallar en otra prueba?Cómo escribir pruebas para la capa de acceso a datos en .Net?

¿Existe un buen marco disponible que pueda resolver los problemas anteriores?

Actualización: Encontré nDBUnit que puede encargarse de los problemas de infraestructura con la capa de acceso a los datos de prueba.

http://code.google.com/p/ndbunit/wiki/QuickStartGuide

Respuesta

16

Supongo que llamaré, ya que realmente no me gustan algunas de las respuestas hasta ahora.

Ya sea que lo llame una "prueba de unidad" o "prueba de integración" o una "prueba supercalifragilisticexpialidocious" no importa un poco en este caso; solo hay una prueba válida para los componentes de acceso a datos y que es para probarla en datos reales. No producción datos obviamente, pero un facsímil razonable de eso.

Lo primero que debe hacer es get the database itself under source control. Lamentablemente, no hay un marco para esto; Microsoft parte del camino en algunas versiones de VSTS, pero el resultado final aún es algo que falta. Al menos en el mundo de hoy, vas a tener que hacer mucho de este trabajo tú mismo. Pero hazlo, en serio: no te arrepentirás cuando se estropee una actualización importante y necesites deshacer la base de datos.

Lo que se pone bajo control de origen debería ser todo lo necesario para generar el nuevo esquema, por lo general una secuencia de comandos de línea de base, además de las secuencias de comandos de configuración "datos" (es decir, el contenido de tablas de enumeración), y actualizar las secuencias de comandos para reflejar los cambios de esquema recientes. Esto le da casi todo lo que necesita para realizar pruebas "en vivo" en una base de datos temporal; su prueba solo necesita descargar esos scripts desde el control fuente y ejecutarlos en un servidor de prueba y/o una instancia de base de datos diferente, usualmente usando SQL Management Objects para ejecutar dichos scripts (SMO puede manejar declaraciones GO y similares; un SqlConnection normal no puede).

Varias herramientas pueden ayudarlo con la generación de contenido de prueba en la base de datos de prueba. Probablemente el más popular es el SQL Data Generator de Red Gate. Estas herramientas también pueden generar scripts para crear los datos, que es lo que usará en sus pruebas. O bien, si así lo desea, puede eliminar los datos de su base de datos de producción y usar SQL Server Management Studio para crear una secuencia de comandos con los datos que elija conservar para la prueba. De cualquier forma, mantenga sus scripts de datos de prueba en control de fuente, al igual que los scripts de esquema, y ​​cuando necesite probar su DAL, descargue estos scripts luego de activar una instancia de DB y utilizarlos para completar los datos.

Me gustaría que eran un único marco que hacer todo esto para usted, pero con el derecho de cobro de herramientas, bibliotecas y buenas prácticas de desarrollo, que puede convertir esto en un proceso mucho menos doloroso.

+0

Estoy de acuerdo con esto por completo. – kyoryu

+0

He usado SQL Server Express de Microsoft para plataformas de prueba; verificamos los archivos .mdf en el control de fuente. (SQL Server recreará archivos .ldf sobre la marcha). Esto no es divertido, y terminas aprendiendo mucho más sobre la RANU y las instancias de usuario de lo que siempre quisieras saber. Pero funciona. – TrueWill

+0

@TrueWill: Hard core, espero que esas bases de datos de prueba sean pequeñas, de lo contrario, ¡eso masticará mucho espacio en el disco en el servidor SC! Definitivamente es una opción para considerar si se ajusta a su infraestructura; para nosotros, incluso si redujéramos nuestra base de datos de 1.5 TB a 1.5 GB para probarla, sería un poco ridículo verificar la fuente. ;) – Aaronaught

3

pruebas unitarias precisas no tendrían acceso a la base de datos. Dicho esto, mbUnit tiene un atributo de reversión que se puede usar para las pruebas que acceden a la base de datos.

+7

Tengo que estar en desacuerdo con esto. Pruebas unitarias de clases de acceso a datos contra cualquier cosa que * no sea * una base de datos real es solo un ritual vacío. Una prueba de unidad "verdadera" utilizaría las secuencias de comandos de creación/actualización de bases de datos que seguramente mantiene bajo control de versiones, construirá una base de datos de espacio aislado para las pruebas y la desmantelará al final. – Aaronaught

+0

No estoy seguro de dónde obtuviste tu definición, pero las pruebas unitarias no deberían hacer ningún acceso de archivo, acceder a BD (en la representación de la memoria es el camino a seguir), etc. ya que puede ralentizarlos y hacer que los desarrolladores los ejecuten con menos frecuencia base. – brian

+1

@ user210118: ¿Qué sucede si el código de acceso a datos llama internamente a un SP y por motivos de rendimiento hay algún código escrito en SP? Me gustaría comprobar si el SP está haciendo lo que se supone que debe hacer. – Amitabh

3

Cuando esté probando los repositorios que accederán a la base de datos, siempre debe asegurarse de que la base de datos se borre después de completar la prueba de la unidad. Puede realizar esto ejecutando la prueba en la transacción O puede usar el atributo MbUnit Rollback para deshacer los cambios automáticamente.

+0

Pero esto aún no resolverá el problema de la población de datos inicial. Estoy buscando un marco que pueda facilitar estas cosas para que todos en el equipo puedan concentrarse en escribir Pruebas. – Amitabh

+0

¡Su base de datos de prueba nunca debe llenarse inicialmente! Debe ser una base de datos en blanco sin nada. ¿Puede profundizar en la población de datos inicial? – azamsharp

+2

Muchas aplicaciones tienen solo 1 o un número muy limitado de instalaciones de producción. Comenzar desde una base de datos vacía probablemente solo ocurra una vez en su vida, y eso puede haber sido hace años.Las pruebas deben hacerse con datos similares a los que ocurrirán en la producción. Si un DB de producción nunca volverá a estar en blanco, ¿qué gana al probar esa situación? – ScottS

1

No. Las pruebas unitarias no tienen acceso a la base de datos. Para eso están las pruebas de integración o funcionales.

Tendría un conjunto de pruebas que validaran que el código que gestiona la comunicación de db está haciendo lo correcto, y luego tóquelo con la menor frecuencia posible.

La razón para no hacerlo en "pruebas unitarias" es que al hacerlo, corre el riesgo de diluir el significado de la frase "prueba de unidad", convirtiéndolos en una bolsa de pruebas, lo que generalmente hará son más lentos y evitan que los desarrolladores los ejecuten con la frecuencia que deberían.

+0

¿Qué pasa si me preocupa lo rápido que son las pruebas de mi unidad y no? –

+10

¿De qué sirve la prueba unitaria de una * clase de acceso a datos * si la prueba no tiene acceso a ningún dato? Si estamos discutiendo sobre las definiciones, entonces está bien, no "pruebe la unidad" de su DAL en absoluto, "prueba de integración". El resultado neto es lo mismo. Lo único que * no * tiene sentido es burlarse de la base de datos para pruebas DAL de bajo nivel; eso es peor que inútil, te muestra una luz verde cuando la clase podría estar rota. – Aaronaught

+0

@Aaronaught: Totalmente de acuerdo. Soy un gran defensor de "no te burles de lo que no tienes". Si las pruebas unitarias definen el comportamiento esperado, es difícil definir el comportamiento del código que no le pertenece. – kyoryu

Cuestiones relacionadas