9. Niveles de prueba: unitarias, integración, sistema y aceptación

9.1 Introducción

Un sistema de software puede probarse en distintos niveles. No es lo mismo comprobar una función aislada que revisar un flujo completo de negocio. Cada nivel de prueba observa el producto desde una perspectiva diferente.

Los niveles más habituales son: pruebas unitarias, pruebas de integración, pruebas de sistema y pruebas de aceptación. En este tema veremos qué significa cada uno, qué tipo de defectos ayuda a encontrar y cómo se relacionan entre sí.

Conocer estos niveles permite organizar mejor el esfuerzo de testing y evitar una confusión frecuente: intentar encontrar todos los problemas con un solo tipo de prueba.

9.2 ¿Qué es un nivel de prueba?

Un nivel de prueba es una etapa o perspectiva desde la cual evaluamos el software. Cada nivel tiene un alcance distinto:

  • Una parte pequeña del código.
  • La comunicación entre componentes.
  • El sistema completo.
  • La aceptación por parte del usuario o del negocio.

La idea no es elegir un único nivel, sino combinarlos. Los defectos simples deberían detectarse temprano y cerca de su origen. Los defectos de flujo completo se detectan mejor cuando el sistema se prueba como un todo.

9.3 Pruebas unitarias

Las pruebas unitarias verifican unidades pequeñas de código de forma aislada. Una unidad puede ser una función, un método, una clase o un componente pequeño, según el lenguaje y la arquitectura.

Su objetivo es comprobar que una pieza específica se comporta correctamente ante entradas conocidas.

Ejemplos:

  • Verificar que una función calcule correctamente un descuento.
  • Comprobar que una validación rechace correos con formato inválido.
  • Confirmar que un método devuelva una lista ordenada.
  • Probar que una función calcule impuestos según una regla de negocio.

Estas pruebas suelen ser escritas por desarrolladores y se ejecutan con mucha frecuencia porque son rápidas y ayudan a detectar errores cerca del código que los produce.

9.4 Ventajas y límites de las pruebas unitarias

Las pruebas unitarias tienen varias ventajas:

  • Son rápidas.
  • Ayudan a detectar defectos temprano.
  • Facilitan cambios y refactoring.
  • Documentan el comportamiento esperado de partes pequeñas del código.
  • Permiten localizar errores con mayor precisión.

Pero también tienen límites:

  • No garantizan que los componentes se integren correctamente.
  • No prueban flujos completos de usuario.
  • No detectan todos los problemas de configuración o ambiente.
  • Pueden dar falsa confianza si se prueban detalles poco relevantes.

Una aplicación puede tener muchas pruebas unitarias correctas y aun así fallar cuando sus partes trabajan juntas.

9.5 Pruebas de integración

Las pruebas de integración verifican que dos o más componentes funcionen correctamente cuando interactúan. Su foco no está en una unidad aislada, sino en la comunicación entre partes.

Ejemplos de integración:

  • Un servicio que consulta una base de datos.
  • Un módulo de ventas que se comunica con un módulo de stock.
  • Una aplicación que consume una API externa.
  • Un frontend que envía datos a un backend.
  • Un sistema que genera un pago mediante una pasarela externa.

Estas pruebas ayudan a encontrar defectos que no aparecen cuando cada componente se prueba por separado.

9.6 Defectos típicos en integración

Muchos problemas aparecen en los puntos donde los sistemas se conectan. Algunos defectos típicos son:

  • Formato de datos incompatible.
  • Campos obligatorios no enviados.
  • Interpretación distinta de códigos de error.
  • Problemas de autenticación entre servicios.
  • Errores de configuración de ambiente.
  • Diferencias entre nombres de campos esperados y recibidos.
  • Timeouts o respuestas lentas de servicios externos.

Por ejemplo, una prueba unitaria puede confirmar que el sistema calcula bien el total de una compra, pero una prueba de integración puede descubrir que el módulo de pagos recibe el importe con un formato incorrecto.

9.7 Pruebas de sistema

Las pruebas de sistema evalúan el sistema completo ya integrado. El objetivo es comprobar que el producto funciona como un conjunto y cumple los requisitos definidos.

