1. Objetivos de la semana
Construir software que podamos demostrar que funciona
Hasta ahora hemos aprendido a construir funcionalidades y a corregir bugs. Ahora debemos introducir una pregunta fundamental:
¿Cómo sabemos que nuestra aplicación
sigue funcionando después de cambiarla?
01 · Comprender testing
Entender por qué y cuándo necesitamos tests.
02 · Diseñar pruebas
Convertir requisitos en casos de prueba.
03 · Usar IA
Generar tests con IA de forma controlada.
04 · Auditar
Detectar tests generados por IA que no aportan valor.
05 · Automatizar
Integrar pruebas en el workflow.
06 · Prevenir regresiones
Convertir errores en protección permanente.
2. De Testing a Quality Engineering
Testing no significa simplemente escribir pruebas.
Testing tradicional
Construir
↓
Probar
↓
Encontrar errores
↓
Corregir
Quality Engineering
Requisitos
↓
Diseño
↓
Implementación
↓
Testing
↓
Observabilidad
↓
Seguridad
↓
Rendimiento
↓
Automatización
↓
Continuous Quality
El objetivo es introducir calidad durante todo el ciclo de desarrollo.
3. ¿Qué es un test?
Un test es una comprobación automatizada de que un comportamiento determinado es el esperado.
Ejemplo sencillo
FUNCIÓN
calculateTotal(price, quantity)
ENTRADA
price = 10
quantity = 3
ESPERADO
30
TEST
calculateTotal(10,3)
↓
30
PASS
Un test tiene normalmente
| Elemento | Significado |
|---|---|
| Arrange | Preparar el escenario. |
| Act | Ejecutar la acción. |
| Assert | Comprobar el resultado. |
Patrón AAA
ARRANGE
Preparar datos
ACT
Ejecutar función
ASSERT
Comprobar resultado
4. Niveles de testing
No todos los tests comprueban lo mismo.
| Nivel | Qué prueba | Velocidad |
|---|---|---|
| Unit | Una unidad aislada. | Muy rápida |
| Integration | Interacción entre componentes. | Media |
| API | Contrato y comportamiento de APIs. | Media |
| E2E | Flujo completo de usuario. | Más lenta |
Pirámide de testing
/\
/ \
/ E2E\
/------\
/ API \
/----------\
/ Integration\
/--------------\
/ UNIT \
/__________________\
Muchos tests baratos
Pocos tests caros
Un error habitual es intentar solucionar todo mediante E2E.
Los tests E2E son útiles, pero son más lentos y normalmente más frágiles.
5. Unit Testing
Un unit test prueba una unidad pequeña del sistema de forma aislada.
Ejemplo conceptual
calculateDiscount()
Input:
100
10%
Expected:
90
¿Qué deberíamos probar?
- caso normal;
- valor mínimo;
- valor máximo;
- valor cero;
- valores inválidos;
- casos límite.
Ejemplo
describe("calculateDiscount", () => {
test("10% discount", () => {
expect(
calculateDiscount(100, 10)
).toBe(90);
});
});
Caso límite
calculateDiscount(100, 100)
Expected:
0
Otro caso
calculateDiscount(100, 0)
Expected:
100
6. Integration Testing
Aquí comprobamos que varias piezas funcionan juntas.
API
↓
Service
↓
Repository
↓
Database
Ejemplo
Queremos comprobar:
POST /employees
↓
EmployeeService
↓
Database
↓
Employee creado
Este test no comprueba únicamente una función. Comprueba la interacción entre componentes.
Cuándo usar integration tests
- acceso a base de datos;
- persistencia;
- transacciones;
- integraciones;
- colas;
- servicios internos.
7. Testing de APIs
Nuestra aplicación utiliza APIs. Por tanto debemos comprobar sus contratos.
Ejemplo
GET /api/employees/123
Esperamos:
HTTP 200
{
"id": 123,
"name": "Juan"
}
Tests importantes
| Escenario | Resultado esperado |
|---|---|
| ID existente | 200 |
| ID inexistente | 404 |
| ID inválido | 400 |
| Sin autorización | 401 |
| Sin permisos | 403 |
Pregunta importante
¿Debemos comprobar solamente el status code?
Ver respuesta
No. También deberíamos comprobar:
- estructura;
- campos;
- tipos;
- valores;
- headers importantes;
- errores;
- contratos.
8. End-to-End Testing
Un test E2E intenta reproducir el comportamiento de un usuario real.
Ejemplo
Usuario
↓
Login
↓
Dashboard
↓
Employees
↓
Buscar "Juan"
↓
Abrir empleado
↓
Modificar departamento
↓
Guardar
↓
Verificar resultado
Este tipo de test valida que muchas piezas funcionan juntas.
Pero cuidado
Si falla un E2E, no necesariamente sabemos qué componente es responsable.
Por eso necesitamos diferentes niveles de testing.
9. Diseñar casos de prueba
Una de las habilidades más importantes es convertir requisitos en escenarios.
Requisito
Un empleado puede cambiar
su departamento.
Parece sencillo. Pero debemos pensar:
| Escenario | Resultado |
|---|---|
| Departamento válido | Actualización correcta |
| Departamento inexistente | Error |
| Empleado inexistente | 404 |
| Usuario no autenticado | 401 |
| Usuario sin permisos | 403 |
| department_id = null | Comportamiento definido |
| Request incompleto | 400 |
La IA puede ayudarnos aquí
Analiza este requisito:
"Un empleado puede cambiar
su departamento."
Genera una matriz de casos de prueba.
Incluye:
- happy path;
- errores;
- edge cases;
- permisos;
- autenticación;
- datos inexistentes;
- valores null;
- valores inválidos;
- concurrencia.
No escribas código todavía.
10. Generar tests con IA
La IA es especialmente buena generando variantes.
Prompt básico
Analiza esta función.
[PEGAR FUNCIÓN]
Genera tests unitarios.
Incluye:
1. Happy path
2. Edge cases
3. Invalid inputs
4. Boundary values
5. Null / undefined
6. Error conditions
Utiliza el framework
de testing existente.
No cambies producción.
Prompt mejorado
Antes de generar tests:
1. Analiza la función.
2. Identifica su contrato.
3. Identifica dependencias.
4. Identifica posibles errores.
5. Identifica casos límite.
Después genera los tests.
Para cada test explica:
- qué comportamiento protege;
- por qué es importante;
- qué bug detectaría.
No generes tests redundantes.
11. Agentes para construir una estrategia de testing
Aquí empezamos a utilizar la IA como miembro de un equipo de QA.
Prompt de auditoría
Actúa como Quality Engineer.
Analiza este proyecto.
No modifiques ningún archivo.
Investiga:
- funcionalidades;
- endpoints;
- componentes;
- servicios;
- modelos;
- reglas de negocio;
- tests existentes.
Construye una matriz:
FEATURE
RISK
EXISTING TESTS
MISSING TESTS
PRIORITY
Después identifica
los 10 riesgos de calidad
más importantes.
Después
Proyecto
↓
IA analiza
↓
Mapa funcional
↓
Riesgos
↓
Casos de prueba
↓
Priorización
↓
Implementación
↓
Ejecución
↓
Informe
Pero nunca aceptar automáticamente todos los tests generados.
12. Cómo detectar tests malos generados por IA
Test aparentemente bueno
test("creates employee", () => {
const result =
createEmployee(data);
expect(result).toBeDefined();
});
El test pasa. Pero... ¿Qué demuestra realmente?
Problema
Solo demuestra que existe algún resultado. No demuestra:
- que el ID sea correcto;
- que el nombre sea correcto;
- que se haya persistido;
- que los datos sean correctos;
- que las reglas de negocio funcionen.
Test más útil
expect(result.name)
.toBe("Juan");
expect(result.departmentId)
.toBe(10);
expect(result.id)
.toBeDefined();
Regla
Un test que siempre pasa no necesariamente es un buen test.
13. Code Coverage
Coverage mide qué parte del código ha sido ejecutada durante los tests.
Ejemplo
100 líneas de código
Tests ejecutan
80 líneas
Coverage = 80%
¿Significa que tenemos un sistema 80% correcto?
No necesariamente
Coverage mide ejecución, no calidad de las assertions. Podemos tener 100% coverage con tests extremadamente malos.
Ejemplo
function divide(a,b){
if(b === 0){
throw Error(
"Cannot divide by zero"
);
}
return a/b;
}
Podemos conseguir coverage alto sin comprobar realmente el comportamiento del error.
Hay que distinguir
| Métrica | Pregunta |
|---|---|
| Line coverage | ¿Se ejecutó la línea? |
| Branch coverage | ¿Se probaron las ramas? |
| Assertion quality | ¿Comprobamos realmente el resultado? |
| Mutation testing | ¿Los tests detectan cambios incorrectos? |
14. TDD asistido por IA
TDD significa:
RED
↓
GREEN
↓
REFACTOR
RED
Escribimos primero el test. Debe fallar.
GREEN
Implementamos lo mínimo para hacerlo pasar.
REFACTOR
Mejoramos el código sin cambiar el comportamiento.
Con IA
REQUISITO
↓
IA propone casos
↓
Desarrollador revisa
↓
IA genera tests
↓
Test FAIL
↓
IA implementa
↓
Test PASS
↓
IA propone refactoring
↓
Tests PASS
La ventaja no es escribir menos tests. La ventaja es poder iterar mucho más rápido.
15. Edge Cases
Los casos límite son uno de los lugares donde la IA puede aportar mucho valor.
Ejemplo
function calculateAge(birthYear){
return 2026 - birthYear;
}
Casos obvios
birthYear = 1990
→ 36
Pero...
- 2026;
- 2027;
- 0;
- null;
- undefined;
- string;
- decimal;
- negative;
- fecha futura.
Analiza esta función.
Busca exhaustivamente
edge cases.
Clasifícalos:
CRÍTICO
ALTO
MEDIO
BAJO
Explica qué comportamiento
esperarías en cada caso.
16. Proyecto práctico Week 12
Crear una estrategia de calidad para nuestra aplicación
Durante esta semana vamos a construir la primera verdadera capa de calidad del proyecto.
Paso 1 — Inventario
Pedir al agente que analice:
- pantallas;
- funcionalidades;
- APIs;
- servicios;
- modelos;
- reglas de negocio.
Paso 2 — Matriz de riesgos
| Feature | Impacto | Probabilidad | Prioridad |
|---|---|---|---|
| Login | Alto | Media | Alta |
| Employee search | Medio | Alta | Alta |
| Profile editing | Alto | Media | Alta |
Paso 3 — Unit tests
Crear tests para las funciones de negocio principales.
Paso 4 — API tests
Crear tests para:
200
400
401
403
404
409
500
Paso 5 — Integration tests
Comprobar:
API
↓
Service
↓
Database
Paso 6 — E2E
Construir al menos 3 flujos completos:
- Login → Dashboard.
- Buscar empleado → abrir ficha.
- Editar empleado → guardar → verificar.
Paso 7 — Regression tests
Recuperar los 3 bugs de Week 11. Cada uno debe tener un test automatizado.
Paso 8 — Quality Gate
Pull Request
↓
Tests
↓
Coverage
↓
Lint
↓
Security checks
↓
PASS / FAIL
Entregables
docs/
├── quality-strategy.md
├── test-plan.md
└── risk-matrix.md
tests/
├── unit/
├── integration/
├── api/
└── e2e/
docs/
└── regression-tests.md
17. Ejercicios prácticos
Ejercicio 1 — Diseñar tests
Tenemos:
login(email,password)
Diseña al menos 8 casos.
Ver solución
- credenciales correctas;
- password incorrecta;
- email inexistente;
- email vacío;
- password vacía;
- email inválido;
- usuario bloqueado;
- usuario sin permisos.
Ejercicio 2 — ¿Unit o E2E?
¿Qué utilizarías para comprobar que una función calcula correctamente un descuento?
Respuesta
Unit test. Es una unidad pequeña y no necesitamos levantar toda la aplicación.
Ejercicio 3 — API
¿Qué debería ocurrir con:
GET /employees/999999
si no existe el empleado?
Respuesta
Normalmente: 404 Not Found.
Ejercicio 4 — Test inútil
expect(result).toBeDefined();
¿Por qué puede ser insuficiente?
Respuesta
Porque únicamente demuestra que existe un resultado. No valida que el resultado sea correcto.
Ejercicio 5 — Coverage
¿100% coverage significa 100% calidad?
Respuesta
No. Coverage mide qué código se ejecuta, no necesariamente si las assertions comprueban correctamente el comportamiento.
Ejercicio 6 — Edge cases
Para:
function multiply(a,b){
return a*b;
}
encuentra al menos 8 casos.
Respuesta
- 2 × 3;
- 0 × 5;
- -2 × 3;
- -2 × -3;
- decimal × decimal;
- 0 × 0;
- null;
- undefined;
- string;
- Infinity.
Ejercicio 7 — Prompt
Escribe un prompt para que una IA analice una funcionalidad y genere casos de prueba sin escribir código.
Respuesta orientativa
Analiza esta funcionalidad.
No escribas código.
Identifica:
- happy path;
- errores;
- edge cases;
- permisos;
- autenticación;
- datos inexistentes;
- estados límite.
Devuelve una matriz de casos de prueba
con:
INPUT
PRECONDITIONS
ACTION
EXPECTED RESULT
PRIORITY
18. Reto avanzado — Encontrar tests que faltan
Entrega al agente el código de una funcionalidad real del proyecto. Pídele:
NO ESCRIBAS TESTS.
Analiza únicamente
qué comportamientos deberían
estar cubiertos.
Busca:
- ramas;
- errores;
- límites;
- permisos;
- estados inválidos;
- concurrencia;
- null;
- datos inexistentes.
Devuelve únicamente
la matriz de cobertura propuesta.
Después el alumno debe revisar manualmente la propuesta.
Objetivo
Aprender que la IA puede producir una primera versión, pero el criterio sigue siendo humano.
19. Test de evaluación
Ver respuestas explicadas
- 1 — B. Un unit test comprueba una unidad pequeña.
- 2 — B. Arrange, Act, Assert.
- 3 — B. E2E comprueba flujos completos.
- 4 — A. Los unit tests suelen ser los más rápidos.
- 5 — A. Es un caso límite o extremo.
- 6 — B. Coverage no mide por sí solo la calidad.
- 7 — B. Primero hay que entender el sistema y sus riesgos.
- 8 — B. El objetivo es validar comportamiento.
- 9 — B. 404 Not Found.
- 10 — A. Test Driven Development.
- 11 — A. Primero escribimos una prueba que falla.
- 12 — B. La IA puede producir tests superficiales.
- 13 — A. Una assertion comprueba una condición.
- 14 — A. Protege contra regresiones.
- 15 — B. La responsabilidad final es humana.
20. Recursos externos
Martin Fowler — The Practical Test PyramidReferencia fundamental para comprender la estrategia de niveles de testing. Playwright — Documentación oficial
Framework moderno para testing E2E y automatización web. Jest — Getting Started
Framework ampliamente utilizado para testing JavaScript/TypeScript. Testing Library
Principios y herramientas para testing centrado en el comportamiento del usuario. GitHub Actions
Automatización de tests y CI/CD. Martin Fowler — TDD
Introducción al desarrollo dirigido por tests. OWASP Web Security Testing Guide
Referencia para testing de seguridad en aplicaciones web. Google SRE — Testing for Reliability
Testing desde una perspectiva de fiabilidad de sistemas.
21. Checklist
22. Evaluación práctica
| Actividad | Peso |
|---|---|
| Test teórico | 15% |
| Ejercicios | 10% |
| Estrategia de testing | 15% |
| Unit tests | 15% |
| API / Integration | 15% |
| E2E | 15% |
| Regression tests | 10% |
| Documentación | 5% |
Objetivo recomendado: ≥80%.
23. El aprendizaje clave
De "la IA escribe tests" a "la IA me ayuda a diseñar calidad"
REQUISITO
↓
RIESGOS
↓
CASOS DE PRUEBA
↓
ESTRATEGIA
↓
IA GENERA TESTS
↓
DESARROLLADOR REVISA
↓
EJECUCIÓN
↓
ANÁLISIS
↓
REGRESSION
↓
QUALITY GATE
Nueva competencia
El alumno ya no utiliza la IA únicamente para generar código.
Empieza a utilizarla para pensar sobre la calidad del software.
24. Preparación para Week 13
El siguiente salto
Hasta ahora tenemos:
- contexto;
- desarrollo asistido;
- debugging;
- testing;
- quality engineering.
Ahora aparece una cuestión fundamental:
¿Cómo hacemos que una IA
pueda trabajar sobre nuestro proyecto
durante horas,
manteniendo contexto,
tomando decisiones,
ejecutando herramientas
y completando tareas complejas?
Week 13 — Agentes de desarrollo
Trabajaremos:
- qué es un agente;
- agent loop;
- tools;
- context;
- planning;
- delegación;
- subagentes;
- guardrails;
- human-in-the-loop;
- agentic coding;
- workflows complejos;
- cómo evitar que un agente destruya el proyecto.