Gestión de Pruebas de Software: Conceptos Esenciales y Metodologías de Testing

Clasificado en Diseño e Ingeniería

Escrito el en español con un tamaño de 8,25 KB

Introducción a la Gestión de Pruebas

Conceptos Fundamentales

  • Defectos: Un **defecto** es un error, fallo o discrepancia no deseada, comúnmente conocido como *bug*.
  • Causas:
    • Errores en el **código**
    • Falta de **requisitos** claros
    • Gestión inadecuada de **cambios**
    • **Integración defectuosa** de componentes
  • Impacto:
    • Fallos en el sistema
    • Poca **seguridad**
    • Baja **satisfacción** del usuario
    • **Costos** elevados
  • Solución:
    • Identificación mediante **pruebas**
    • **Reporte detallado** del defecto
    • **Priorización y asignación** para su corrección
    • **Validación post-corrección**

Pruebas y Gestión de Pruebas

Pruebas: Proceso para evaluar la **funcionalidad** de un sistema y determinar si cumple con los **requisitos** establecidos.

Gestión de Pruebas: Proceso de **supervisar, controlar y dirigir** todas las actividades relacionadas con las pruebas de software.

Beneficios de la Gestión de Pruebas

  • **Aseguramiento de la calidad**
  • **Minimización de riesgos**
  • Mejora de la **experiencia de usuario (UX)**

Roles en las Pruebas

  • Desarrolladores: Realizan principalmente **pruebas unitarias**.
  • Testers: Diseñan y ejecutan **casos de prueba**, realizan **pruebas manuales** o **automatizadas**, y efectúan la **evaluación externa** del software.
  • *Stakeholders*: Participan en las **pruebas de aceptación** y proporcionan **retroalimentación**.
  • Equipos de Integración: Realizan **pruebas de integración** para asegurar el correcto funcionamiento del sistema en su conjunto.

Tipos de Pruebas

Pruebas Funcionales

  • **Unitarias**
  • **Integración**
  • **Sistema**
  • **Aceptación**

Pruebas No Funcionales

  • **Volumen**
  • **Estrés**
  • **Rendimiento**
  • **Usabilidad**
  • **Seguridad**
  • **Instalación**
  • **Documentación**


Pruebas Unitarias

Verifican unidades individuales de software. Consideraciones clave: **aislamiento**, **automatización**, **cobertura**, uso de *mocks* y *stubs*, y que sean **rápidas**.

Pruebas de Integración

Exponen defectos entre las **interfaces** y en las **interacciones** de componentes integrados. Consideraciones: **interfaces**, **integración incremental**, *stubs* y *drivers*, **datos compartidos** y **gestión de errores**.

Pruebas de Sistema

Verificación total del sistema para asegurar su **funcionamiento** global. Consideraciones: cumplimiento de **requisitos**, **entorno** de prueba, **interacción** entre módulos y **rendimiento**.

Pruebas de Aceptación

Verifican el sistema según las expectativas del **cliente**. Consideraciones: **criterios de aceptación**, participación del **cliente**, **escenarios de uso** y **documentación**.

Pruebas de Volumen

Evalúan el sistema con **grandes cantidades de datos**.

Pruebas de Estrés

Evalúan el sistema en **condiciones extremas** o de **sobrecarga**.

Pruebas de Rendimiento

Evalúan el sistema bajo **condiciones específicas de carga** y **concurrencia**.

Pruebas de Usabilidad

Evalúan la **experiencia de usuario (UX)** al interactuar con el sistema.

Pruebas de Seguridad

Identifican **vulnerabilidades** y **amenazas** en el sistema.

Pruebas de Instalación

Evalúan el proceso de **instalación** y **desinstalación** del software.

Pruebas de Documentación

Evalúan la **calidad, claridad y utilidad** de la documentación del software.


Pruebas de Caja Negra

Verifican que el software cumpla con las **especificaciones** y realice las **funciones esperadas** sin considerar su estructura interna. Pueden incluir: **pruebas de partición**, **valores límite** y **tablas de decisión**.

