Definiciones
creo que es importante definir sus términos antes de tener esta discusión.
La unidad de prueba prueba una sola unidad en aislamiento. Para mí, esa es una clase. Una prueba unitaria creará un objeto, invocará un método y verificará un resultado.Responde a la pregunta "¿mi código hace lo que pretendía que hiciera?"
Prueba de integración prueba la combinación de dos componentes en el sistema. Se centra en la relación entre los componentes, no los componentes mismos. Responde a la pregunta "¿estos componentes funcionan juntos como se esperaba?".
Prueba del sistema prueba todo el sistema de software. Responde a la pregunta "¿funciona este software como se esperaba?"
La prueba de aceptación es una forma automatizada para que el cliente responda la pregunta "¿este software es lo que creo que quiero?". Es un tipo de prueba del sistema.
Tenga en cuenta que ninguna de estas pruebas responde preguntas como "¿es útil este software?" o "¿este software es fácil de usar?".
Todas las pruebas automatizadas están limitadas por el axioma "extremo a extremo es más allá de lo que piense" - eventualmente un humano tiene que sentarse frente a una computadora y mirar su interfaz de usuario.
comparaciones
Las pruebas unitarias son más rápidas y más fáciles de escribir, más rápido de ejecutar, y más fácil de diagnosticar. No dependen de elementos "externos" como un sistema de archivos o una base de datos, por lo que son mucho más simples/más rápidos/confiables. La mayoría de las pruebas unitarias continúan funcionando a medida que se refactoriza (y las buenas pruebas unitarias son la única forma de refactorizar de forma segura). Requieren absolutamente que su código sea desacoplado, lo cual es difícil, a menos que primero escriba la prueba. Esta combinación de factores hace que la secuencia Red/Green/Refactor de TDD funcione tan bien.
Las pruebas del sistema son difíciles de escribir, ya que tienen que pasar por tanta configuración para llegar a una situación específica que desea probar. Son frágiles, porque cualquier cambio en el comportamiento del software anterior puede afectar la secuencia que conduce a la situación que desea probar, incluso si ese comportamiento no es relevante para la prueba. Son mucho más lentos que las pruebas unitarias por razones similares. Las fallas pueden ser muy difíciles de diagnosticar, tanto porque puede llevar mucho tiempo llegar al punto de falla como porque el software está involucrado en la falla. En algunos programas, las pruebas del sistema son muy difíciles de automatizar.
Las pruebas de integración se encuentran en el medio: son más fáciles de escribir, ejecutar y diagnosticar que las pruebas del sistema, pero con una cobertura más amplia que las pruebas unitarias.
Recomendación
utilizar una combinación de estrategias de ensayo para equilibrar los costos y los valores de cada uno.
Gracias. Saqué mucho de tu respuesta. –