En este nivel se prueban flujos completos y comportamientos visibles para el usuario o para otros sistemas. Por ejemplo:

  • Registrar un usuario, iniciar sesión y actualizar su perfil.
  • Buscar un producto, agregarlo al carrito y confirmar la compra.
  • Crear una factura, enviarla por correo y consultarla luego.
  • Generar un reporte con filtros y exportarlo.
  • Validar permisos de distintos tipos de usuario en varias pantallas.

Las pruebas de sistema suelen incluir pruebas funcionales y también pueden incluir pruebas no funcionales, como rendimiento, seguridad, compatibilidad o usabilidad.

9.8 Alcance de las pruebas de sistema

En pruebas de sistema se revisa el comportamiento general. Esto puede incluir:

  • Requisitos funcionales.
  • Reglas de negocio.
  • Flujos principales y alternativos.
  • Manejo de errores.
  • Permisos y roles.
  • Interfaz de usuario.
  • Persistencia de datos.
  • Compatibilidad con navegadores o dispositivos.
  • Configuraciones del ambiente.

Este nivel se acerca más a la experiencia real de uso, pero suele ser más costoso y lento que las pruebas unitarias o de integración.

9.9 Pruebas de aceptación

Las pruebas de aceptación buscan confirmar que el sistema satisface las necesidades del usuario, del cliente o del negocio. Están relacionadas con la validación: no solo importa que el sistema funcione, sino que sea aceptable para su propósito.

Estas pruebas pueden ser realizadas por usuarios, representantes del negocio, clientes, product owners o testers con criterios definidos por el negocio.

Ejemplos:

  • Un usuario de administración valida que el reporte mensual contiene la información que necesita.
  • El cliente confirma que el flujo de registro cumple lo acordado.
  • El product owner revisa que una historia de usuario cumple sus criterios de aceptación.
  • Un grupo piloto utiliza una funcionalidad antes de liberarla a todos los usuarios.

Una prueba de aceptación puede detectar que el sistema cumple técnicamente, pero no resulta útil o claro para el usuario real.

9.10 Comparación de niveles

Nivel Qué prueba Quién suele participar Ejemplo
Unitario Una parte pequeña del código. Desarrolladores. Una función que calcula descuentos.
Integración Comunicación entre componentes. Desarrolladores y testers técnicos. Backend que guarda una compra en base de datos.
Sistema El producto completo integrado. Testers, desarrolladores y equipo de QA. Flujo completo de compra.
Aceptación Necesidad del usuario o negocio. Usuarios, cliente, negocio, product owner y QA. Validar que el reporte sirve para la operación mensual.

9.11 Ejemplo completo: tienda en línea

Supongamos que estamos probando una tienda en línea. La funcionalidad permite comprar un producto con descuento.

Nivel Prueba posible
Unitaria Verificar que la función de descuento calcule $900 para una compra de $1000 con 10% de descuento.
Integración Comprobar que el carrito envíe el total correcto al módulo de pagos.
Sistema Realizar el flujo completo: buscar producto, agregar al carrito, aplicar descuento, pagar y recibir confirmación.
Aceptación Confirmar con negocio que la promoción se aplica según las reglas comerciales acordadas.

El mismo requisito puede evaluarse en distintos niveles. Cada nivel aporta información diferente.

9.12 Pirámide de pruebas

La pirámide de pruebas es una idea usada para explicar el equilibrio entre niveles. En general, recomienda tener muchas pruebas rápidas de bajo nivel, una cantidad moderada de pruebas de integración y menos pruebas completas de extremo a extremo o sistema, porque suelen ser más lentas y costosas.

Una forma simple de entenderla:

  • Base: muchas pruebas unitarias, rápidas y específicas.
  • Centro: pruebas de integración para comprobar colaboración entre partes.
  • Parte superior: menos pruebas de sistema o end-to-end, enfocadas en flujos críticos.

La pirámide no es una regla rígida. Es una guía para evitar depender únicamente de pruebas lentas y frágiles. El equilibrio real depende del contexto.

9.13 ¿En qué nivel conviene encontrar un defecto?

Como regla general, conviene encontrar un defecto en el nivel más bajo posible. Si una función calcula mal un impuesto, es mejor descubrirlo con una prueba unitaria que recién durante una prueba completa de facturación.

Encontrar defectos en niveles bajos suele tener ventajas:

  • La causa está más localizada.
  • La corrección suele ser más rápida.
  • La prueba se ejecuta antes y con menor costo.
  • Se evita que el defecto bloquee pruebas de niveles superiores.

