2010-06-24 20 views
11

¿Cuál es la ventaja de utilizar objetos simulados en comparación con una base de datos de prueba estática que tiene datos conocidos y transacciones utilizando para asegurarse de que nada cambia cuando se prueba en la base de datos.Base de datos simulados Objetos vs Prueba

+1

Uno puede objetar que probar una base de datos no es parte de la unidad de prueba – mathk

+0

@mathk ¿Qué pasa si tiene lógica en los procedimientos almacenados? – aehiilrs

+0

@aehiilrs Luego, probar con ambos objetos y una base de datos es todavía una prueba de integración, no una prueba de unidad. Pero ambas son pruebas automatizadas independientemente, y ambas pueden manejarse con un marco de pruebas unitarias. Ahora mi pregunta es, si escribe pruebas en sql que se ejecutan en una base de datos para probar procs almacenados en una base de datos (en el mismo servidor), ¿es eso una prueba de unidad o una prueba de integración? – apollodude217

Respuesta

12

Puede hacer ambas cosas. Use objetos simulados para probar su lógica BLL y luego use una base de datos de prueba para probar su lógica DAL. De esa forma, si algo se rompe, puede ver fácilmente dónde está el problema y cuál prueba falla.

+4

redacción: Supongo que "lógica BLL" se desplegaría en "lógica lógica de la lógica de negocios". Parece que la "lógica" extra es redundante. Además, junto con la "Capa de acceso a los datos", estos se utilizan principalmente en los productos de Microsoft por lo que tendría sentido utilizar términos comunes en su lugar, al responder a esta pregunta independiente de Microsoft. – n611x007

2

Si puede asegurarse de que la prueba estática db no cambie durante las pruebas, entonces creo que la prueba estática db es mejor que los objetos simulados. Pero, depende de lo que quiere probar y la complejidad del código que se prueba. Me gustaría ir con objetos falsos, ya que son más simples de mantener en comparación con un DB.

6

En primer lugar, usar un simulacro será mucho más rápido que conectarlo a una base de datos externa. Sin embargo, la razón principal es que los simulacros se comportan igual cada vez que se ejecuta la prueba, lo cual no se puede garantizar con un servicio externo como una base de datos, lo que significa que las pruebas unitarias no fallan aleatoriamente. También puede simular fácilmente cualquier tipo de falla que desee manejar con un objeto simulado.

También es una buena idea ejecutar pruebas de integración contra una base de datos real, sin embargo, para probar cosas como la configuración y el rendimiento.

1

Por lo general, utilizaría ambos enfoques.

Para las pruebas unitarias utilizaría objetos simulados. De esta forma puede probar su sistema de una manera mucho más precisa, porque puede simular todos los objetos, no solo los que envuelven la conexión de la base de datos. En general, es una buena práctica probar cada clase por separado de todas las dependencias. Los beneficios son: es posible probar todo el manejo de errores en todos los niveles y asegurarse de probar todas las rutas de código, cuando se produce un error en la prueba puede encontrar inmediatamente la causa, etc.

Para integración y finalización Para las pruebas finales, prueba grandes partes del sistema o todo. Luego se conectaría a la base de datos (porque esta conexión es parte de la prueba). Obviamente debe asegurarse de que la base de datos se encuentre en un estado conocido, etc.

Al final tendrá muchas más pruebas de unidad que pruebas de integración, por lo que es bastante importante hacerlas muy rápidas, otra ventaja de usar objetos simulados

1

Imagina que estás a punto de escribir una clase que no existe. Tal vez es un controlador. No es algo que habla directamente a la base de datos.

Tiene una buena idea de cómo debe comportarse, y sabe de qué debería ser responsable, y qué debería delegar en algún otro servicio (utilizando el principio de responsabilidad única). Entonces, se escriben interfaces para representar los roles de las clases auxiliares que va a usar.

Luego, escribe un ejemplo de cómo puedes usar tu clase que estás a punto de crear. Si lo desea, puede llamar al ejemplo una prueba unitaria. Te burlas de las interacciones con las clases de ayuda. Cuando ejecuta el ejemplo, falla, porque aún no ha escrito el código. Ahora puede escribir el código para hacerlo pasar, usando las interfaces de las clases de ayuda, que aún no ha escrito.

Luego haces lo mismo con las clases de ayuda, burlándose de sus ayudantes.

Eventualmente llegarás a una clase que habla con la base de datos. O tal vez habla con un servicio web. O tal vez los datos son estáticos o en la memoria.(No le importa a la clase original, porque su clase está desacoplada de esto).

En este punto, también querrá un ejemplo para describir el comportamiento de esta clase, y si se trata de un conector de base de datos, necesitará una base de datos para el ejemplo.

Escribir código de esta manera produce un código que es fácil de usar y comprender, sin nada adicional que no sea necesario para algo más arriba en la pila. Esto suele ser más sólido que el código que es más fácil de escribir. Es por eso que a veces utilizamos simulacros, porque escribir pruebas primero usando simulaciones ayuda a producir un diseño bueno, mantenible y desacoplado.

1

La configuración para probar con un db puede ser ardua. Si se encuentra dedicando más tiempo a configurar el db, solo para probar algún aspecto funcional de su lógica comercial, entonces puede usar un simulacro/falso.

Cuestiones relacionadas