Estrategia de Pruebas Automaticas - Davidcuama/via-coinogas GitHub Wiki
Estrategia de Pruebas Automáticas — Sprint 2
Cada funcionalidad entregada tiene al menos dos pruebas automáticas: una de happy path y otra de flujo alternativo. Las pruebas corren en el CI (GitHub Actions) en cada PR, y un merge se bloquea si fallan.
Tabla de estrategia
| Funcionalidad | Tipo de prueba | Justificación |
|---|---|---|
| HU-16 Consecutivo único | Unitaria + Concurrencia | El formato es regla pura (unitaria); la unicidad bajo concurrencia exige hilos con SELECT FOR UPDATE real. |
| HU-15 Validación obligatoria | Integración (vista) | La regla vive en el borde HTTP; probar la vista garantiza que aplica aun sin el navegador. |
| HU-06/07 Ítems | Integración (formset) | El formset y la transacción encabezado+ítems se prueban juntos: "todo o nada". |
| HU-19 Notificación correo | Integración con mock SMTP | Verifica que el correo se dispara sin enviar correo real. |
| HU-34 Aviso antes de enviar | Escenario (plantilla) | Happy: el modal y su resumen están en el HTML. Alt: envío inválido no radica; borrador omite el aviso. |
| HU-29 Vistas analíticas | Integración (SQL) | Happy: las vistas desnormalizan y agregan bien. Alt: requerimiento sin ítems reporta 0; la vista es de solo lectura. |
| HU-22 Ficha completa | Integración + permisos | Happy: el analista ve todo el detalle. Alt: solicitante 403, consecutivo inexistente 404. |
| HU-21 Filtros de la bandeja | Integración (vista con GET) | Los filtros son una consulta: se prueba la vista con datos sembrados en varias áreas, prioridades y fechas. Alt: valores inválidos y rango invertido no rompen la bandeja. |
| HU-13 Proveedores sugeridos | Integración (formulario + transacción) | La regla "fila empezada = nombre y teléfono" vive en el formulario; probar el POST completo confirma que entra en la misma transacción de la radicación. |
| HU-14 Productos sustitutos | Unitaria (modelo) + integración | La regla "sí exige descripción" se prueba en el modelo (vale aunque se cree desde otro lado) y en el formulario. |
| Comandos de gestión | Unitaria (call_command) |
cargar_catalogos, crear_perfiles y crear_rol_analitica. El de PostgreSQL usa un cursor simulado para verificar el SQL que emite. |
Happy path + alternativo por HU del Sprint 2
- HU-34 — happy: modal presente / alt: envío inválido no radica
- HU-29 — happy: vista desnormaliza y agrega / alt: sin ítems reporta 0; solo lectura
- HU-22 — happy: ficha completa / alt: 403 a solicitante y 404 a consecutivo inexistente
- HU-21 — happy: filtra por área, prioridad y fechas, y ordena / alt: sin coincidencias avisa; valor inválido o rango invertido no se aplican
- HU-13 — happy: guarda hasta 3 proveedores con teléfono / alt: fila incompleta o teléfono inválido bloquean la radicación
- HU-14 — happy: guarda los sustitutos / alt: «sí» sin descripción bloquea; «no» descarta lo escrito
- HU-35 — happy: el solicitante recibe su confirmación (
NotificacionConfirmacionSolicitanteTests) / alt: cuenta sin correo o falla del SMTP no tumban la radicación - HU-25 — happy: busca entre lo propio por consecutivo o descripción (
MisRequerimientosTests) / alt: no muestra lo ajeno - HU-30 — happy: siembra y exporta los datos del tablero (
SembrarDemoTests,ExportarAnaliticaTests) / alt: se niega conDEBUG=False
Extras del Sprint 2
- Corregir hallazgos de análisis estático del Sprint 1 → Ruff pasa limpio.
- Correr pruebas en cada PR → configurado en
ci.yml(jobs calidad, seguridad, pruebas). - Bloquear merge si fallan → la protección de rama de
mainexige los 3 checks en verde y una aprobación. - Control de coverage →
coverageen el pipeline con mínimo del 90%.
Coverage en el CI
coverageestá enrequirements-dev.txty su configuración enpyproject.toml([tool.coverage.*]): se mide solo el código propio, sin migraciones ni pruebas, con cobertura de ramas (branch = true).- El job Pruebas automatizadas (Django) corre
coverage run manage.py testy luegocoverage report, que falla si la cobertura baja del 90% (fail_under). Como el merge exige el CI en verde, un PR que baje la cobertura no entra amain. - Cada ejecución publica el reporte HTML como artefacto reporte-cobertura (pestaña Actions → la ejecución → Artifacts), con el detalle línea por línea.
Por qué 90%: al activar el control la cobertura estaba en 86%; los comandos de
gestión (cargar_catalogos, crear_perfiles, crear_rol_analitica) estaban en
0%. Con sus pruebas subió a 97%. El mínimo se fija en 90% para dejar margen a
código difícil de probar (configuración por entorno) sin aceptar que una
funcionalidad nueva entre sin pruebas.
Cómo verlo en local:
pip install -r requirements-dev.txt
DB_ENGINE=sqlite coverage run manage.py test
coverage report
coverage html # abre htmlcov/index.html