Si ya tengo una prueba de integración para mi programa, y todos pasaron, tengo la sensación de que funcionará. Entonces, ¿cuáles son las razones para escribir / agregar pruebas unitarias? Como de todos modos ya tengo que escribir pruebas de integración, me gustaría escribir solo pruebas unitarias para partes que no están cubiertas por las pruebas de integración.
Lo que sé, el beneficio de la prueba unitaria sobre la prueba de integración son
- Pequeño y, por lo tanto, rápido de ejecutar (pero agregar una nueva unidad para probar algo ya está probado por la prueba de integración significa que mi traje de prueba total se hace más grande y más largo para ejecutarse)
- Localice el error más fácilmente porque solo prueba una cosa (pero puedo comenzar a escribir la prueba unitaria para verificar cada parte individual cuando falla mi prueba de integración)
- Encuentra un error que puede no quedar atrapado en la prueba de integración. por ejemplo, enmascarar / compensar errores. (pero si mi integración prueba todos los pases, lo que significa que mi programa funcionará incluso si existe algún error oculto. Por lo tanto, encontrar / corregir estos errores no son realmente de alta prioridad a menos que comiencen a romper futuras pruebas de integración o causen problemas de rendimiento)
Y siempre queremos escribir menos código, pero las pruebas de unidades de escritura necesitan mucho más código (principalmente objetos simulados de configuración). La diferencia entre algunas de mis pruebas unitarias y las pruebas de integración es que en las pruebas unitarias, uso un objeto simulado, y en las pruebas de integración, uso un objeto real. Que tienen mucha duplicación y no me gusta el código duplicado, incluso en las pruebas porque esto agrega gastos generales para cambiar el comportamiento del código (la herramienta de refactorización no puede hacer todo el trabajo todo el tiempo).
fuente
Respuestas:
Ha presentado buenos argumentos a favor y en contra de las pruebas unitarias. Así que hay que preguntarse, " ¿Veo el valor de los argumentos positivos que compensan los costes en los negativos? " Desde luego, hacer:
En mi libro, los pros superan a los contras.
fuente
No veo mucho valor en volver a implementar un caso de prueba de integración existente como prueba unitaria.
Las pruebas de integración son a menudo mucho más fáciles de escribir para aplicaciones no tdd heredadas porque generalmente las funcionalidades a probar están estrechamente acopladas, por lo que las unidades de prueba aisladas (= prueba de unidad) pueden ser difíciles / costosas / imposibles.
En mi opinión, el desarrollo basado en pruebas es más efectivo si escribe las pruebas unitarias antes del código real. De esta manera, el código que cumple las pruebas se separa claramente con un mínimo de referencias externas que es fácilmente comprobable.
Si el código ya existe sin las pruebas unitarias, generalmente es mucho trabajo adicional escribir las pruebas unitarias después porque el código no se escribió para una prueba fácil.
Si hace TDD, el código automáticamente se puede comprobar fácilmente.
fuente
unit-tests
, y quiero incluirlaunit-tests
para ciertas partes, ¿crees que es mejor escribir primerointegration tests
el código heredado? Una vez que está escrito, ¿puede desacoplar el acoplamiento estrecho y crear funciones con interfaces que se puedan probar? Como ya tiene elintegration-test
escrito, puede verificar en cada paso de la refactorización, que la nueva versión del código todavía funciona como se desea.Las pruebas de integración solo deben verificar que varios componentes funcionan juntos como se esperaba. Se debe verificar si la lógica de los componentes individuales es precisa o no mediante pruebas unitarias.
La mayoría de los métodos tienen varias rutas de ejecución posibles; piense en las variables de entrada de if-then-else, con valores inesperados o simplemente incorrectos, etc. Por lo general, los desarrolladores tienden a pensar solo en el camino feliz: el camino normal que no sale mal. Pero en lo que respecta a esas otras rutas, tiene dos opciones: puede dejar que su usuario final explore esas rutas a través de las acciones que realizan en la interfaz de usuario y esperar que no bloqueen su aplicación, o puede escribir pruebas unitarias que afirmen el comportamiento de esos otros caminos y tomar medidas cuando sea necesario.
fuente
Algunas de las razones que ha señalado en su pregunta son realmente importantes y, por sí mismas, podrían justificar el caso a favor de las pruebas unitarias, pero YMMV. Por ejemplo, ¿con qué frecuencia ejecuta su conjunto de pruebas integrado? Mi experiencia con las pruebas integradas es que, tarde o temprano, se volverán tan lentas que no las ejecutará cada vez que realice un cambio y el tiempo entre la inserción y la detección de un error aumentará.
Además, un gran error que puede estar cometiendo es confiar en que
Find bug that may not be caught in integration test. e.g. masking/offsetting bugs.
no es importante. ¿Espera que sus usuarios encuentren los errores por usted? Confiar en las coberturas obtenidas de las pruebas integradas es peligroso en mi opinión, puede obtener fácilmente un alto porcentaje de cobertura, pero en realidad está probando muy poco.
Supongo que la referencia canónica contra las pruebas integradas son las publicaciones de JBrains:
http://www.jbrains.ca/permalink/integrated-tests-are-a-scam-part-1
en caso de que no los hayas leído ya.
Finalmente, IMO la retroalimentación que puede obtener de las pruebas unitarias para su diseño es invaluable. Juzgar un diseño por instinto y confiar en pruebas integradas también puede ser un error.
fuente
Si alguna vez tiene que modificar o refactorizar su código, es esencial realizar pruebas unitarias. Las pruebas unitarias existen no solo para demostrar errores en el momento en que se escribe el código, sino para mostrar cuándo aparecen nuevos errores cuando se escribe más código.
Sí, es mucho mejor escribir primero las pruebas de integración y de unidad, pero es muy valioso tenerlas incluso si se escriben más tarde.
fuente