Software Testing: Black Box and White Box Testing
En el desarrollo de software no basta con que una aplicación “funcione” en una demostración. También debe responder correctamente ante entradas válidas e inválidas, integrarse con otros componentes, mantener un rendimiento aceptable, proteger los datos, recuperarse de fallos y ofrecer una experiencia de uso adecuada. Ahí es donde entran el aseguramiento de la calidad y las pruebas de software.
Nota de actualización: este artículo fue publicado originalmente el 24 de julio de 2023 y ha sido revisado para incorporar terminología actual de ISTQB y el modelo de calidad de producto ISO/IEC 25010:2023, publicado posteriormente, en noviembre de 2023.
Quality Assurance (QA) o aseguramiento de la calidad es un concepto más amplio que las pruebas. Incluye los procesos, prácticas, criterios, revisiones y controles utilizados para reducir defectos y conseguir que el producto alcance el nivel de calidad esperado.
Las pruebas de software forman parte de ese trabajo de calidad. Consisten en evaluar un producto, componente o sistema para obtener información sobre su comportamiento y detectar diferencias entre lo esperado y lo observado. No se limitan a “buscar bugs”: también sirven para generar confianza sobre el producto y aportar información para decidir si una versión está lista para avanzar o publicarse.
La calidad tampoco se consigue probando únicamente al final. Las revisiones de requisitos, el análisis estático, las pruebas de componentes, la integración continua y las pruebas de sistema permiten detectar problemas en diferentes momentos del ciclo de desarrollo.
Una confusión frecuente es colocar en una misma lista las pruebas unitarias, de integración, funcionales, de regresión y de caja negra. En realidad describen cosas diferentes.
Por tanto, una prueba de integración puede ser funcional o no funcional; una prueba de sistema puede medir rendimiento; y una prueba funcional puede diseñarse mediante técnicas de caja negra. Caja negra y caja blanca no son subcategorías exclusivas de las pruebas funcionales.
Las pruebas funcionales comprueban qué hace el sistema: reglas de negocio, cálculos, validaciones, flujos, permisos, respuestas de una API, operaciones sobre datos o cualquier comportamiento definido por requisitos y criterios de aceptación.
Un ejemplo sencillo sería un formulario de inicio de sesión. Entre las pruebas funcionales podrían estar comprobar credenciales válidas e inválidas, recuperación de contraseña, autenticación multifactor, bloqueo de cuentas y permisos según el rol del usuario.
Comprueban unidades pequeñas y aislables, como una función, clase, módulo o componente. Suelen ejecutarse muy pronto y, en proyectos modernos, normalmente se automatizan para formar parte del proceso de integración continua.
Una buena prueba unitaria debe ser rápida, repetible y suficientemente aislada para que, cuando falle, resulte sencillo identificar qué parte del comportamiento se rompió. Sin embargo, tener muchas pruebas unitarias no sustituye las pruebas de integración o de sistema.
Verifican la interacción entre componentes: módulos internos, bases de datos, colas, APIs, servicios externos o microservicios. Un módulo puede funcionar perfectamente por separado y fallar cuando cambia un contrato, un formato de datos, un tiempo de espera o una dependencia.
No existe una regla según la cual estas pruebas deban pertenecer exclusivamente a un equipo de QA. Dependiendo del proyecto pueden escribirlas y ejecutarlas desarrolladores, ingenieros de calidad o ambos. Lo importante es que existan responsabilidades claras y cobertura sobre las interfaces críticas.
Evalúan el sistema integrado como un conjunto. Aquí se comprueban flujos completos y requisitos que no pueden validarse correctamente observando un componente aislado. En una aplicación web, por ejemplo, se puede verificar desde la autenticación hasta una operación de negocio completa que involucre frontend, backend y base de datos.
Determinan si el producto satisface las necesidades y criterios de aceptación acordados con usuarios, clientes o partes interesadas. Pueden incluir pruebas de aceptación de usuario, operacionales, contractuales o regulatorias según el contexto.
No tienen que ser necesariamente manuales. Parte de los criterios puede automatizarse, mientras que otros requieren evaluación humana. El objetivo no es repetir todas las pruebas anteriores, sino responder si el producto es aceptable para el uso previsto.
Una prueba de humo es un conjunto reducido de verificaciones sobre funciones críticas que permite saber rápidamente si una versión es suficientemente estable como para continuar con pruebas más profundas. Es muy útil después de un despliegue o de generar una nueva build.
Puede ser manual o automatizada y no constituye un nivel de prueba independiente. Tampoco existe una posición obligatoria “entre integración y regresión”: se utiliza donde aporte una comprobación rápida de salud del sistema.
Las pruebas de confirmación verifican que un defecto concreto haya sido corregido. Las pruebas de regresión comprueban que el cambio no haya introducido efectos secundarios en funcionalidades que antes funcionaban.
La regresión es uno de los mejores candidatos para automatización cuando los casos son repetitivos, estables y se ejecutan con frecuencia. Aun así, automatizar un caso que cambia constantemente puede generar más mantenimiento que beneficio.
Las interfaces entre sistemas merecen pruebas específicas: códigos de estado, contratos, esquemas, autenticación, autorización, idempotencia, errores, límites, compatibilidad de versiones y comportamiento ante dependencias no disponibles. En arquitecturas distribuidas estas pruebas suelen detectar problemas antes y con menos coste que una prueba gráfica de extremo a extremo.
Las pruebas no funcionales evalúan propiedades de calidad que describen cómo se comporta el producto y bajo qué condiciones lo hace. No son pruebas “secundarias”: una aplicación puede cumplir todas sus funciones y seguir siendo inaceptable si es lenta, insegura, inaccesible o incapaz de recuperarse de un fallo.
ISO/IEC 25010:2023 define un modelo de calidad de producto con nueve características: adecuación funcional, eficiencia del rendimiento, compatibilidad, capacidad de interacción, fiabilidad, seguridad, mantenibilidad, flexibilidad y seguridad operacional (safety). La norma es un modelo de calidad, no una lista rígida de tipos de prueba, pero sirve como una referencia muy útil para identificar qué atributos deben medirse.
Evalúan tiempos de respuesta, rendimiento sostenido, uso de recursos y capacidad bajo condiciones definidas. Medir únicamente “cuánto tarda una página” suele ser insuficiente: en sistemas reales interesan métricas como latencia media y percentiles —por ejemplo p95 o p99—, transacciones por segundo, concurrencia, utilización de CPU y memoria, saturación y tasa de errores.
Buscan identificar debilidades que puedan afectar la confidencialidad, integridad, autenticidad, autorización o disponibilidad del sistema. Deben abarcar más que la aplicación web: código, dependencias, configuración, APIs, identidad, sesiones, infraestructura y lógica de negocio pueden introducir vulnerabilidades.
En una estrategia moderna se combinan revisiones de código, análisis estático, análisis de dependencias, pruebas dinámicas, validación de configuración y pruebas manuales orientadas a riesgo. Para aplicaciones web, la OWASP Web Security Testing Guide es una referencia práctica ampliamente utilizada.
Una interfaz puede ser técnicamente correcta y aun así resultar difícil de aprender, propensa a errores o inaccesible. Las pruebas de interacción y usabilidad observan si las personas pueden completar sus tareas con claridad y eficiencia.
En productos web, la accesibilidad debe verificarse con criterios técnicos y también con pruebas reales de teclado, foco, lectores de pantalla y otros mecanismos de asistencia. Las WCAG 2.2 del W3C son actualmente una referencia fundamental para evaluar accesibilidad web.
Comprueban el comportamiento en navegadores, sistemas operativos, dispositivos, resoluciones, versiones de protocolos y combinaciones de componentes. La interoperabilidad evalúa además si distintos productos pueden intercambiar información y utilizar correctamente la información intercambiada.
Evalúan la capacidad del sistema para continuar prestando servicio o recuperarse ante fallos: pérdida temporal de red, caída de una dependencia, reinicios, corrupción de datos, falta de espacio, límites de recursos o errores parciales. En sistemas críticos conviene probar explícitamente los mecanismos de recuperación y no asumir que “deberían funcionar”.
La escalabilidad estudia cómo responde el sistema al crecimiento de carga, usuarios, datos o recursos. ISO/IEC 25010:2023 incorpora la escalabilidad dentro de la característica de flexibilidad, junto con aspectos como adaptabilidad, instalabilidad y reemplazabilidad.
La automatización no convierte automáticamente una prueba en mejor. Su principal ventaja es la repetibilidad: permite ejecutar el mismo conjunto de verificaciones de forma rápida y consistente, integrarlo en CI/CD y obtener retroalimentación frecuente.
Las pruebas manuales siguen siendo valiosas para exploración, evaluación de experiencia de usuario, escenarios poco frecuentes, investigación de defectos y comprobaciones donde el juicio humano aporta información que un script no puede valorar por sí solo.
Una automatización mal diseñada también puede fallar: datos inestables, dependencias externas, temporizaciones frágiles o selectores de interfaz poco robustos generan pruebas intermitentes o flaky. Por eso conviene automatizar primero los casos repetitivos, críticos y suficientemente estables, y mantener una proporción razonable entre pruebas de componentes, APIs e interfaz gráfica.
Supongamos que desarrollamos el acceso a una aplicación empresarial. Una estrategia razonable podría combinar:
Ese ejemplo muestra por qué no existe una única “prueba correcta”. La cobertura útil surge de combinar niveles, tipos y técnicas según el riesgo del producto.
La herramienta depende del tipo de prueba y de la tecnología. Algunas opciones ampliamente utilizadas son:
No conviene elegir una herramienta solo por popularidad. Hay que valorar integración con el stack, mantenimiento de las pruebas, facilidad para depurar fallos, ejecución paralela, integración con CI/CD y coste operativo.
El aseguramiento de la calidad no consiste en ejecutar una batería de pruebas al terminar el proyecto. Es una actividad continua que comienza con requisitos claros y criterios de aceptación verificables, y continúa con revisiones, pruebas en distintos niveles, automatización donde aporte valor y evaluación de atributos no funcionales.
La distinción entre funcional y no funcional sigue siendo útil, pero no debe confundirse con los niveles de prueba ni con técnicas como caja negra o caja blanca. Un plan de pruebas eficaz combina todas esas dimensiones y prioriza según el riesgo: qué puede fallar, qué impacto tendría y qué evidencia necesitamos antes de liberar el producto.
Este artículo forma parte de nuestra serie de pruebas y aseguramiento de la calidad del software:
Guía completa de PHP 8.5: fundamentos, instalación, Composer, PSR, Laravel, Symfony, APIs, seguridad, rendimiento y…
Guía actualizada para instalar y diagnosticar Oracle VirtualBox Guest Additions 7.2.20 en GNU/Linux: headers, módulos,…
Guía de introducción a Kali Linux 2026.2: historia, rolling release, usos legítimos, herramientas, metapaquetes, VMs,…
Guía práctica para elegir herramientas de automatización de pruebas: unitarias, integración, API, contratos, Selenium, Playwright,…
Roadmap completo para aprender redes desde cero y prepararse como sysadmin: Ethernet, IPv4/IPv6, subnetting, VLAN,…
Historia y arquitectura del sistema de reservas de United Airlines diseñado por Evelyn Berezin, diferenciándolo…