unit-testing - que - pruebas unitarias beneficios
¿Cuándo una prueba no es una prueba de unidad? (8)
Estoy buscando reglas como:
Una prueba no es una prueba unitaria si:
- se comunica con una base de datos
- no puede ejecutarse en paralelo con otras pruebas
- utiliza el "entorno" como registro o sistema de archivos
¿Qué más hay ahí?
Después de determinar si una prueba es un examen unitario o no, la próxima pregunta es: ¿es una buena prueba de unidad ?
La implementación de una prueba en múltiples unidades posiblemente defectuosas no sería una prueba unitaria.
No tiene afirmaciones, y no espera que se produzca una excepción.
Pregunta intrincada
Supongamos que debo programar cierta lógica comercial y todas las necesidades de lógica de negocios para llegar a los datos a través de algún tipo de DAL.
Digamos que para los propósitos de prueba, me burlo de las unidades DAL (creando "cucuves").
Pero esos sinsontes son, por supuesto, unidades adicionales por derecho propio. Así que incluso cuando se usan simulaciones, podría parecer que todavía estoy violando la idea de "ninguna otra unidad involucrada" cuando quiero probar mi módulo de lógica de negocios.
Por supuesto, generalmente se sabe que "crear cucuves para el DAL" puede invalidar tu propia prueba en la cuenta de que tu ruiseñor se desvía en algún aspecto particular del DAL.
Conclusión: es absolutamente imposible hacer "pruebas unitarias genuinas" en los módulos de negocios que dependen de alguna manera en cualquier tipo de DAL, signo de interrogación?
Corrolary: lo único que puede ser (¡genuinamente!) Probado en una unidad es el DAL mismo, ¿interrogación?
Corrolario de la corrolaría: dado que el "DAL" suele ser un ORM o el mismo LMD de algunos SGBD, y dado que esos productos generalmente se compran como "tecnología comprobada", ¿cuál es el valor agregado de hacer cualquier prueba unitaria? ¿Alguna vez, interrogante?
Una dificil...
Para mí, una prueba unitaria verifica una pieza específica de la lógica de forma aislada . Es decir, tomo un poco de lógica, la extraigo del resto (si es necesario burlando dependencias) y pruebo exactamente esa lógica, una unidad (del todo), explorando diferentes tipos de posibles flujos de control.
Pero en el otro lado ... ¿podemos decir siempre 100% correcto o incorrecto? No ser filosófico, sino, como también dice Michael en su publicación:
Las pruebas que hacen estas cosas no son malas. A menudo vale la pena escribir , y se pueden escribir en un arnés de prueba de unidad. Sin embargo, es importante poder separarlos de las pruebas unitarias verdaderas para que podamos mantener un conjunto de pruebas que podamos ejecutar rápidamente cada vez que hagamos nuestros cambios.
Entonces, ¿por qué no debería escribir una prueba unitaria que verifica la lógica de analizar, por ejemplo, un archivo xls accediendo a algún archivo ficticio del sistema de archivos en mi carpeta de prueba (como permiten las pruebas MS con el DeploymentItem)?
Por supuesto, como se mencionó, deberíamos separar este tipo de pruebas de las otras (tal vez en un conjunto de pruebas separado en JUnit). Pero creo que uno también debería escribir esas pruebas si se siente cómodo al tenerlas allí ... claro, siempre recordando una vez que una prueba unitaria debería simplemente probar una pieza aisladamente.
Lo que es más importante en mi opinión es que estas pruebas se ejecutan rápidamente y no tardan demasiado en ejecutarse repetidas veces.
Una prueba no es una prueba unitaria cuando:
- prueba más de una cosa a la vez (es decir, prueba cómo dos cosas funcionan juntas) - entonces es una prueba de integración
Lista de verificación para buenas pruebas unitarias:
- están automatizados
- son repetibles
- son fáciles de implementar
- permanecen para uso futuro, una vez escrito
- Pueden ser administrados por cualquier persona
- se pueden ejecutar presionando un botón
- corren rápidamente
Algunas mejores prácticas (sin ningún orden de importancia particular):
- las pruebas deben separarse de las pruebas de integración (que son más lentas), de modo que puedan ejecutarse con la mayor frecuencia posible
- no deberían incluir demasiada lógica (preferiblemente, sin estructuras de control)
- cada prueba debe probar solo una cosa (por lo tanto, deben contener solo una afirmación)
- los valores esperados utilizados en las aserciones deben estar codificados y no computados en el tiempo de ejecución de la prueba
- las dependencias externas (sistema de archivos, tiempo, memoria, etc.) deben reemplazarse por trozos
- la prueba debe recrear el estado inicial al apagar la prueba
- en las aserciones, es mejor usar una política "contiene ...", en lugar de "es estrictamente igual ..." (es decir, esperamos ciertos valores en una colección, ciertos caracteres en una cadena, etc.)
Esto es parte del conocimiento que he extraído del libro de Roy Osherove - The Art of Unit Testing
Una prueba no es una prueba unitaria si no está probando una unidad.
En serio, eso es todo.
El concepto de "unidad" en las pruebas unitarias no está bien definido, de hecho, la mejor definición que he encontrado hasta ahora, no es realmente una definición porque es circular: una unidad en una unidad de prueba es lo más pequeño posible que puede ser probado en forma aislada.
Esto le da dos puntos de control: ¿se prueba de forma aislada? ¿Y es lo más pequeño posible?
Tenga en cuenta que ambos dependen del contexto. Lo que podría ser lo más pequeño posible en una situación (por ejemplo, un objeto completo) podría en otra situación, solo una pequeña parte de un único método. Y lo que cuenta como aislamiento en una situación puede ser en otra (por ejemplo, en un lenguaje administrado por memoria, nunca se ejecuta de forma aislada del recolector de basura, y la mayoría del tiempo es irrelevante, pero a veces puede no serlo).
Ver la definición de Michael Feathers
Una prueba no es una prueba unitaria si:
- Habla con la base de datos
- Se comunica a través de la red
- Toca el sistema de archivos
- No se puede ejecutar al mismo tiempo que cualquiera de tus otras pruebas unitarias
- Tienes que hacer cosas especiales en tu entorno (como editar archivos de configuración) para ejecutarlo.