2009-06-28 8 views
11

He leído en los blogs que la base de datos no debe ser golpeada cuando se ejecutan las pruebas de la unidad. Entiendo la teoría, sin embargo, digo que tengo procedimientos de tienda complejos que son parte de una operación de dominio comercial. Quiero escribir un conjunto de pruebas unitarias para el código relacionado con la operación comercial; sin embargo, si me burlo de la base de datos, tengo la sensación de que no estoy "probando" realmente todas las partes que forman parte de la operación. Por ejemplo, alguien podría crear un error en uno de los códigos de la base de datos y las pruebas seguirán ejecutándose correctamente.¿Por qué no golpear la base de datos dentro de las pruebas unitarias?

Me gustaría saber si esta guía sobre pruebas unitarias es buena en la práctica. He visto el concepto de "pruebas de integración"; sin embargo, no estoy seguro de qué herramientas usar para realizar pruebas de integración. Por ejemplo, ¿está bien crear una prueba de integración usando un marco de prueba como Nunit?

Gracias

Hugo

Respuesta

10

usted simplemente está en una zona gris semántica.

  • Las pruebas del sistema cubren todo el sistema de extremo a extremo.
  • Las pruebas unitarias se pueden utilizar para describir un subsegmento del ciclo extremo a extremo.

En ese caso, las pruebas unitarias de su código de aplicación serían/​​no podrían golpear la base de datos, pero que serían/​​podrían tener pruebas de unidad que cubría su base de datos de procedimientos almacenados ...

dividir Básicamente la aplicación en cosas que se probarán a lo largo de particiones que tengan sentido. Si elige la línea de partición equivocada, terminará con un gran problema de mantenimiento del código con simulacros de objetos y andamios de prueba y cosas ...

Una forma común con las aplicaciones web es escribir una serie de pruebas unitarias que prueban el acceso a los datos capa ...

luego escribir una serie de pruebas unitarias que ponen a prueba la capa de aplicación (incluyendo la capa de datos) ...

Y, por último escribir algunas pruebas del sistema basados ​​en el navegador ...

el El truco es colocar la información solo dentro y fuera del conjunto del medio (la capa de la aplicación) a través de la API y no meterse en la base de datos para ver si algo funcionó. De esta forma, sus pruebas no se romperán si cambia el esquema de datos.

Pero a veces (como actualmente estoy haciendo mientras escribo esto) TIENES que buscar en la base de datos para hacer un conjunto de pruebas significativo y robusto (estoy probando los protocolos de transferencia servidor-servidor).

Enfóquese en la forma en que obtiene la máxima cobertura de código y estabilidad para su aplicación, al tiempo que escribe la menor cantidad de andamios de prueba y evita la fragilidad en su conjunto de pruebas.

+5

No puedo decirte cuántas veces he dicho casi exactamente lo mismo A NUESTRO GRUPO Q/A !!! Ven una gran prueba y, a veces, no entienden que hay dependencias. He tenido algunos problemas de forma que no pueden agregar el mismo registro más de una vez. Luego, tengo que convencerlos de que necesitan porciones de configuración y desmontaje añadidas a sus pruebas. (¿Cómo DARE un programador/diseñador humilde les dice cómo escribir pruebas ) –

+0

que es increíble, sus pruebas de escritura (aunque personalmente me encantan las pruebas) – Chazt3n

0

El problema en la base de datos adressing en sus pruebas es que un cambio en la base de datos o un cambio en su código puede fallar la prueba. Una prueba unitaria normalmente debe apuntar lo más directo posible al cambio que lo hizo fallar. Entonces, si desea probar el código para el acceso DB, puede usar una base de datos de prueba fija. De esta forma, está seguro de que el código que accede a la base de datos es incorrecto porque sabe que la base de datos no ha cambiado y si desea cambiar la configuración de la base de datos, primero cambie la base de prueba y verifique que su prueba falle, luego arréglelo y luego cambie no prueba DB. En un proyecto en el que trabajé, creamos una pequeña base de datos que se generaba en la memoria antes de cada prueba.

0

"... no se debe golpear la base de datos cuando se ejecutan las pruebas de la unidad ...", a menos que usted esté probando objetos de persistencia, por supuesto.