Pruebas de Caja Blanca

Aseguran que todas las **rutas lógicas** sean probadas e identifican errores en **bucles**, **condiciones** y **secuencias**. Pueden incluir: **cobertura de código**, **camino básico** y **pruebas de lazo**.


Pruebas Unitarias

Concepto

Validación individual de componentes de software, como **funciones, métodos o clases**.

Objetivos

  • **Detección temprana de errores**
  • Facilita la **refactorización** del código
  • Promueve un **mejor diseño** de software

Ventajas

  • **Reducción de *bugs***
  • **Disminución de costos** a largo plazo
  • **Mejora la calidad del código**
  • Aumenta la **confianza** en el software

Características

  • **Automatizables**
  • **Completas** (en su alcance)
  • **Repetibles**
  • **Independientes** entre sí

Desarrollo Dirigido por Pruebas (TDD)

Metodología de desarrollo con un **ciclo corto de retroalimentación**: **escribir la prueba**, **escribir el código** y **refactorizar**. Sus beneficios incluyen: **calidad del código**, **simplicidad** y **confianza** en el software.


JUnit

**JUnit** es un *framework* de **pruebas unitarias para Java**, desarrollado por **Kent Beck y Erich Gamma**. Forma parte de la familia *xUnit*.

Ventajas

  • **Popularidad** y amplia comunidad
  • **Fácil integración** con entornos de desarrollo
  • Facilita la implementación de **TDD**

Anotaciones Comunes

  • `@Test`
  • `@BeforeAll`
  • `@AfterAll`
  • `@Disabled`
  • `@DisplayName`
  • `@RepeatedTest`
  • `@ParameterizedTest`

Aserciones Comunes

Evalúan si una condición es verdadera; de lo contrario, la prueba falla. Ejemplos:

  • `assertEquals`
  • `assertNotEquals`
  • `assertTrue`
  • `assertFalse`
  • `assertNull`
  • `assertNotNull`
  • `assertArrayEquals`
  • `assertThrows`
  • `assertTimeout`

Pruebas de Integración

Concepto

Validan la **interacción** entre distintas partes del sistema y evalúan el **funcionamiento conjunto** de los componentes.

Necesidad

Son necesarias para:

  • **Detectar problemas** de interfaz
  • Asegurar el **flujo de datos** correcto
  • Validar la **interoperabilidad** de componentes
  • Manejar la **diversidad lógica**
  • Adaptarse a **cambios estructurales**

Tipos de Estrategias

  • **Top-Down**
  • **Bottom-Up**
  • **Big Bang**

Momento de Realización

Se realizan:

  • Después de las **pruebas unitarias**
  • Durante la **integración de funcionalidades**
  • Tras **actualizaciones** significativas
  • Antes del **despliegue**
  • En un *pipeline* de **CI/CD** (Integración Continua/Despliegue Continuo)

Ventajas

  • **Resolución temprana** de problemas
  • Identificación de **problemas de integración**
  • Mayor **cobertura** y **exhaustividad** en las pruebas

Desventajas

  • **Complejidad** en la configuración
  • **Dependencia de componentes externos**
  • **Costo** en tiempo y recursos

Desafíos

  • **Complejidad** inherente
  • Gestión de **recursos** (costo y tiempo)

Casos de Uso Comunes

  • **APIs externas o internas**
  • **Bases de datos**
  • Módulos de **interfaz de usuario** con *backend*

Técnicas de Diseño

  • **Diagramas de secuencia**
  • **Casos de prueba** basados en flujos de negocio

Herramientas Comunes

  • **JUnit** y **TestNG** (para Java)
  • **Pytest** (para Python)
  • **Postman** (para APIs)

Automatización

Herramientas como **Jenkins** o **GitLab CI/CD** permiten la automatización, lo que resulta en **rapidez** y **menos errores**.

@Test
    public void testDesplazamientoPositivo(){
        assertEquals("DEFG", Cesar.cifrar("ABCD",3));
    }

Entradas relacionadas: