Las pruebas de integración son pruebas que verifican si dos o más partes de un sistema funcionan correctamente cuando trabajan juntas. No se enfocan solamente en una función aislada, sino en la colaboración entre módulos, clases, servicios, bases de datos, archivos, colas de mensajes, APIs u otros componentes.
Un programa puede tener partes individuales bien construidas y, aun así, fallar cuando esas partes se conectan. Esto ocurre porque los componentes deben intercambiar datos, respetar formatos, manejar errores, compartir configuraciones y coordinar su comportamiento.
Por eso las pruebas de integración ocupan un lugar central dentro del testing: ayudan a descubrir problemas que no aparecen en una prueba unitaria, pero que todavía pueden detectarse antes de probar todo el sistema completo de punta a punta.
Podemos definirlas de esta manera:
Esta definición contiene varias ideas importantes:
Las pruebas unitarias ayudan a comprobar piezas pequeñas de código. Sin embargo, muchos defectos aparecen recién cuando esas piezas se conectan. Una clase puede estar bien programada, un servicio puede responder correctamente y una base de datos puede funcionar, pero la integración entre ellos puede fallar.
Algunos problemas frecuentes son:
Las pruebas de integración buscan exponer este tipo de fallas antes de que afecten flujos más grandes o lleguen al usuario final.
Para entender mejor este tipo de pruebas, conviene ubicarlas entre otros niveles de testing:
| Nivel | Qué verifica | Ejemplo |
|---|---|---|
| Prueba unitaria | Una unidad pequeña de código de forma aislada. | Una función que calcula el total de una compra. |
| Prueba de integración | La colaboración entre varias partes del sistema. | El servicio de compras guarda una orden y actualiza el stock en la base de datos. |
| Prueba de sistema | El comportamiento del sistema completo contra requisitos funcionales y no funcionales. | El sistema de ventas permite registrar, consultar y cancelar pedidos. |
| Prueba end-to-end | Un flujo completo desde la perspectiva del usuario o de un proceso externo. | Un usuario inicia sesión, compra un producto y recibe la confirmación. |
Las pruebas de integración no reemplazan a las pruebas unitarias ni a las pruebas end-to-end. Cada nivel observa el sistema desde una distancia distinta y aporta información diferente.
Una integración puede aparecer en muchos lugares. No siempre significa conectar sistemas enormes; a veces es simplemente comprobar que dos capas internas de una aplicación se entienden correctamente.
Algunos ejemplos de integraciones son:
Imaginemos una aplicación de comercio electrónico. Cuando un cliente confirma una compra, pueden intervenir varios componentes:
Una prueba unitaria puede verificar el cálculo del total. Pero una prueba de integración puede comprobar que, al confirmar una compra válida, se cree la orden, se actualice el stock y se registre el pago con los datos correctos.
Según el sistema, una prueba de integración puede verificar distintos aspectos:
También es importante aclarar algunos límites para no confundir este nivel de prueba con otros:
El alcance define qué componentes participan en la prueba y cuáles quedan fuera. Esta decisión es importante porque afecta la velocidad, la estabilidad y la utilidad del resultado.
Por ejemplo, una prueba puede incluir:
No existe un único alcance correcto para todos los casos. La elección depende del riesgo que se quiere cubrir y del costo de ejecutar la prueba.
En una prueba de integración, algunas dependencias pueden ser reales y otras simuladas. Por ejemplo, podemos probar un servicio real contra una base de datos real de pruebas, pero simular el proveedor de pagos para no hacer operaciones externas verdaderas.
La decisión debe ser consciente:
En temas posteriores estudiaremos con más detalle cuándo conviene usar stubs, fakes, servicios simulados o dependencias reales.
La diferencia principal está en el foco. Una prueba unitaria intenta aislar una unidad pequeña para comprobar su lógica. Una prueba de integración permite que varias partes interactúen para verificar el resultado conjunto.
| Aspecto | Prueba unitaria | Prueba de integración |
|---|---|---|
| Foco | Una unidad aislada. | La comunicación entre unidades o componentes. |
| Dependencias | Normalmente se reemplazan o simulan. | Algunas dependencias reales participan en la prueba. |
| Velocidad | Suele ser muy rápida. | Puede ser más lenta por usar recursos reales. |
| Defectos que detecta | Errores de lógica interna. | Errores de conexión, formato, configuración, persistencia y coordinación. |
Las pruebas de integración aportan varios beneficios al equipo:
Las pruebas de integración son muy útiles, pero también tienen desafíos:
Por eso no alcanza con escribir muchas pruebas de integración. Es necesario diseñarlas bien, mantenerlas claras y ejecutarlas en ambientes controlados.
Las pruebas de integración pueden ser diseñadas por testers, desarrolladores o ambos roles trabajando juntos. En muchos equipos, los desarrolladores escriben las pruebas técnicas que conectan capas internas, mientras que QA ayuda a identificar escenarios, riesgos y datos relevantes.
Lo importante es que el equipo tenga una comprensión compartida de las interfaces entre componentes. Una prueba de integración útil no solo ejecuta código: expresa una expectativa clara sobre cómo deben colaborar las partes del sistema.
Las pruebas de integración responden una pregunta fundamental: ¿las partes del sistema funcionan correctamente cuando se conectan entre sí?
Este tipo de prueba ayuda a pasar de la confianza en piezas aisladas a la confianza en colaboraciones reales. A medida que un sistema crece, las integraciones se vuelven puntos críticos porque concentran acuerdos, formatos, configuraciones, tiempos de respuesta y reglas compartidas.
En los próximos temas profundizaremos en los objetivos de las pruebas de integración, las estrategias para organizar el proceso, la preparación de ambientes y datos, y los distintos tipos de dependencias que suelen aparecer en sistemas reales.