Aquí tienes un documento-resumen completo (tipo “chuleta”) con todo lo que hemos hablado junto: diferencias, cuándo aplicar cada tipo de test, ejemplos sencillos y cómo encaja con la pirámide de testing. Guárdalo y úsalo como referencia.
La pirámide te dice cómo repartir esfuerzos:
- Base (muchos, rápidos, baratos): pruebas pequeñas (unitarias) + análisis estático
- Medio (algunos, realistas): integración, contratos, API
- Cima (pocos, caros, frágiles): end-to-end / UI
Regla de oro:
Cuanto más arriba, más realista… pero más lento y frágil.
Cuanto más abajo, menos realista… pero más rápido y estable.
Qué es: prueba una función/clase aislada, sin red, sin BBDD, sin filesystem.
Cuándo aplicar: siempre que haya lógica: validaciones, reglas de negocio, cálculos, transformaciones.
Ejemplo tonto: probar sumar(2,3)=5.
Idea simple: “Pruebo una pieza de LEGO suelta”.
Qué es: prueba mínima para saber si el sistema “está vivo” (arranca y no explota).
Cuándo aplicar: después de desplegar, al levantar entornos, como verificación rápida post-deploy.
Ejemplo típico:
/healthresponde 200- login básico funciona
- endpoint principal no da 500
Idea simple: “Humo = si hay fuego, me entero rápido”.
Qué es: no prueba el sistema; prueba la calidad de tus tests.
La herramienta introduce pequeños “bugs” en el código (mutaciones) y mira si tus tests los detectan.
- Si al mutar el código los tests fallan → bien (tus tests lo pillarían en producción)
- Si al mutar el código los tests siguen pasando → mal (tus tests son débiles)
Cuándo aplicar:
- lógica crítica donde quieres mucha confianza
- cuando ya tienes unit tests pero quieres medir si “muerden de verdad”
- para mejorar cobertura “útil”, no solo líneas ejecutadas
Ejemplo tonto:
Código real: edad >= 18
Mutación: edad > 18
Si no tienes test para edad=18, la mutación “sobrevive” → te falta ese caso.
Idea simple: “Pongo trampas al código para ver si mis tests las detectan”.
- Lógica pura, reglas, validaciones
- Muchísimos, rápidos, estables
Qué son: prueban un módulo completo, pero con dependencias simuladas (mocks).
Cuándo: cuando un servicio coordina varias piezas internas.
Qué es: defines una regla que siempre debe cumplirse y el framework genera muchos casos.
Cuándo: lógica de transformaciones, parsers, validaciones.
Ejemplo: abs(n) >= 0 para cualquier n.
- Lint/Format: estilo, imports, errores obvios.
- SAST/Static analysis: patrones de vulnerabilidad y bugs (muy útil en CI).
Qué son: pruebas con “algo real”: BBDD, colas, filesystem, cache.
Cuándo: para validar mapeos, SQL, serialización, configuración real.
Qué son: garantizan que servicios se entienden (API/JSON/gRPC/eventos).
Cuándo: microservicios (evita romper consumidores).
Idea: “hablamos el mismo idioma sin levantar todo el sistema”.
Qué son: pruebas directas a endpoints (HTTP/gRPC), sin UI.
Cuándo: cuando la API es el corazón del sistema.
Qué son: verifican que migraciones (Flyway/Liquibase) aplican bien con datos realistas.
Cuándo: cada cambio de esquema o release.
Qué son: prueban el flujo completo como un usuario o sistema externo.
Cuándo: solo flujos críticos (pocos): login → home → acción clave.
Contras: lentos y frágiles.
Qué son: automatizan navegador/app (Playwright/Selenium).
Cuándo: cuando la UI es crítica o legalmente exigente.
Qué es: validación de requisitos por negocio (manual o automatizada).
Cuándo: antes de release / hitos.
- Sanity: tras un cambio pequeño, compruebas “lo tocado” y lo esencial relacionado.
- Regression: suite para asegurar que nada que funcionaba antes se ha roto.
Qué es: pruebas manuales “inteligentes” explorando casos raros.
Cuándo: features nuevas, bugs raros, incertidumbre alta.
- DAST: pruebas dinámicas contra el sistema corriendo.
- Pentest: más profundo (manual + herramientas).
- Fuzzing: entradas aleatorias/maliciosas para romper parsers/APIs.
Qué es: provocas fallos (matar pods, cortar red, latencia) para validar resiliencia.
Cuándo: sistemas críticos / SRE.
- Compatibilidad: navegadores, móviles, OS, versiones.
- i18n: idiomas, formatos fecha/moneda, textos largos.
- Accesibilidad: teclado, contraste, lectores de pantalla.
Qué es: comprobar que puedes restaurar datos y servicios.
Cuándo: siempre que haya datos críticos / auditorías.
Pregunta: “¿Qué pasa si entran muchos usuarios a la vez?”
Se centra en concurrencia / tráfico: usuarios simultáneos, RPS.
Ejemplo simple:
- 500 usuarios concurrentes durante 10–30 min
- medir latencia p95, errores 5xx, CPU/RAM, pool de conexiones
Pregunta: “¿Qué pasa si tengo MUCHÍSIMOS datos?”
Se centra en tamaño del dataset: tablas enormes, millones de registros, colas gigantes.
Ejemplo simple:
- poblar BBDD con 200M registros
- probar un endpoint con poca concurrencia
- medir tiempo de query, IO, locks, uso de índices
- Stress test: subes más allá de lo esperado hasta que rompe → encuentras límite.
- Spike test: pico repentino (50 → 1000 usuarios en 10s) → autoscaling/rate-limit.
- Soak/Endurance: muchas horas → memory leaks, degradación, colas acumuladas.
- Capacity/Scalability: cuánto aguanta con X recursos; escala lineal o no.
Idea simple de performance:
- Carga = “mucha gente”
- Volumen = “muchos datos”
- Soak = “mucho tiempo”
- Spike = “picos bruscos”
- Stress = “hasta romper”
✅ Unit tests
✅ Property-based
✅ Mutation (para medir calidad de los unit)
✅ Integration tests
✅ DB migration tests
✅ Contract tests (si hay microservicios)
✅ API tests
✅ E2E / UI
✅ Acceptance/UAT
✅ Smoke tests
✅ Regression tests (+ sanity para cambios pequeños)
✅ Load (mucha gente)
✅ Volume (muchos datos)
✅ Soak (mucho tiempo)
✅ Spike (picos)
✅ Stress (límite)
Imagina un sistema con:
POST /loginGET /dashboard(consulta BBDD)
Unit: validar password/roles
Integration: repositorio guarda/lee usuario real en BBDD
Contract: /login siempre devuelve {token, expiresIn}
API test: POST /login con credenciales válidas → 200
E2E/UI: usuario entra → login → ve dashboard
Smoke: /health 200 + login básico
Regression: suite de endpoints clave
Mutation: cambian una comparación y miras si tus tests lo detectan
Load: 500 usuarios simultáneos en dashboard
Volume: 200M filas en movimientos, dashboard sigue respondiendo
Soak: 8h con carga moderada para detectar fugas
Una receta muy usada y eficiente:
- Lint + SAST
- Unit tests
- Algún component test
- Un puñado de integration tests rápidos (si caben)
- Integration tests más amplios
- Contract tests
- API regression suite
- Smoke tests (2–5 minutos, súper básicos)
- Load baseline (30–60 min)
- Volume tests (dataset grande)
- Soak (si el sistema es crítico)
- DAST / security suites
- latencia p50/p95/p99
- throughput (RPS)
- errores (5xx, timeouts)
- CPU/RAM, GC (si Java), pool conexiones, colas
- tiempos de query
- IO disco / cache hit ratio
- locks/contención
- uso de índices y paginación
Puedo:
- adaptarlo a vuestro vocabulario (por ejemplo: PerfSmoke, Canary, EnvironmentPulse, RegressionAPI, etc.)
- o hacerte una versión “1 página” ultra compacta para Confluence.
👉 Pregunta rápida: ¿lo quieres más orientado a backend/API (tipo microservicios) o también a UI web? Con eso lo ajusto para que te sirva al 100% en tu día a día.