# Testing

## 1. Pruebas Unitarias

* **Descripción**: Son pruebas que se centran en evaluar unidades individuales de código, como funciones o métodos, de manera aislada. El objetivo es asegurarse de que cada parte pequeña del sistema funcione como se espera.
* **Ejemplo**: Verificar que una función de suma devuelva el resultado correcto cuando se le pasan dos números.
* **Ventaja**: Al probar cada unidad por separado, puedes detectar errores desde el inicio, lo que facilita la identificación y resolución de problemas específicos.
* **Herramientas comunes**: Jest, Mocha, Jasmine.

##

## 2. Pruebas de Integración

* **Descripción**: Evalúan cómo interactúan diferentes unidades de código entre sí. Aseguran que los módulos o componentes funcionen correctamente juntos.
* **Ejemplo**: Probar una función que depende de otra función para obtener datos y procesarlos; ambas funciones deben integrarse y funcionar correctamente en conjunto.
* **Ventaja**: Permiten detectar problemas en las interacciones entre componentes que podrían pasar desapercibidos en las pruebas unitarias.
* **Herramientas comunes**: Jest (con setup para integración), Cypress, Supertest.

#### 3. Pruebas Funcionales (o de Sistema)

* **Descripción**: Evalúan el sistema completo para asegurarse de que cumple con los requisitos funcionales, es decir, que hace lo que el usuario espera.
* **Ejemplo**: Probar que un usuario puede iniciar sesión correctamente en el sistema.
* **Ventaja**: Permiten verificar si el sistema se comporta según lo especificado en los requisitos. Estas pruebas ayudan a evaluar el sistema en su conjunto.
* **Herramientas comunes**: Selenium, Cypress.

#### 4. Pruebas de Aceptación del Usuario (UAT)

* **Descripción**: Simulan el uso del software desde el punto de vista del usuario final. Normalmente se realizan antes de lanzar el producto y a menudo son realizadas por usuarios o testers externos.
* **Ejemplo**: Probar que un usuario puede navegar por la tienda, seleccionar productos y completar la compra sin problemas.
* **Ventaja**: Aseguran que el sistema esté listo para su uso real, validando que cumple con las expectativas y necesidades de los usuarios.
* **Herramientas comunes**: No suelen necesitar herramientas específicas, ya que los usuarios prueban el sistema directamente; sin embargo, pueden incluir herramientas como TestRail para el seguimiento de pruebas.

#### 5. Pruebas de Regresión

* **Descripción**: Aseguran que las nuevas funcionalidades o cambios no rompan las funcionalidades existentes del sistema.
* **Ejemplo**: Ejecutar todas las pruebas previas al agregar una nueva función de búsqueda en una tienda en línea para verificar que no afecte las funciones anteriores.
* **Ventaja**: Ayudan a evitar que se introduzcan errores en el código existente cuando se realizan cambios.
* **Herramientas comunes**: Generalmente son pruebas automatizadas y pueden ejecutarse con herramientas como Selenium, Cypress o Jest.

#### 6. Pruebas de Rendimiento (Performance Testing)

* **Descripción**: Miden cómo funciona el sistema bajo ciertas cargas y condiciones. Evalúan el tiempo de respuesta, el uso de memoria y el consumo de recursos, entre otros aspectos.
* **Ejemplo**: Evaluar el tiempo de carga de la página principal cuando muchos usuarios acceden simultáneamente.
* **Ventaja**: Ayudan a identificar cuellos de botella y a garantizar que el sistema mantenga el rendimiento esperado bajo diferentes condiciones.
* **Herramientas comunes**: JMeter, Gatling, Apache Benchmark.

#### 7. Pruebas de Seguridad

* **Descripción**: Se enfocan en detectar vulnerabilidades o posibles amenazas de seguridad en el sistema. Incluyen la evaluación de autenticación, autorización y protección de datos.
* **Ejemplo**: Probar que un usuario no autenticado no pueda acceder a áreas restringidas del sistema.
* **Ventaja**: Ayudan a proteger el sistema de ataques y a asegurar la integridad de los datos.
* **Herramientas comunes**: OWASP ZAP, Burp Suite.

#### Diferencias Principales

| Tipo de Prueba   | Enfoque               | Ejecución      | Herramientas  |
| ---------------- | --------------------- | -------------- | ------------- |
| Unitaria         | Funciones/Métodos     | Desarrollo     | Jest, Mocha   |
| Integración      | Módulos/Componentes   | Desarrollo     | Cypress, Jest |
| Funcional        | Sistema completo      | Desarrollo     | Playwright    |
| Aceptación (UAT) | Usuario final         | Preproducción  | TestRail      |
| Regresión        | Código existente      | Desarrollo     | Cypress       |
| Rendimiento      | Carga y Escalabilidad | Testing en red | JMeter        |
| Seguridad        | Vulnerabilidades      | Desarrollo     | OWASP ZAP     |

Estas pruebas son esenciales en diferentes etapas del ciclo de desarrollo, ya que ayudan a asegurar que el software sea confiable, eficiente y seguro.
