Uh ... ¡ hay buenos puntos en las pruebas de unidad e integración escritas en estas respuestas aquí!
Echo de menos las opiniones prácticas y relacionadas con los costos aquí. Dicho esto, veo claramente el beneficio de las pruebas unitarias muy aisladas / atómicas (tal vez altamente independientes entre sí y con la opción de ejecutarlas en paralelo y sin dependencias, como bases de datos, sistema 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 pensar en "cómo probar" desde mi experiencia ...
¿Paga mi cliente (implícitamente) la cantidad adicional de escritura y mantenimiento de pruebas? ¿Es un enfoque más basado en pruebas (escribir las pruebas antes de escribir el código) realmente rentable en mi entorno (análisis de riesgo / costo de fallas del código, personas, especificaciones de diseño, configuración del 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 mucho de la calidad de su código (estándares) o de los marcos, IDE, principios de diseño, etc. que usted y su equipo sigan y cuán experimentados sean. Un código bien escrito, fácilmente comprensible, suficientemente documentado (idealmente autodocumentado), modular, ... introduce probablemente menos errores que lo contrario. Por lo tanto, la "necesidad" real, la presión o los costos / riesgos generales de mantenimiento / corrección de errores para pruebas extensas pueden no ser altos.
Llevemos al extremo donde sugirió un compañero de trabajo de mi equipo, tenemos que intentar probar nuestro código de capa de modelo Java EE puro con una cobertura deseada del 100% para todas las clases dentro y burlándose de la base de datos. O el administrador que desea que las pruebas de integración se cubran con un 100% de todos los posibles casos de uso del mundo real y flujos de trabajo de interfaz de usuario web porque no queremos arriesgarnos a que falle ningún caso de uso. Pero tenemos un presupuesto ajustado de aproximadamente 1 millón de euros, un plan bastante ajustado para codificar todo. Un entorno de cliente, donde los posibles errores de la aplicación 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 clave de clientes 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!
Yo mismo intento escribir una prueba si es posible y desarrollarla mientras la unidad prueba mi código. Pero a menudo lo hago desde un enfoque de arriba hacia abajo (prueba de integración) y trato de encontrar el buen punto, dónde hacer el "corte de la capa de la aplicación" para las pruebas importantes (a menudo en la capa del modelo). (porque a menudo se trata mucho de las "capas")
Además, el código de prueba de unidad e integración no tiene un impacto negativo en el tiempo, el dinero, el mantenimiento, la 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 muchas pruebas desarrolladas. código.
Entonces, diría que realmente depende mucho de la evaluación de la confianza y el costo / riesgo / beneficio ... como en la vida real, donde no puedes y no quieres correr con muchos o 100% mecanismos de seguridad.
El niño puede y debe subir a algún lugar y puede caerse y lastimarse. El automóvil 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, nunca, quiero conducir en la carretera y sostener mi volante separado en mis manos :)