You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
@@ -18,202 +18,40 @@ Con el fin de demostrar los conocimientos adquiridos en clases virtuales, este p
18
18
19
19
## Conocimientos Aprendidos y Desarrollados
20
20
21
-
### Pruebas (Testing)
21
+
### Pruebas de Software
22
22
23
-
#### Definición y Objetivos
24
-
25
-
Las pruebas de software constituyen un proceso fundamental cuyo propósito principal es identificar errores (bugs) antes de que el código se despliegue en producción. Su implementación persigue los siguientes objetivos:
26
-
27
-
1.**Detección temprana de errores**: Permitir la identificación de defectos durante las primeras etapas del ciclo de desarrollo, con el fin de minimizar el coste y el impacto de las correcciones.
28
-
2.**Incremento de la confianza en el código**: Proporcionar una mayor seguridad sobre la estabilidad y funcionalidad del software, aunque ningún conjunto de pruebas puede garantizar una ausencia total de fallos.
29
-
3.**Apoyo en la toma de decisiones de despliegue**: Facilitar la evaluación de si el software está listo para incorporar nuevas funcionalidades o si, por el contrario, es preferible retrasar el lanzamiento para corregir incidencias.
30
-
4.**Fomento de la calidad y la limpieza del código**: Incentivar a los desarrolladores a escribir código modular y bien estructurado, ya que un código más legible y organizado resulta más sencillo de probar y de mantener.
31
-
32
-
#### Papel en la Gestión de Proyectos (PM) y DevOps
33
-
34
-
Las pruebas de software deben integrarse en cualquier metodología de desarrollo, ya sea Waterfall, Agile o DevOps. En particular, dentro de un entorno DevOps, las pruebas forman parte de un ciclo continuo de entrega (conocido como “loop infinito”) y suelen automatizarse para garantizar despliegues rápidos y fiables.
35
-
36
-
- En metodologías **Waterfall**, se planifican fases de prueba tras la finalización de cada etapa de diseño o desarrollo.
37
-
- En metodologías **Agile**, las pruebas se incorporan iterativamente a cada sprint, fomentando la retroalimentación constante.
38
-
- En entornos **DevOps**, la automatización de pruebas permite validar el software con cada cambio en el repositorio, manteniendo la calidad a lo largo de todo el ciclo de vida.
23
+
Las pruebas son fundamentales para detectar errores antes del despliegue, aumentar la confianza en el código, apoyar decisiones de lanzamiento y fomentar buenas prácticas de desarrollo. Forman parte esencial de metodologías como Waterfall, Agile y DevOps, donde suelen automatizarse en ciclos de integración y entrega continua.
39
24
40
25
### Tipos de Pruebas
41
26
42
-
#### 1. Pruebas Externas (End-to-End Visuales)
43
-
44
-
1.**Manuales**
45
-
Consisten en que un tester sigue un conjunto de pasos predefinidos y verifica visualmente el correcto funcionamiento de la interfaz de usuario. Este enfoque permite detectar problemas de usabilidad y de flujo que, a veces, escapan a las pruebas automatizadas.
46
-
47
-
2.**Automáticas**
48
-
Se basa en grabar y reproducir interacciones del usuario con la aplicación (clics, entradas de texto, navegación, etc.). Estas pruebas se programan para ejecutarse periódicamente y validar que la interfaz mantiene su comportamiento esperado tras cambios en el código.
27
+
#### 1. Pruebas Externas (End-to-End)
28
+
- Manuales: El tester verifica visualmente el comportamiento de la aplicación siguiendo pasos definidos.
29
+
- Automáticas: Simulan interacciones del usuario para validar el funcionamiento tras cambios de código.
49
30
50
31
#### 2. Pruebas Funcionales
51
-
52
-
1.**Unitarias**
53
-
Evalúan unidades de código individuales (funciones, clases o módulos) de forma aislada. Cada prueba debe comprobar un único aspecto del comportamiento de la unidad bajo condiciones controladas.
54
-
55
-
2.**De Integración**
56
-
Verifican que varios componentes, módulos o servicios funcionen correctamente en conjunto. Por ejemplo, en el contexto de un backend, consisten en realizar peticiones HTTP a la API y validar las respuestas recibidas, asegurando que cada capa (controlador, servicio, base de datos) interactúa según lo previsto.
57
-
58
-
3.**End-to-End (E2E)**
59
-
Simulan flujos completos de usuario, como inicio de sesión, procesos de compra o cualquier otro recorrido típico en la aplicación. Estas pruebas garantizan que la aplicación, en su contexto global, responde adecuadamente a las acciones del usuario. Debido a su complejidad para su creación y mantenimiento, se recomienda limitar su uso a los escenarios más críticos.
32
+
- Unitarias: Evalúan funciones o módulos individuales de forma aislada.
33
+
- De integración: Comprueban que múltiples componentes funcionen correctamente en conjunto.
34
+
- End-to-End: Simulan flujos completos del usuario para garantizar el correcto funcionamiento de la aplicación.
60
35
61
36
#### 3. Pruebas No Funcionales
37
+
- Seguridad: Detectan vulnerabilidades y validan la protección de datos sensibles.
38
+
- Rendimiento: Evalúan tiempos de respuesta y comportamiento bajo carga.
39
+
- Usabilidad: Analizan la experiencia real del usuario en la interfaz.
40
+
- Accesibilidad: Verifican que la aplicación sea usable por personas con discapacidad.
62
41
63
-
1.**Seguridad**
64
-
Buscan detectar vulnerabilidades en dependencias y paquetes, así como garantizar el correcto cifrado y manejo de datos sensibles. Incluyen análisis de penetración, auditorías de dependencias y pruebas de autenticación y autorización.
65
-
66
-
2.**Rendimiento**
67
-
Evalúan métricas como el Time To First Byte (TTFB), la capacidad de la aplicación para soportar carga simultánea y el cálculo de costes de operación en función del uso. Estas pruebas son esenciales para garantizar un desempeño óptimo en entornos de producción con alta concurrencia.
68
-
69
-
3.**Usabilidad**
70
-
Analizan la interacción de usuarios reales con la aplicación, con el fin de identificar posibles dificultades o barreras en la navegación. Se pueden emplear estudios de usabilidad, pruebas con usuarios y análisis de métricas de interacción.
71
-
72
-
4.**Accesibilidad**
73
-
Verifican que la interfaz sea usable para personas con discapacidad, asegurando que todos los elementos visuales estén correctamente renderizados y que existan alternativas para navegación mediante teclado o lectores de pantalla. También se comprueba el contraste de colores y la adecuación semántica del HTML.
74
-
75
-
### Herramientas de Apoyo
76
-
77
-
#### Requisitos Básicos
78
-
79
-
-**Conocimiento profundo del lenguaje de programación** sobre el que se va a trabajar.
80
-
-**Familiaridad con el código existente**, así como con la arquitectura de la aplicación.
81
-
-**Comprensión de las funcionalidades a testar**, incluyendo requisitos y criterios de aceptación.
82
-
83
-
#### Software Recomendado
84
-
85
-
1.**Pruebas Unitarias**
86
-
87
-
-**Jasmine**: Framework de pruebas para JavaScript.
88
-
-**Jest**: Herramienta de testing desarrollada por Facebook, muy usada en proyectos React y Node.js.
89
-
-**Mocha + Chai**: Combinación de runner (Mocha) y librería de aserciones (Chai) para Node.js.
90
-
91
-
2.**Pruebas Funcionales**
92
-
93
-
-**Supertest**: Biblioteca para realizar peticiones HTTP y validar respuestas en entornos Node.js.
94
-
95
-
3.**Pruebas E2E**
96
-
-**Selenium**: Framework que permite automatizar navegadores web.
97
-
-**Puppeteer**: Librería de alto nivel para controlar Chrome/Chromium mediante el Protocolo DevTools.
98
-
-**Protractor**: Solución específica para proyectos Angular.
99
-
-**Playwright**: Herramienta multiplataforma para pruebas confiables en entornos web (Chrome, Firefox, Safari).
100
-
101
-
## Jest
102
-
103
-
Jest es un framework de pruebas unitarias desarrollado por Facebook, diseñado para ser rápido, extensible y fácil de configurar. Sus características principales incluyen:
104
-
105
-
1.**Configuración y Ajustes**
106
-
107
-
- Permite definir archivos de configuración (`jest.config.js`) para establecer patrones de búsqueda, exclusión de directorios, transformaciones de código (por ejemplo, Babel) y mapeo de módulos.
108
-
109
-
2.**Hooks (beforeEach, afterEach, etc.)**
110
-
111
-
- Ofrece funciones de ciclo de vida para preparar el entorno antes de cada prueba (`beforeEach`) y para realizar tareas de limpieza tras su ejecución (`afterEach`). También cuenta con `beforeAll` y `afterAll` para acciones a nivel de suite de pruebas.
112
-
113
-
3.**Manejo de Excepciones**
114
-
115
-
- Soporta aserciones que esperan que determinadas funciones lancen excepciones (`toThrow()`) y captura de errores asincrónicos.
116
-
117
-
4.**Testeo de Promesas**
118
-
119
-
- Facilita la validación de promesas resueltas y rechazadas usando métodos como `resolves` y `rejects`, así como la sintaxis `async/await`.
120
-
121
-
5.**Mocking de Módulos y Funciones**
122
-
123
-
- Permite simular dependencias y reemplazar implementaciones reales por duplicados (mocks), lo que hace posible aislar la unidad de prueba y controlar el comportamiento de módulos externos.
124
-
125
-
6.**Cobertura de Código (Coverage)**
126
-
- Genera informes de cobertura que indican qué líneas, ramas y funciones han sido ejecutadas durante las pruebas. Esto ayuda a cuantificar la efectividad del conjunto de pruebas y a localizar áreas sin cobertura.
127
-
128
-
## TDD (Test Driven Development)
129
-
130
-
### Definición
131
-
132
-
El Desarrollo Guiado por Pruebas (Test Driven Development) es una metodología iterativa en la que se escriben pruebas automatizadas antes de implementar la funcionalidad. El ciclo básico, conocido como **Red–Green–Refactor**, consta de:
133
-
134
-
1.**Red**: Escribir una prueba que falle (ya que la funcionalidad aún no existe).
135
-
2.**Green**: Implementar la funcionalidad mínima necesaria para que la prueba pase satisfactoriamente.
136
-
3.**Refactor**: Mejorar el código sin modificar su comportamiento, asegurándose de que todos los tests continúen pasando.
137
-
138
-
Este ciclo se repite de forma contínua para cada nuevo requisito o cambio en el sistema.
139
-
140
-
#### Leyes del TDD (Robert C. Martin)
141
-
142
-
1.**No escribir código de producción sin antes escribir una prueba que falle.**
143
-
2.**No escribir más de una prueba unitaria suficiente para ocasionar un único fallo.** (Incluso un error de compilación se considera un fallo.)
144
-
3.**No escribir más código del estrictamente necesario para hacer pasar la prueba.**
145
-
146
-
#### Reglas Adicionales
147
-
148
-
1.**Especificar claramente los requisitos de la funcionalidad**: Sin una definición precisa, el proceso TDD pierde efectividad.
149
-
2.**Considerar todos los casos posibles** (incluyendo éxitos y errores) dentro de los criterios de aceptación.
150
-
3.**Diseñar cada prueba para verificar únicamente la lógica de la unidad en cuestión**, utilizando mocks cuando sea necesario para aislarla de dependencias externas.
151
-
4.**Determinar con claridad qué aspecto se desea probar en cada test**, evitando abarcar múltiples criterios en una sola prueba.
152
-
5.**La cantidad de pruebas no está predeterminada**, sino que depende de los escenarios que cubra la funcionalidad implementada.
153
-
154
-
#### Principios SOLID Aplicados en TDD
155
-
156
-
-**S – Single Responsibility Principle**: Cada clase o módulo debe tener una única responsabilidad.
157
-
-**O – Open/Closed Principle**: El código debe poder extenderse sin modificar su implementación existente.
158
-
-**L – Liskov Substitution Principle**: Cualquier tipo derivado debe poder sustituir a su tipo base sin alterar el comportamiento correcto del programa.
159
-
-**I – Interface Segregation Principle**: No obligar a una clase a depender de interfaces que no utiliza.
160
-
-**D – Dependency Inversion Principle**: Los detalles de implementación deben depender de abstracciones y no al revés.
161
-
162
-
#### Beneficios del TDD
163
-
164
-
- Mejora la calidad general del código, al obligar a pensar en los requisitos antes de escribir la implementación.
165
-
- Promueve un diseño centrado en requerimientos, reduciendo funcionalidades innecesarias.
166
-
- Genera código más simple y enfocado en la funcionalidad mínima viable.
167
-
- Reduce la redundancia y facilita la identificación de errores en fases tempranas.
168
-
- Disminuye el tiempo dedicado a la depuración y aumenta la productividad del equipo.
169
-
- Contribuye a una base de código menos propensa a incorporar defectos a futuro.
170
-
171
-
#### Contrapartidas del TDD
172
-
173
-
- Requiere una curva de aprendizaje pronunciada para desarrolladores inexpertos en esta metodología.
174
-
- Existe el riesgo de perder la visión global del proyecto al centrarse excesivamente en pruebas unitarias e casos concretos.
175
-
- Si los requisitos no están bien definidos, pueden surgir errores en la construcción de las pruebas.
176
-
- Puede resultar complejo integrar servicios externos (bases de datos, APIs) si no se manejan adecuadamente los mocks y stubs.
177
-
- Su adopción en el desarrollo frontend puede ser más difícil, dado que a menudo el foco de atención recae en la lógica del negocio y no en la interfaz de usuario.
178
-
- Requiere una inversión significativa de tiempo y recursos al inicio del proyecto.
179
-
180
-
## Aproximaciones Relacionadas
181
-
182
-
### BDD (Behavior Driven Development)
183
-
184
-
El Desarrollo Guiado por Comportamiento (Behaviour Driven Development) extiende los conceptos de TDD mediante un lenguaje compartido entre los equipos técnicos y las partes interesadas del negocio. Las pruebas de aceptación, escritas en un lenguaje de estilo natural (como Gherkin), describen el comportamiento esperado del sistema desde la perspectiva del usuario.
185
-
186
-
-**Herramientas principales**:
187
-
188
-
-**Cucumber**: Framework que interpreta archivos en lenguaje Gherkin para realizar pruebas automatizadas.
189
-
-**Gherkin**: Sintaxis de texto plano basada en palabras clave (Given, When, Then) para describir escenarios de comportamiento.
190
-
191
-
-**Ventajas**:
192
-
193
-
1. Define comportamientos en lugar de pruebas específicas, lo que favorece la colaboración entre desarrolladores, testers y usuarios de negocio.
194
-
2. Mejora la comunicación y el entendimiento mutuo al utilizar un lenguaje natural para describir funcionalidades.
195
-
3. Presenta una curva de aprendizaje menor que TDD puro, dado que no se centra solamente en pruebas unitarias.
196
-
4. Facilita la adopción de metodologías ágiles, al proporcionar un marco de trabajo para la definición de criterios de aceptación antes de comenzar la implementación.
197
-
5. Permite alcanzar un consenso sobre las funcionalidades a desarrollar antes de escribir código.
198
-
199
-
-**Inconvenientes**:
200
-
1. Existe el riesgo de omitir casos relevantes si no se definen exhaustivamente los escenarios de comportamiento.
201
-
2. Resulta más complejo mantener pruebas de comportamiento para bases de datos y aplicaciones con interfaces gráficas ricas (frontend).
202
-
3. Requiere una inversión de tiempo media–alta para la redacción y mantenimiento de scripts en Gherkin.
203
-
4. Demanda comunicación constante entre los distintos perfiles (desarrolladores, testers y clientes), lo cual puede ralentizar la dinámica de equipos poco acostumbrados a este enfoque.
42
+
### Herramientas Utilizadas
204
43
205
-
### ATDD (Acceptance Test Driven Development)
44
+
- Jasmine, Jest, Mocha + Chai: Pruebas unitarias en JavaScript y Node.js.
45
+
- Supertest: Pruebas funcionales en entornos backend.
46
+
- Selenium, Puppeteer, Protractor, Playwright: Pruebas E2E automatizadas en navegadores.
206
47
207
-
El Desarrollo Guiado por Pruebas de Aceptación (Acceptance Test Driven Development) se asemeja a BDD, pero con un énfasis mayor en garantizar que se cumplan los objetivos correctos desde la fase inicial del proyecto.
48
+
### TDD (Test Driven Development)
208
49
209
-
-**Objetivo principal**: Asegurar que el equipo trabaje únicamente en funcionalidades necesarias, evitando esfuerzos en componentes innecesarios.
210
-
-**Ventajas**:
50
+
El desarrollo guiado por pruebas consiste en escribir primero la prueba, luego el código mínimo para pasarla y finalmente refactorizar. Este enfoque mejora la calidad, evita sobrecargas innecesarias y detecta errores en etapas tempranas. Se apoya en principios SOLID y promueve un diseño más limpio y mantenible.
211
51
212
-
1. Promueve un diseño flexible y preparado para cambios futuros, sin condicionar la solución a la interfaz de usuario o la base de datos.
213
-
2. Proporciona retroalimentación temprana sobre el cumplimiento de los objetivos del proyecto.
214
-
3. Permite al Product Owner revisar y validar los criterios de aceptación, aumentando la confianza en el equipo de desarrollo.
52
+
### BDD y ATDD
215
53
216
-
-**Modo de operación**: Se basa en la definición de pruebas de aceptación que describen el comportamiento deseado del sistema de forma comprensible para todos los implicados. Una vez validadas, el equipo de desarrollo implementa la funcionalidad de forma iterativa, asegurándose de pasar dichas pruebas antes de continuar con nuevas tareas.
54
+
BDD (Desarrollo guiado por comportamiento) y ATDD (Desarrollo guiado por pruebas de aceptación) buscan alinear a todo el equipo (desarrolladores, testers y negocio) mediante la definición clara de comportamientos esperados. Utilizan lenguajes estructurados como Gherkin para describir escenarios de prueba comprensibles por todos los involucrados.
0 commit comments