3. Diferencias entre pruebas unitarias, de integración, de sistema y E2E

3.1 Introducción

Para entender bien las Pruebas End-to-End, es necesario ubicarlas dentro de una estrategia de testing más amplia. Un sistema puede probarse en distintos niveles: partes pequeñas, integración entre componentes, comportamiento del sistema completo y flujos reales de usuario.

Cada nivel responde preguntas diferentes. Una prueba unitaria puede decirnos si una función calcula bien. Una prueba de integración puede decirnos si dos módulos se comunican correctamente. Una prueba de sistema puede evaluar una funcionalidad completa. Una prueba E2E puede confirmar si un usuario logra completar un proceso real de principio a fin.

El objetivo de este tema no es volver a desarrollar en profundidad las pruebas unitarias o de integración, sino comprender sus diferencias para usar las pruebas E2E en el lugar correcto.

3.2 La idea de niveles de prueba

Un nivel de prueba indica qué tan grande es la parte del sistema que estamos evaluando y cuántas dependencias intervienen. Cuanto más bajo es el nivel, más aislada suele ser la prueba. Cuanto más alto es el nivel, más partes reales del sistema participan.

Los niveles de prueba no compiten entre sí. Se complementan para entregar distintos tipos de confianza sobre el producto.

Una estrategia madura no se basa únicamente en pruebas E2E. Combina pruebas pequeñas, medianas y grandes para detectar problemas con rapidez y validar los flujos importantes con suficiente realismo.

3.3 Pruebas unitarias

Las pruebas unitarias verifican una unidad pequeña del código, como una función, método, clase o componente aislado. Suelen ejecutarse rápido y permiten detectar errores cerca del origen.

Ejemplo: una función calcula el precio final de un producto aplicando descuento e impuesto. Una prueba unitaria puede verificar distintos valores de entrada y resultados esperados sin abrir una interfaz ni conectarse a una base de datos.

  • Ventaja principal: son rápidas, precisas y fáciles de ejecutar muchas veces.
  • Limitación: no demuestran que el flujo completo funcione para el usuario.
  • Uso adecuado: reglas de negocio, cálculos, validaciones y comportamientos internos bien delimitados.

3.4 Pruebas de integración

Las pruebas de integración verifican que dos o más partes del sistema colaboren correctamente. No se enfocan en una unidad aislada, sino en la comunicación entre componentes.

Ejemplo: un servicio recibe los datos de una compra, aplica reglas de negocio y guarda la orden en la base de datos. Una prueba de integración puede comprobar que esos elementos trabajan juntos correctamente.

  • Ventaja principal: detectan problemas de comunicación, contratos, datos y configuración.
  • Limitación: pueden no representar la experiencia completa del usuario.
  • Uso adecuado: servicios, repositorios, APIs internas, base de datos y comunicación entre módulos.

3.5 Pruebas de sistema

Las pruebas de sistema evalúan el sistema completo o una parte grande del sistema ya integrado. Su objetivo es comprobar que la aplicación cumple requisitos funcionales o no funcionales en un ambiente representativo.

Una prueba de sistema puede revisar una funcionalidad completa desde una perspectiva más amplia que una integración, pero no siempre está diseñada como un flujo real de usuario de extremo a extremo.

  • Ventaja principal: permiten evaluar el comportamiento del producto como conjunto.
  • Limitación: el alcance puede variar y no siempre reproduce una experiencia real completa.
  • Uso adecuado: validación de requisitos, comportamiento general y funcionalidades completas.

3.6 Pruebas End-to-End

Las pruebas End-to-End validan un flujo completo desde una entrada inicial hasta un resultado final observable. Se diseñan desde la perspectiva del usuario o de un proceso externo que usa el sistema.

Ejemplo: un usuario inicia sesión, busca un curso, lo compra, recibe una confirmación y luego ve el curso disponible en su cuenta. Ese recorrido atraviesa varias partes del sistema y comprueba una intención real.

  • Ventaja principal: entregan confianza sobre flujos críticos completos.
  • Limitación: suelen ser más lentas, costosas y sensibles a cambios del ambiente.
  • Uso adecuado: recorridos esenciales para usuarios, negocio u operación.

3.7 Comparación general

La siguiente tabla resume las diferencias principales:

Nivel Alcance Velocidad Confianza que aporta
Unitaria Unidad pequeña de código. Muy alta. La lógica aislada funciona correctamente.
Integración Comunicación entre componentes. Media o alta. Las partes conectadas colaboran correctamente.
Sistema Sistema completo o funcionalidad grande. Media. El producto cumple requisitos en un ambiente representativo.
End-to-End Flujo completo de usuario o proceso externo. Más baja. Un objetivo real puede completarse de principio a fin.

3.8 Ejemplo con una compra en línea

Tomemos una misma funcionalidad: comprar un producto en una tienda en línea. Según el nivel de prueba, el enfoque cambia:

Nivel Qué podría probar
Unitaria La función que calcula el total aplica correctamente descuentos e impuestos.
Integración El servicio de compras guarda la orden y descuenta stock en la base de datos.
Sistema La funcionalidad de compra cumple los requisitos definidos en un ambiente de prueba.
End-to-End Un usuario busca un producto, lo agrega al carrito, paga y ve la confirmación de compra.

