### Pruebas de Software
* Definición
* Metas
* Validación
* Modelo de Entrada-Salida
* Verificación vs. Validación
* Inspecciones y Pruebas
* Ventajas de Inspecciones
* Etapas de Prueba
* Pruebas de Desarrollo
* Pruebas Unitarias
* Pruebas de Clases
* Pruebas automatizadas
* Pruebas de Interface
* Pruebas del Sistema
* Pruebas de Componentes
* Pruebas de Casos de Uso
* Políticas de Pruebas
* Pruebas de Regresión
---
### ¿Por qué probar software?
* El 80% del costo del ciclo de vida del software puede provenir de defectos no detectados tempranamente.
* Un bug crítico puede costar millones o incluso poner en riesgo vidas humanas.
* Las pruebas no son solo “buscar errores”, sino **aumentar la confianza** en el sistema.
* Las pruebas efectivas son parte de la **ingeniería de calidad**, no solo una tarea final.
---
### Pruebas de Software
* La prueba intenta demostrar que un programa hace lo que se debe hacer y descubre los defectos del
programa antes de su puesta en uso.
* Al probar el software, se ejecuta un programa que utiliza los datos artificiales.
* Se comprueban errores, anomalías y los atributos no funcionales del sistema.
* Las pruebas son parte de un proceso de verificación y validación más general, que incluye también
técnicas de validación estáticas.
---
### Pruebas de Software
**Puede revelar la presencia de errores, no sus ausencias.**
---
### Metas de la prueba de software
* Demostrar al desarrollador y al cliente que el software cumpla con sus requisitos.
* Para el software personalizado, esto significa que debe haber por lo menos una prueba por cada requisito en el
documento de requisitos.
* Para los productos de software genérico, significa que debe haber pruebas para todas las funciones del sistema,
además de combinaciones de estas características, que se incorporarán en la versión del producto.
* Descubrir las situaciones en las que el comportamiento del software es incorrecta,
indeseable o no se ajusta a su especificación.
* Pruebas de defectos se ocupa de erradicar el comportamiento del sistema no deseado, tales como fallos
del sistema, las interacciones no deseadas con otros sistemas, cálculos incorrectos y corrupción de datos.
---
### Validación y pruebas de defectos
* El primer objetivo conduce a las **pruebas de validación**
* Se espera que el sistema realice correctamente el uso de un determinado conjunto de casos de prueba que reflejen el
uso esperado del sistema.
* El segundo objetivo conduce a **pruebas de defectos**.
* Los casos de prueba están diseñados para exponer los defectos.
* Los casos de prueba en pruebas de defectos pueden ser deliberadamente confusos y no tienen por qué reflejar cómo se
utiliza normalmente el sistema.
---
### Modelo entrada-salida de prueba del programa

---
### Verificación vs validación
Las **pruebas** se consideran parte de un proceso más amplio de verificación y validación.
* **Verificación:** ¿construimos bien el producto?
* El software cumple con los requerimientos funcionales y no funcionales establecidos
* **Validación:** ¿construimos el producto correcto?
* El software debe hacer lo que el usuario realmente necesita.
----
### V & V
Objetivo final: establecer confianza de que el sistema de software es “adecuado”.
Depende de:
- **Propósito del software:** Cuanto más crítico sea el software más importante debe ser su confiabilidad.
- **Expectativas del usuario:** Conforme el software se completa, se espera sea más confiable.
- **Entorno de mercado:** Considerar los productos competitivos, el precio, la calidad, etc.
---
### Inspecciones y pruebas
* Inspecciones de software:
* Verificación **estática**
* Pruebas de software
* Verificación **dinámica**
---
### Verificacion & validacion estática
Implica inspecciones y revisiones (realizadas SIN ejecución), análisis y comprobación de:
- Requerimientos del sistema
- Modelos de diseño
- Código fuente del programa
- Pruebas propuestas
----
### Inspecciones y Pruebas

----
### Inspecciones y pruebas
* Las inspecciones y las pruebas son complementarias.
* Ambas deben ser utilizadas durante el proceso de V & V.
* Las inspecciones pueden comprobar la conformidad con una especificación pero no la
conformidad con los requisitos reales del cliente.
* Las inspecciones no pueden comprobar las características no funcionales tales como
rendimiento, usabilidad, etc.
----
### Inspecciones de software
* Se enfocan en el código fuente de un sistema con el objetivo de descubrir anomalías y defectos.
* No requieren la ejecución de un sistema así que puede ser utilizado antes de la implementación.
* Se pueden aplicar a cualquier representación del sistema (requisitos, diseño, datos de
configuración, datos de prueba, etc.)
* Han demostrado ser una técnica efectiva para descubrir errores de programa.
----
### Ventajas de las inspecciones
* Durante las pruebas, los errores pueden enmascarar (ocultar) otros errores. La inspección es un proceso
estático, no hay interacciones entre los errores.
* Versiones incompletas de un sistema pueden ser inspeccionadas fácilmente. En las pruebas es
necesario desarrollar casos de prueba especificos para las partes desarrolladas.
* La inspección permite refactorizar mejorando la calidad del programa (mejora el cumplimiento de las
normas, la portabilidad y facilidad de mantenimiento).
----
#### VSC: Plugins
- **ESlint:** Es una herramienta de análisis estático de código enfocada en encontrar y corregir problemas en el código
JavaScript y en otros lenguajes basados en este, como TypeScript. Se utiliza para mantener un código más limpio,
consistente y libre de errores.
- **SonarLint:** Ayuda a los desarrolladores a encontrar y solucionar errores en tiempo real mientras escriben código.
----
### Las inpescciones NO sustituyen las pruebas de software. Son diferentes los errores a nivel dinámico que estático.
---
### Técnicas de Prueba
Las pruebas pueden clasificarse según **cómo se evalúa el software**:
1. **Técnicas estáticas:** sin ejecutar el código.
2. **Técnicas dinámicas:** con ejecución del sistema.
3. **Técnicas basadas en la experiencia:** apoyadas en conocimiento o intuición del tester.
---

---
### Casos de Pruebas
Son especificaciones de las entradas a las pruebas y la salida esperada del sistema (los resultado de la prueba),
además de información sobre lo que se pone a prueba.
---
### Etapas de prueba
- **Pruebas de desarrollo**, donde el sistema se prueba durante el desarrollo para descubrir los errores y defectos.
- **Pruebas de Versión**, donde un equipo de pruebas separado, testea una versión completa del sistema antes de que sea
puesto en operación.
- **Pruebas de usuario**, donde los usuarios potenciales de un sistema, prueban el sistema en su propio entorno.
---
### Modelo del proceso de prueba de software

----
El proceso de prueba requiere una combinación de pruebas manuales y automatizadas.
---
### Pruebas de desarrollo
Actividades de pruebas del equipo de desarrollo. Niveles de granulación:
1. **Prueba de la unidad**, donde se ponen a prueba las funciones o clases de objetos. Debe centrarse en
probar la funcionalidad de los objetos o métodos.
2. **Pruebas de componentes**, donde se integran varias unidades individuales para crear
componentes compuestos. Deben centrarse en las interfaces de componentes de prueba.
3. **Pruebas del sistema**, donde algunos o todos los componentes de un sistema están integrados y el
sistema se pone a prueba en su conjunto. Deben centrarse en las interacciones de los componentes
Todas son **pruebas de defecto**, cuya meta es descubrir bugs en el software.
---
### Pirámide de Testing o Cohen

---
### Pirámide de Testing
* Representa la **proporción ideal** de pruebas en los diferentes niveles.
* Propone **muchas pruebas unitarias**, algunas pruebas de integración y pocas pruebas E2E.
* Las pruebas de menor nivel son **más rápidas, baratas y fáciles de automatizar**.
* Las pruebas de interfaz o sistema son **más lentas y frágiles**, pero necesarias para validar el flujo completo.
---
### Distribución típica
| Nivel | Propósito | Ejemplo | Volumen esperado |
|-------|------------|----------|------------------|
| **Unitarias** | Validar funciones o métodos | JUnit, Jest | Alta |
| **Integración / Componentes** | Validar interacción entre módulos | Postman, Playwright API | Media |
| **UI / End-to-End** | Validar comportamiento completo del sistema | Selenium, Cypress | Baja |
---
### Anti Patrones de Tetsing

El esquema conocido como “cono de helado” ó “cigarro”, se focalizan principalmente en las pruebas exploratorias.
---
### 1. Pruebas de unidad
* Proceso de probar métodos o clases de objetos individualmente de forma aislada.
* Las unidades pueden ser:
* Las funciones individuales o métodos dentro de un objeto
* Las clases de objetos con varios atributos y métodos
* Componentes compuestos con interfaces definidas usados para acceder a su funcionalidad.
---
### Métricas de calidad de prueba
* **Cobertura de código:** porcentaje de líneas, ramas o funciones ejecutadas.
* **Tasa de defectos:** defectos encontrados / líneas de código.
* **MTTF (Mean Time To Failure):** tiempo promedio hasta que ocurre un fallo.
* **Tasa de éxito de ejecución de pruebas.**
* **Defect leakage:** porcentaje de errores no detectados en pruebas previas.
---
### Pruebas clases
Cobertura de la prueba completa de una clase implica:
* Probar todas las operaciones asociadas con un objeto.
* La modificación/utilización de todos los atributos de los objetos.
* Poner el objeto en todos los estados posibles.
* La herencia hace más difícil la prueba.
---
### Pruebas automatizadas
* Siempre que sea posible, las pruebas de unidad debe ser automatizadas de forma que se ejecuten y
comprueben las pruebas sin necesidad de intervención manual.
* En la unidad de pruebas automatizadas, se hace uso de un marco de automatización de pruebas (tales
como JUnit, Jest o React Testing Library) para escribir y ejecutar las pruebas del programa.
* Marcos de pruebas unitarias permiten clases de prueba genéricos que se extienden a crear casos de prueba específicos.
---
### Herramientas populares de prueba
* **Unitarias:** JUnit, PyTest, Jest, NUnit.
* **De integración y API:** Postman, RestAssured, Playwright API testing.
* **UI/End-to-End:** Selenium, Playwright, Cypress.
* **Performance:** JMeter, K6, Gatling.
* **Cobertura y calidad:** SonarQube, Codecov.
* **CI/CD:** GitHub Actions, Jenkins, GitLab CI.
---
### Partes del conjunto automatizado de pruebas
1. **Configuración**, donde se inicializa el sistema con el caso de prueba, es decir, entradas y salidas esperadas.
2. **Llamada**, cuando se llama al objeto o método para probar.
3. **Declaración**, donde se compara el resultado de la llamada con el resultado esperado. Si es verdadera, la
prueba ha tenido éxito, si es falso ha fracasado.
---
### Efectividad de prueba de unidad
* Los casos de prueba deben demostrar que, cuando se usa como se esperaba, el componente que se está
probando hace lo que se supone que debe hacer.
* Si hay defectos en el componente, éstos deben ser revelados por los casos de prueba.
* Dos tipos de casos de prueba de unidad:
* El primero debe reflejar el funcionamiento normal de un programa y demostrar que el componente funciona como se esperaba.
* El segundo debe basarse en la experiencia de donde surgen los problemas comunes.
* Se debe utilizar entradas anormales para comprobar que el componente no falle.
---
### Pruebas de Caja Negra
* También llamadas **pruebas funcionales**.
* Evalúan el sistema **desde el punto de vista del usuario** sin conocer la estructura interna del código.
* Se basan en los **requerimientos y especificaciones funcionales**.
* Buscan responder: *“¿Hace el sistema lo que debería hacer?”*
* Técnicas comunes:
* Partición de equivalencia
* Análisis de valores límite
* Tablas de decisión
* Casos de uso y escenarios
---
### Pruebas de Caja Blanca
* También llamadas **pruebas estructurales**.
* El objetivo es validar la **lógica interna y los caminos del código**.
* Requieren conocimiento del código fuente.
* Buscan responder:
> “¿Está correctamente construido el sistema?”
* Tipos de cobertura:
* Cobertura de sentencias
* Cobertura de decisiones o ramas
* Cobertura de condiciones
* Cobertura de caminos lógicos
---
### Caja Negra vs Caja Blanca
| Criterio | Caja Negra | Caja Blanca |
|-----------|-------------|--------------|
| Enfoque | Funcional (externo) | Estructural (interno) |
| Conocimiento del código | No requerido | Requerido |
| Base del diseño de prueba | Requerimientos | Código fuente |
| Objetivo | Validar comportamiento | Verificar implementación |
| Técnicas comunes | Partición de equivalencia, escenarios | Cobertura de código, caminos |
| Automatización típica | UI, API, E2E | Unitarias |
---
### Enfoque combinado (Caja Gris)
* Mezcla ambos enfoques: conocimiento parcial de la estructura interna.
* Útil en pruebas de integración o de API, donde se conoce la arquitectura pero no toda la lógica interna.
* Permite diseñar pruebas más **efectivas y realistas**.
---
### Ejercicio: ¿Qué técnica usarías?
1. Revisar un PR en Git con reglas de estilo