Proyecto Estrategia de pruebas - MiraPdS/mira GitHub Wiki
Proyecto - Estrategia de pruebas
Herramienta declarada del equipo: Vitest + React Testing Library.
Por qué: el proyecto es TypeScript de punta a punta y Vitest corre el mismo código en los tres workspaces, compartiendo configuración con Vite. React Testing Library consulta por lo que el usuario percibe (rol, etiqueta, texto), así que las pruebas de interfaz sobreviven a los refactors.
El detalle completo, con ejemplos reales del proyecto, está en
docs/estrategia-pruebas.md.
Niveles de prueba
| Nivel | Qué prueba | Dobles | Necesita | Archivos |
|---|---|---|---|---|
| Unitario | Reglas de negocio: service de cada módulo, permisos, esquemas |
Repositorio mockeado (vitest-mock-extended) |
nada | *.test.ts |
| Integración | Rutas HTTP completas: middlewares, validación, SQL real, cookies | ninguno | PostgreSQL en Docker (5443) | *.integration.test.ts |
| Componente | Páginas React con sus proveedores reales | MSW intercepta la red | nada | *.test.tsx |
| E2E (Entrega 3) | Flujos completos en navegador headless contra la URL desplegada | ninguno | ambiente desplegado | — |
Muchas pruebas rápidas abajo, pocas y caras arriba. En Vitest son cuatro
proyectos: shared, api-unit, api-integration y web.
Unitario
El service recibe el repositorio por parámetro, así que se sustituye la
persistencia por un doble y se verifican solo las reglas. Ejemplo: el mensaje
de error es idéntico para "correo inexistente" y "contraseña incorrecta", para
no revelar qué correos están registrados.
La matriz rol × permiso de can() se prueba exhaustivamente con una tabla
(packages/shared/src/permissions.test.ts).
Integración
Supertest le hace peticiones reales a la app Express contra el PostgreSQL de
pruebas. Verifica lo que ningún mock puede: códigos de estado, Set-Cookie
con HttpOnly, restricciones únicas y transacciones.
- Aislamiento:
resetDb()trunca todas las tablas antes de cada test; cada prueba arma su mundo con factories, sin depender del orden. - Datos deterministas: nada de
fakeren valores que se asierten.
Componente
Las páginas se renderizan con QueryClientProvider y router reales. MSW
responde a nivel de red, con onUnhandledRequest: 'error': un endpoint no
declarado hace fallar la prueba en vez de colgarla.
Cómo se ejecutan
npm test # las cuatro suites, un reporte de cobertura combinado
npm run test:unit # sin Docker: shared + api-unit + web
npm run test:integration # requiere npm run db:up
npm run test:coverage # genera coverage/ (HTML, lcov, json-summary)
En CI (ci.yml)
cada PR corre formato, lint, tipos, las cuatro suites contra un PostgreSQL
efímero y el build. Es check obligatorio para fusionar a main.
Cobertura
Se reporta desde la Entrega 1 (v8, HTML + lcov + json-summary, artefacto de
CI) pero no rompe el build todavía: un umbral sin línea base empuja a
escribir pruebas de relleno. El umbral bloqueante llega en la Entrega 2, sobre
services y hooks.
La cobertura de cada entrega queda congelada en el repositorio, ver Evidencias.
Qué se prueba y qué no
- Se prueba: reglas de negocio y casos borde, autorización, validación de entrada, contratos HTTP, persistencia y restricciones, estados de la interfaz (carga, vacío, error de validación, error del servidor).
- No se prueba: código de terceros, configuración declarativa sin lógica, estilos visuales.
Defectos
Se registran en Jira con pasos de reproducción, resultado esperado, resultado obtenido, severidad y evidencia. Todo defecto corregido llega con una prueba que falla antes del arreglo.
Evolución por entrega
| Entrega | Qué se suma |
|---|---|
| 1 | Unitario, integración y componente; cobertura reportada; CI en cada PR |
| 2 | Jenkins como CI/CD oficial; pruebas de los dos requerimientos nuevos; umbral de cobertura bloqueante; Slack |
| 3 | Al menos 10 E2E headless en el pipeline, con capturas y reportes como artefactos |
Decisiones que ya preparan la Entrega 3: sesión por cookie httpOnly, menú
"Mover a…" además del arrastre, y seed idempotente con datos fijos.