La misma funcionalidad puede y suele necesitar varios niveles de prueba. Cada uno observa el problema desde una distancia distinta.

3.9 La pirámide de pruebas

Una forma habitual de representar la estrategia de testing es la pirámide de pruebas. En la base se ubican muchas pruebas pequeñas y rápidas. En la parte superior, menos pruebas grandes y más costosas.

Base: muchas pruebas unitarias. Centro: una cantidad moderada de pruebas de integración y sistema. Cima: pocas pruebas End-to-End, bien elegidas y orientadas a flujos críticos.

La idea no es seguir una cantidad exacta, sino evitar que toda la confianza dependa de pruebas E2E. Si se automatiza todo solo desde la interfaz y de punta a punta, la suite puede volverse lenta, frágil y difícil de diagnosticar.

3.10 Por qué no conviene reemplazar todo con E2E

Las pruebas E2E son atractivas porque se parecen mucho al uso real, pero no son la mejor herramienta para todo. Si una prueba E2E falla, puede haber muchas causas posibles: un error en la interfaz, un dato mal preparado, una API caída, una regla de negocio incorrecta o un problema de ambiente.

En cambio, una prueba más pequeña suele indicar con mayor precisión dónde está el problema. Por eso conviene probar los detalles internos con pruebas unitarias o de integración, y reservar E2E para validar recorridos completos.

  • Las pruebas unitarias ayudan a encontrar errores de lógica rápidamente.
  • Las pruebas de integración ayudan a descubrir problemas entre componentes.
  • Las pruebas de sistema ayudan a validar requisitos amplios.
  • Las pruebas E2E ayudan a confirmar que los flujos críticos funcionan para el usuario.

3.11 Cómo decidir qué nivel usar

Una pregunta práctica es: ¿cuál es el nivel más simple que puede darme confianza sobre lo que quiero comprobar?

Algunos criterios útiles son:

  • Si quiero validar una regla de cálculo, probablemente convenga una prueba unitaria.
  • Si quiero comprobar que un servicio guarda datos correctamente, probablemente convenga una prueba de integración.
  • Si quiero revisar que una funcionalidad completa cumple requisitos, puede convenir una prueba de sistema.
  • Si quiero confirmar que un usuario completa un objetivo real atravesando varias capas, conviene una prueba E2E.

La prueba E2E debe elegirse cuando el valor está en el recorrido completo, no solo en una parte del recorrido.

3.12 Señales de que falta una prueba E2E

Puede ser necesario agregar una prueba End-to-End cuando aparecen situaciones como estas:

  • Una funcionalidad tiene pruebas unitarias e integración, pero el usuario no logra completar el flujo.
  • Hay defectos frecuentes en recorridos críticos antes de publicar.
  • El equipo necesita una verificación rápida de que la aplicación está usable.
  • Un cambio pequeño en una capa rompe un proceso completo sin ser detectado.
  • El negocio necesita evidencia de que un proceso clave funciona de punta a punta.

En esos casos, una prueba E2E bien diseñada puede cubrir un riesgo que otros niveles no están observando.

3.13 Señales de que una prueba E2E está mal ubicada

También existen señales de que se está usando E2E para algo que debería probarse en otro nivel:

  • La prueba existe solo para comprobar un mensaje o una validación mínima.
  • El mismo flujo se repite muchas veces cambiando solo un valor de entrada.
  • La prueba tarda mucho y falla por detalles que no afectan el objetivo del usuario.
  • El diagnóstico de fallas es difícil porque el escenario acumula demasiadas verificaciones.
  • La lógica principal podría probarse de forma más rápida y clara en una función o servicio.

Cuando esto ocurre, conviene mover parte de la cobertura a pruebas unitarias o de integración, y dejar en E2E solo el flujo representativo.

3.14 Qué debes recordar de este tema

  • Las pruebas unitarias verifican unidades pequeñas de código.
  • Las pruebas de integración verifican la colaboración entre componentes.
  • Las pruebas de sistema evalúan el producto o una funcionalidad amplia en conjunto.
  • Las pruebas End-to-End validan flujos completos desde la perspectiva del usuario.
  • Los niveles de prueba se complementan y no deberían reemplazarse entre sí.
  • Las pruebas E2E deben ser pocas, valiosas y enfocadas en procesos críticos.
  • La mejor estrategia combina pruebas rápidas para detalles internos y pruebas E2E para confianza global.

3.15 Conclusión

Las pruebas End-to-End ocupan un lugar importante, pero no son la única forma de probar una aplicación. Su fortaleza está en validar flujos reales completos; su debilidad es que suelen ser más lentas y más difíciles de mantener que las pruebas pequeñas.

Una buena estrategia usa cada nivel para lo que mejor resuelve. Las pruebas unitarias e integración dan velocidad y precisión. Las pruebas de sistema y E2E aportan confianza sobre comportamientos más amplios.

En el próximo tema veremos cuándo conviene usar pruebas End-to-End y cuándo es mejor elegir otro tipo de prueba.