No sé qué blogs está citando, pero apuesto a que lo que dicen es que burlarse de algunos componentes durante las pruebas de integración puede tener beneficios. Si ya ha probado el nivel de persistencia, no es necesario volver a probarlo. El beneficio de la burla en ese caso tiene más que ver con la reducción de las dependencias y la incertidumbre. Por ejemplo, es posible que la unidad haya probado su código, lo haya empaquetado y ahora sea el momento de moverlo a un entorno más cercano a la producción. Si las bases de datos que necesita no pueden estar disponibles (p. Ej., No tiene la versión correcta del esquema, datos faltantes que necesita o simplemente necesita otra aplicación que llegó primero), puede usar simulaciones para permitir su integración prueba para proceder sin demora.

4

Hay dos razones principales para las pruebas unitarias no hiting la base de datos:

  • usted quiere que sus pruebas para ir lo más rápido posible
  • ¿Quieres probar el código como una sola unidad, no cómo se se integra con otro código/base de datos.

En su caso, debe probar los procedimientos almacenados. Luego debe escribir una prueba que ejecute esos procedimientos almacenados. O puede ejecutarlos a través de su código (prueba de integración) o puede ejecutarlos directamente desde la prueba (una especie de prueba unitaria). En ambos casos puedes usar Nunit.

2

Bueno, la cosa es, si tiene sus unittest llegados a la base de datos, no está probando solo la unidad de código, sino que está golpeando varios, también el DAL, los procedimientos almacenados, etc. Los defensores de TDD dicen no golpear la base de datos en pruebas unitarias.

Su también por qué usted no debe sostener tanto peso en puro, TDD-conceptualizado, teórico santa U nitT EST. Si bien las pruebas unitarias no son malas en sí mismas, de hecho es bastante importante garantizar que los programadores construyan cada componente de manera adecuada; las pruebas del sistema son mucho más importantes. En general, puede ser más difícil encontrar el método exacto que causó fallas en las pruebas del sistema, son más realistas y realmente prueban el sistema.
La llamada "Prueba de componentes", que es más parecida a las pruebas del sistema, pero solo para una pequeña parte del sistema, de extremo a extremo, me parece un buen compromiso.

(CUE las réplicas TDD ahora ... :))

1

Después de escribir Should one test internal implementation, or only test public behaviour? y discutir las respuestas de las personas, creo que la respuesta puede depender de cuántas personas hay en el equipo de desarrollo.

Ventajas de la prueba con la base de datos:

  • La prueba es más realista (utilizando la base de datos real)
  • Menos código de prueba para escribir (no se necesita escribir una maqueta de la base de datos)

desventajas de las pruebas con la base de datos:

  • Sus pruebas no pueden funcionar hasta que los datos capa de acceso de base está escrito
  • Si hay un fallo de error o de prueba, no se sabe si el fallo está en el código o en la capa de acceso a la base de datos

Las desventajas son especialmente importantes si (pero tal vez sólo si) la persona que escribe la capa superior no es la misma que la persona que escribe la capa de acceso a la base de datos.

1

YMHO Hay un poco de problema semántico y un poco de un problema técnico aquí.

Se supone que una prueba de unidad prueba una pequeña parte del código, de forma aislada, para comprobarlo sin otro código. Una prueba unitaria fallida debería implicar que solo una pequeña parte del código deberá ser inspeccionada y corregida (típicamente, el código que implementa la funcionalidad y la prueba de la unidad misma).

Existen otros ámbitos de prueba para comprobar la funcionalidad del sistema en su conjunto (prueba del sistema) o pruebas funcionales para validar características completas o pruebas de integración para verificar interacciones, pruebas de regresión para verificar la ausencia de pruebas corregidas, etc.

Se debe diseñar una estrategia de prueba para cada proyecto, pero en general tener diferentes categorías ayuda mucho. Así pruebas de unidad debe restringirse a las pruebas de los más pequeños posibles unidades de código, y utilizar otros procedimiento de prueba para probar la funcionalidad, la integración etc.

La parte semántica es si es correcta utilizar una biblioteca de prueba de unidad para llevar a cabo alguna prueba funcional, supongo que no es gran cosa si mantienes tus suites separadas las pruebas unitarias estrictas y las pruebas funcionales (incluso si comparten la herramienta de prueba)

Cuestiones relacionadas