Sin embargo, algunos defectos solo aparecen al integrar partes o ejecutar flujos completos. Por eso todos los niveles siguen siendo necesarios.

9.14 Riesgos de depender de un solo nivel

Depender de un solo nivel de prueba puede dejar huecos importantes:

  • Solo pruebas unitarias: pueden no detectar problemas de integración o experiencia de usuario.
  • Solo pruebas de integración: pueden dejar errores simples sin detectar temprano.
  • Solo pruebas de sistema: pueden ser lentas y dificultar localizar la causa de los defectos.
  • Solo pruebas de aceptación: pueden descubrir tarde problemas técnicos que debieron encontrarse antes.

Una estrategia sólida combina niveles para equilibrar rapidez, profundidad, cobertura y confianza.

9.15 Relación con ambientes de prueba

Cada nivel puede requerir ambientes diferentes. Una prueba unitaria puede ejecutarse en la máquina del desarrollador. Una prueba de integración puede necesitar una base de datos o un servicio de prueba. Una prueba de sistema puede requerir una versión desplegada en un ambiente similar a producción.

Ejemplos de ambientes:

  • Local: usado por desarrolladores durante la implementación.
  • Integración: usado para comprobar comunicación entre componentes.
  • Testing o QA: usado por testers para validar funcionalidades.
  • Preproducción: ambiente lo más parecido posible a producción.
  • Producción: ambiente real usado por usuarios finales.

Cuanto más alto es el nivel de prueba, más importante suele ser que el ambiente represente correctamente el uso real.

9.16 Errores comunes

Al trabajar con niveles de prueba, algunos errores frecuentes son:

  • Creer que las pruebas unitarias reemplazan todas las demás.
  • Probar solo desde la interfaz de usuario y dejar defectos técnicos para el final.
  • No ejecutar pruebas de integración hasta etapas muy tardías.
  • Confundir pruebas de sistema con pruebas de aceptación.
  • No involucrar al negocio en la aceptación.
  • Automatizar flujos completos inestables cuando sería mejor probar partes más pequeñas.
  • No definir qué nivel cubrirá cada riesgo importante.

Estos errores pueden generar pruebas lentas, repetidas o incapaces de detectar los defectos más importantes a tiempo.

9.17 Buenas prácticas

Para organizar bien los niveles de prueba conviene:

  • Probar lógica importante con pruebas unitarias.
  • Validar integraciones críticas de forma temprana.
  • Reservar pruebas de sistema para flujos relevantes y comportamiento completo.
  • Definir criterios de aceptación claros con negocio o usuarios representativos.
  • Evitar duplicar innecesariamente la misma verificación en todos los niveles.
  • Ejecutar pruebas rápidas con frecuencia.
  • Usar pruebas de regresión para funcionalidades críticas.
  • Elegir el nivel adecuado según riesgo, costo y tipo de defecto esperado.

Una buena estrategia no mide calidad solo por cantidad de pruebas, sino por el valor que aporta cada nivel.

9.18 Qué debes recordar de este tema

  • Los niveles de prueba permiten evaluar el software desde distintas perspectivas.
  • Las pruebas unitarias verifican partes pequeñas de código.
  • Las pruebas de integración verifican la comunicación entre componentes.
  • Las pruebas de sistema evalúan el producto completo integrado.
  • Las pruebas de aceptación confirman si el producto satisface al usuario o negocio.
  • Conviene encontrar defectos en el nivel más bajo posible, pero todos los niveles son necesarios.
  • La pirámide de pruebas ayuda a equilibrar rapidez, costo y confianza.
  • Una estrategia sólida combina niveles según el contexto y los riesgos.

9.19 Conclusión

Los niveles de prueba organizan el testing de manera más efectiva. Cada nivel responde preguntas distintas: si una unidad funciona, si las partes se comunican, si el sistema completo cumple los requisitos y si el producto satisface al usuario o al negocio.

No existe un único nivel suficiente para todo. Las pruebas unitarias aportan rapidez, las de integración detectan problemas de comunicación, las de sistema revisan flujos completos y las de aceptación validan valor real.

En el próximo tema estudiaremos los tipos de prueba: funcionales y no funcionales, para comprender qué aspectos del producto podemos evaluar más allá del nivel donde se ejecuten.