Uh ... hay buenos puntos en las pruebas de unidad e integración escritas en estas respuestas aquí
Echo de menos las vistas prácticas y relacionadas con los costos aquí.
Dicho esto, veo claramente el beneficio de las pruebas de unidades atómicas muy aisladas (tal vez muy independientes entre sí y con la opción de ejecutarlas en paralelo y sin ninguna dependencia, como bases de datos, sistemas de archivos, etc.) y pruebas de integración (nivel superior), pero ... también es una cuestión de costos (tiempo, dinero, ...) y riesgos .
Por lo tanto, hay otros factores que son mucho más importantes (como "qué probar" ) antes de que piense en "cómo probar" según mi experiencia ... .
¿Mi cliente paga (implícitamente) la cantidad adicional de escritura y el mantenimiento de las pruebas?
¿Un enfoque más basado en pruebas (las pruebas de escritura primero antes de escribir el código) es realmente rentable en mi entorno (análisis de riesgo / costo de fallas de código, personas, especificaciones de diseño, configuración de entorno de prueba)?
El código siempre tiene errores, pero ¿podría ser más rentable mover las pruebas al uso de producción (en el peor de los casos)?
También depende en gran medida de la calidad de su código (estándares) o los marcos, el IDE, los principios de diseño, etc. que usted y su equipo siguen y cuán experimentados son. Un código bien escrito, fácilmente comprensible, suficientemente bien documentado (idealmente autodocumentado), modular, ... introduce probablemente menos errores que lo contrario. Por lo tanto, la "necesidad" real, la presión o el mantenimiento general / los costos / riesgos de corrección de errores para las pruebas exhaustivas pueden no ser altos.
Vamos a llevarlo al extremo donde sugirió un compañero de trabajo en mi equipo, tenemos que intentar probar en unidad nuestro código de capa de modelo Java EE puro con un 100% de cobertura deseada para todas las clases dentro de la base de datos.
O el administrador que desea que las pruebas de integración se cubran con el 100% de todos los posibles casos de uso del mundo real y flujos de trabajo de la interfaz de usuario web porque no queremos arriesgar ningún caso de uso para que falle.
Pero tenemos un presupuesto ajustado de alrededor de 1 millón de euros, un plan bastante estricto para codificar todo. Un entorno de cliente, donde los posibles errores de aplicaciones no serían un gran peligro para los humanos o las empresas. Nuestra aplicación se probará internamente con (algunas) pruebas unitarias importantes, pruebas de integración, pruebas de clientes clave con planes de prueba diseñados, una fase de prueba, etc. ¡No desarrollamos una aplicación para alguna fábrica nuclear o la producción farmacéutica!
(Solo tenemos una base de datos designada, fácil de probar clones para cada desarrollador y estrechamente acoplados a la aplicación web o la capa del modelo)
Yo mismo trato de escribir la prueba si es posible y desarrollarla mientras pruebo mi código. Pero a menudo lo hago desde un enfoque de arriba hacia abajo (pruebas de integración) y trato de encontrar el punto correcto, donde hacer el "corte de capa de aplicación" para las pruebas importantes (a menudo en la capa de modelo). (porque a menudo es mucho sobre las "capas")
Además, el código de prueba de unidad e integración no viene sin un impacto negativo en tiempo, dinero, mantenimiento, codificación, etc. Es genial y debe aplicarse, pero con cuidado y teniendo en cuenta las implicaciones al comenzar o después de 5 años de un lote. de código de prueba desarrollado.
Por lo tanto, diría que realmente depende mucho de la confianza y la evaluación de costo / riesgo / beneficio ... como en la vida real donde no puede y no quiere correr con un Lote o 100% mecanismos de seguridad.
El niño puede y debe trepar a alguna parte y puede caerse y lastimarse.
El auto puede dejar de funcionar porque llené el combustible incorrecto (entrada no válida :)).
La tostada puede quemarse si el botón de tiempo deja de funcionar después de 3 años.
Pero no quiero, nunca, conducir en la carretera y tener el volante extraíble en mis manos :)