Ir al contenido
angel.library

Estrategia de testing — qué probar en cada nivel

La unidad correcta no siempre es una función. Elige el nivel más bajo que reproduzca el riesgo real sin simular la parte que quieres verificar.

regla pura → unitario
adaptador + dependencia real → integración
productor ↔ consumidor → contrato
componente + DOM → componente/navegador
flujo completo → E2E
atributo transversal → seguridad, accesibilidad o rendimiento
NivelÚtil paraEvitar
Unitarioreglas, parsers, cálculosmocks de cada línea interna
IntegraciónDB, HTTP, módulos colaborandoreemplazar la dependencia principal
ContratoAPIs entre serviciosasumir que OpenAPI y runtime coinciden
E2Eflujos críticos de usuariocubrir cada combinación visual
  • Autorización y ownership.
  • Pagos, inventario y cálculos.
  • Migraciones y queries importantes.
  • Formularios y flujos de recuperación.
  • Bugs que ya ocurrieron: cada regresión debería dejar una prueba.

Una matriz sencilla combina probabilidad e impacto. Un error frecuente pero cosmético y un error raro que duplica un cobro no reciben el mismo esfuerzo.

Impacto / ProbabilidadBajaAlta
Bajoexploratoria o comprobación manualautomatización pequeña
Altoprueba dirigida + monitoreovarias capas y bloqueo de release

Para un pago, una prueba unitaria protege el cálculo, integración protege idempotencia y persistencia, contrato protege al proveedor y un E2E confirma el recorrido principal. No son cuatro copias: cada una observa una frontera diferente.

  • Determinista: controla reloj, random y datos.
  • Aislada: no depende de orden ni ambiente personal.
  • Legible: explica comportamiento, no implementación accidental.
  • Rápida en feedback local y completa en CI.
  • Con datos mínimos que destaquen el caso relevante.

Sustituye límites lentos o no deterministas —correo, pagos o APIs externas—, pero mantén pruebas de integración para el adaptador real. Si todo está simulado, la suite solo demuestra que los dobles coinciden entre sí.

Ejecutar formato/lint, tipos, unitarios, build y un conjunto E2E crítico. Separa tests lentos, pero no permitas que queden permanentemente fuera del camino de publicación.

MomentoSuite apropiada
mientras programasarchivo o módulo afectado en watch
pre-push / PRunitarios, integración, tipos y smoke E2E
rama principalmatriz completa y contratos
programadanavegadores amplios, visual, carga y exploración asistida
antes de release críticoaceptación, migración y rollback ensayados

Si una regla puede expresarse como una función pura, pruébala con muchos casos pequeños. Si depende de SQL, serialización, cookies o encabezados, usa integración con la dependencia real en un entorno controlado. Si el riesgo está en la navegación, el streaming o la composición de varias piezas, usa pruebas de extremo a extremo (E2E). La cantidad de pruebas debe seguir el costo de una regresión, no una proporción rígida.

RiesgoPrueba recomendadaSeñal de éxito
Precio o descuento incorrectounitario con límitestotal exacto y errores claros
Query no autorizadaintegración con DBusuario ajeno recibe rechazo
API consumida por otro equipocontrato + integraciónschema y errores compatibles
Compra completaE2E con proveedor simuladousuario puede terminar el flujo

Usa una base de datos efímera o un schema por suite para integración. Limpia por test o genera identificadores únicos; depender de un orden compartido crea fallos que solo aparecen en CI paralelo. Congela reloj y random cuando sean parte del resultado, pero agrega al menos un test de límites reales de zona horaria y fechas.

Incluye timeout, respuesta parcial, reintento, doble clic, sesión expirada, permiso revocado y dependencia caída. Un sistema confiable no solo devuelve el resultado feliz: conserva invariantes cuando una operación se repite o falla a mitad. Los bugs descubiertos en producción deben transformarse en una prueba de regresión antes de cerrar el incidente.

Mide duración, flaky rate y cobertura de rutas críticas. Elimina tests duplicados cuando una prueba superior ya cubre el mismo riesgo, pero no borres un caso porque “ya pasó una vez”. Revisa cada test que falla por un cambio de texto o estructura: quizá el selector está acoplado a implementación y debe migrar a un rol o contrato más estable.

Define cuánto puede tardar cada ciclo. Si la suite de PR tarda una hora, el equipo empieza a evitarla; si dura dos minutos pero omite persistencia y navegación, entrega falsa velocidad. Paraleliza después de garantizar aislamiento y mueve suites costosas a etapas posteriores solo si todavía bloquean la publicación adecuada.

Registra por test o grupo:

  • duración y tendencia;
  • tasa de reintentos e inestabilidad;
  • último fallo real detectado;
  • propietario o área;
  • evidencia disponible al fallar.

“Todos los tests pasan” es insuficiente si faltan pruebas planificadas o existe un riesgo aceptado. Un criterio de salida puede exigir: rutas críticas verdes, cero defectos bloqueantes conocidos, migración ensayada, accesibilidad automática sin violaciones nuevas y observabilidad preparada. Las excepciones deben tener responsable y vencimiento.