¿Cómo sé si tengo suficiente cobertura de prueba unitaria para eliminar una prueba de integración?

15

Estoy trabajando en un sistema heredado (con eso quiero decir que fue escrito sin pruebas). Hemos tratado de probar parte del sistema escribiendo pruebas de integración que prueban la funcionalidad desde el exterior.

Esto me da cierta confianza para refactorizar partes del código sin preocuparme de romperlo. Pero el problema es que estas pruebas de integración requieren una implementación (más de 2 minutos) y muchos minutos para ejecutarse. Además, son un dolor de mantenimiento. Cada uno de ellos cubre miles de líneas de código y cuando uno de ellos se rompe puede tomar horas para depurar por qué.

He estado escribiendo muchas pruebas unitarias para estos cambios funcionales que he estado haciendo últimamente, pero antes de comprometerme siempre hago una nueva implementación y ejecuto todas las pruebas de integración, solo para asegurarme de que no me pierda nada. En este punto, sé que mis pruebas unitarias y algunas de las pruebas de integración se superponen a lo que prueban.

¿Cómo sé cuándo mis buenas pruebas unitarias están cubriendo adecuadamente una mala prueba de integración para poder eliminar esa prueba de integración?

Daniel Kaplan
fuente

Respuestas:

18

La métrica más fácil es preguntar, "¿cuándo fue la última vez que esta prueba de integración falló legítimamente ?" Si ha pasado mucho tiempo (ha habido muchos cambios) desde que la prueba de integración falló, entonces las pruebas unitarias probablemente estén haciendo un buen trabajo. Si la prueba de integración ha fallado recientemente, hubo un defecto que las pruebas unitarias no detectaron.

En general, mi preferencia sería aumentar la solidez de las pruebas de integración, hasta el punto en que puedan ejecutarse de manera confiable sin supervisión. Si tardan mucho tiempo en correr, hágalos durante la noche. Todavía son valiosos incluso si solo se ejecutan ocasionalmente. Si estas pruebas son demasiado frágiles o requieren intervención manual, entonces puede que no valga la pena el tiempo dedicado a mantenerlas en funcionamiento, y puede considerar descartar las que tienen más éxito.

Greg Hewgill
fuente
3
+1 por recomendar que las pruebas sean automáticas ya que eso lleva a la pregunta obvia de "¿Por qué matar una prueba automatizada?"
1
Sí, estoy de acuerdo con esto. Por supuesto, incluso eso todavía te muerde si no tienes una cobertura de prueba unitaria lo suficientemente buena. Por ejemplo, actualmente tenemos un conjunto de pruebas de integración que tarda aproximadamente 6 horas en ejecutarse ... pero no creo que alguna vez se haya eliminado una prueba debido al enfoque de mi compañía en la compatibilidad
Earlz
2
Tal vez debería comenzar una nueva pregunta para esto, pero ¿sugiere que cada vez que una prueba de integración falla legítimamente, debería descubrir cómo escribir una prueba unitaria que también falle y lograr que ambas pasen?
Daniel Kaplan
2
@tieTYT: Sí, eso suena absolutamente como una buena idea. Las pruebas unitarias son buenas; las pruebas unitarias de cosas que sabes que ya se han roto antes son aún mejores.
Greg Hewgill
7

Las pruebas de unidades no son el santo grial de las pruebas, son solo una de las muchas herramientas que deberían usarse para probar una base de código. Por lo tanto, ninguna cantidad de pruebas unitarias debe considerarse segura para reemplazar otras pruebas. Si tiene una mala prueba de integración, debe trabajar para que sea una buena prueba de integración, no reemplazarla por otra cosa, es decir, reemplazar su puerta de entrada con una cerca perimetral y una puerta.

Ryathal
fuente
Si este proyecto comenzara desde cero, eso tendría más sentido para mí. Pero mi primera prueba de integración fue "verificar que puede iniciar sesión" y eventualmente realicé muchas pruebas unitarias que "verifican que puede iniciar sesión". La prueba de integración se bloquea todo el tiempo si cambia el html. Este ejemplo está completamente ideado, pero ¿no es un buen caso para eliminar la prueba de integración?
Daniel Kaplan
3
@tieTYT: probar algo a través de la interfaz de usuario a menudo conduce a una solución muy inestable. Sin embargo, las pruebas realizadas por la interfaz de usuario son importantes, solo que a veces las pruebas manuales aquí producen menos esfuerzo que intentar automatizar esa prueba y mantenerla estable. Entonces, cuando crea que este es el caso aquí, puede eliminar esa "prueba de integración" de la lista de pruebas automatizadas y agregarla a su plan de pruebas de pruebas manuales.
Doc Brown
@DanielKaplan ¿sería posible actualizar la prueba de integración para que sea más estable? Si falla porque el html cambia a veces, entonces posiblemente pruebe algo como "el nombre de usuario aparece en la página después de iniciar sesión" en lugar de algo más específico como "el nombre de usuario aparece dentro de este div después de iniciar sesión"
Jen