unit-testing - test - pruebas unitarias java
Pro y Con''s de pruebas unitarias después del hecho (12)
Aquí hay algunos de cada uno a mi mente:
Pro:
- Se ahorra tiempo al no tener que probar los métodos que se han eliminado a medida que el diseño evolucionó con el tiempo. Lo que queda es lo que realmente tiene que probarse.
- Al agregar pruebas, esto ofrece la oportunidad de revisar todos los aspectos de la aplicación y determinar qué otras optimizaciones se podrían agregar ahora que un prototipo funcional está listo.
Estafa:
- Gran inversión de tiempo para obtener las pruebas escritas, la nueva funcionalidad puede demorarse por un tiempo para generar todas las pruebas.
- Se pueden haber introducido errores que las pruebas descubrirán que pueden hacer que esto sea más largo de lo inicialmente planeado.
El punto principal sería que agregar pruebas unitarias permite refactorizar y poner más brillo en la aplicación.
Tengo una aplicación compleja grande alrededor de 27k líneas. Es esencialmente un motor de procesamiento multihilo de accionamiento de reglas, sin dar demasiado lejos. Ha sido probado parcialmente, ya que ha sido construido, ciertos componentes.
La pregunta que tengo es cuáles son los pros y los contras de hacer pruebas unitarias después del hecho, por así decirlo, después de que se haya implementado. Está claro que las pruebas tradicionales demorarán entre 2 y 3 meses para probar cada faceta, y todo debe funcionar, y ese tiempo realmente no está disponible.
He realizado un buen número de pruebas unitarias en el pasado, pero en general ha sido sobre automatización de escritorio o aplicaciones LOB, que son bastante simples. La aplicación en sí misma está altamente compuesta internamente, realmente impulsada por la interfaz. No he decidido qué marco particular usar. Cualquier consejo sería apreciado.
Lo que usted dice.
Creo que hay varias ventajas de probar el código existente
- Gestión de regresión
- Mejor comprensión del código. Probarlo revelará casos que no anticipó y ayudará a definir el comportamiento del código
- Señalará las deficiencias de diseño en el código mientras lucha para probar métodos mal definidos.
Pero creo que es más interesante considerar los inconvenientes del código de prueba de la unidad. AFAIK, no hay contras. Todo el tiempo dedicado a agregar pruebas se pagará por sí mismo, incluso en todo menos en los ciclos de tiempo más cortos.
Creo que una de las mayores pruebas de "después del hecho" es que probablemente le resulte más difícil probarlo. Si escribe código sin pruebas, generalmente no tiene en cuenta la capacidad de prueba y termina escribiendo código que es difícil de probar.
Pero, después de pasar este tiempo extra escribiendo pruebas y cambiando su código para una mejor comprobabilidad, tendrá mucha más confianza para realizar cambios , una vez que no necesitará mucho tiempo para depurar y verificar si todo está bien.
Finalmente, es posible que encuentre nuevos errores que no se detectaron antes, y dedique un tiempo a solucionarlos. Pero bueno, para eso son las pruebas =)
Dependiendo de cuántos errores surja la "prueba manual", simplemente podría hacer una corrección de fallas basada en pruebas que, en mi experiencia, es mucho más efectiva que simplemente aumentar la cobertura del código al escribir pruebas unitarias "post-mortem".
(Lo cual no quiere decir que escribir pruebas unitarias después sea una mala idea, es solo que TDD es casi siempre una mejor idea ).
Este es uno de estos tipos de preguntas difíciles de evaluar el valor.
En general, estoy de acuerdo con Epaga, que escribir nuevas pruebas para corregir errores (quizás con un par de pruebas adicionales) es un buen enfoque.
Agregaría dos comentarios más:
- Hacer una prueba de caja negra retraída a una unidad antes de hacer cambios grandes puede ser una buena idea
- Las pruebas de consistencia no son pruebas unitarias, pero ciertos tipos de programas se prestan a la generación sencilla de pruebas de consistencia. Este podría ser un enfoque para asegurarse de no romper las cosas.
Hay muchas razones para el código de prueba de la unidad. La razón principal por la que abogaría por las pruebas unitarias después del hecho es simple. Tu código está roto, simplemente aún no lo sabes.
Hay una regla muy simple en el software. Si el código no se prueba, está roto. Esto puede no ser inmediatamente obvio al principio, pero cuando comiences las pruebas, encontrarás errores. Depende de usted determinar cuánto le importa encontrar estos errores.
Además de esto, hay muchos otros beneficios importantes de las pruebas unitarias,
- las pruebas de regresión se simplificarán
- otros desarrolladores, que tienen menos conocimiento, no pueden romper su comportamiento deseado
- las pruebas son una forma de auto documentación
- puede reducir el tiempo en futuras modificaciones (¿no más pruebas manuales ?, ¿menos errores?)
La lista puede seguir y seguir. El único inconveniente real es el tiempo que lleva escribir estas pruebas. ¡Creo que ese inconveniente siempre se verá compensado por el tiempo que le lleve depurar los problemas que podría haber encontrado durante la prueba unitaria!
Las pruebas unitarias "después del hecho" todavía son valiosas y proporcionan la mayoría de las mismas ventajas de las pruebas unitarias durante el desarrollo.
Una vez dicho esto, me parece más trabajo realizar una prueba después del hecho (si desea obtener el mismo nivel de prueba). Todavía es valioso, y aún vale la pena.
Personalmente, cuando trato de abordar algo con tiempo limitado, trato de enfocar mis esfuerzos de prueba tanto como sea posible. Cada vez que solucione un error, agregue pruebas para ayudar a prevenirlo en el futuro. Cada vez que va a refactorizar, intente poner suficientes pruebas en su lugar para sentirse seguro de que no va a romper algo.
El único inconveniente de agregar pruebas unitarias es que requiere cierto tiempo de desarrollo. Personalmente, considero que el tiempo de desarrollo dedicado a las pruebas es superado por el tiempo ahorrado en mantenimiento, pero esto es algo que debe determinar por su cuenta.
Las pruebas unitarias no prueban que un sistema funcione. Demuestra que cada unidad funciona como una unidad independiente. No prueba que el sistema integrado funcionará
Las pruebas unitarias "después del hecho" son útiles para dos cosas: encontrar errores que no se detectaron hasta el momento y que no se usarán con ningún otro tipo de prueba (especialmente en condiciones excepcionales), hay una gran cantidad de condiciones raras que pueden ocurrir en particular unidades para cualquier sistema del mundo real), y como pruebas de regresión durante el mantenimiento.
Ninguno de estos ayudará mucho en su situación; debe realizar otras formas de prueba de cualquier manera. Si no tiene tiempo para hacer lo que debe hacer, es improbable que asumir más trabajos sea de ayuda.
Dicho esto, sin pruebas unitarias, le garantizo que tendrá sorpresas desagradables cuando los clientes comiencen a usar el código. Son todas esas condiciones raras, hay tantas que es probable que algunas de ellas ocurran pronto. Los probadores de caja negra tienden a entrar en patrones habituales, lo que significa que solo prueban tantos casos raros, y no tienen manera de saber qué casos raros hay en unidades particulares y cómo desencadenarlos de todos modos. Más usuarios significa más variaciones en los patrones de uso.
Estoy con quienes dicen que las pruebas unitarias deben escribirse como parte del proceso de programación, una de las responsabilidades de los programadores. Como regla general, el código se escribe más rápido de esa manera, a medida que obtiene menos errores y menos complejos para rastrear a medida que avanza, y tiende a averiguar sobre ellos cuando todavía está familiarizado con el código que tiene el error.
Las pruebas unitarias todavía son definitivamente útiles. Consulte http://en.wikipedia.org/wiki/Unit_testing para obtener una lista completa y una explicación de los beneficios.
Los principales beneficios que obtendrá son documentación, lo que facilita el cambio y simplifica la integración futura.
Realmente no hay costos para agregar pruebas de unidades, excepto su tiempo. Sin embargo, tenga en cuenta que el tiempo que dedique a agregar pruebas unitarias reducirá la cantidad de tiempo que necesitará gastar en otras áreas de desarrollo por lo menos en la misma cantidad y probablemente más.
Pruebas unitarias post facto :
- Obtenga documentación en la que pueda confiar.
- Mejora la comprensión del código.
- Empujar hacia la refactorización y mejorar el código en sí.
- Corrige errores que acechan en el código.
Pruebas unitarias posteriores a la facto :
- Pierda el tiempo solucionando errores con los que puede vivir . (Si escribió 27KLOC, esperamos que haga algo, ¿verdad?)
- Dedique tiempo a comprender y refactorizar el código que no necesita comprender.
- Pierde tiempo que podría entrar en el próximo proyecto.
La pregunta no formulada es qué tan importante es este código para su organización a largo plazo. La respuesta a esta pregunta determina cuánto debe invertir. Tengo muchos competidores (exitosos) donde el principal objetivo de su código es sacar números para evaluar alguna nueva técnica o idea. Una vez que tienen los números, el código tiene poco valor marginal. Ellos (con razón) prueban con mucho cuidado para asegurarse de que los números sean significativos. Después de eso, si hay cincuenta errores abiertos que no afectan los números, no les importa. ¿Y por qué deberían ellos? El código ha cumplido su propósito.
Si el desarrollo está "hecho", diría que no hay mucho sentido en las pruebas unitarias.
Si está haciendo una refactorización, esas pruebas lo ayudarán a detectar cualquier error que aparezca en el proceso.