22. Errores frecuentes al medir cobertura y cómo corregirlos

22.1 Objetivo del tema

Cuando coverage no muestra lo esperado, el problema suele estar en la forma de ejecutar las pruebas, la configuración, el entorno virtual o los archivos que se están midiendo.

En este tema vamos a revisar errores frecuentes y una forma ordenada de diagnosticarlos.

Objetivo práctico: identificar la causa de un reporte incorrecto y corregirla sin adivinar.

22.2 No data to report

El mensaje No data to report aparece cuando coverage no encuentra datos para generar el reporte.

Causa común: ejecutar el reporte sin haber ejecutado antes las pruebas con coverage.

python -m coverage report

Corrección:

python -m coverage run -m pytest
python -m coverage report

Con pytest-cov, ejecuta directamente:

python -m pytest --cov=src --cov-report=term-missing

22.3 No module named tienda

Este error indica que Python no encuentra el paquete dentro de src.

En Windows PowerShell:

$env:PYTHONPATH="src"
python -m pytest

En Linux o macOS:

PYTHONPATH=src python -m pytest

También puedes instalar el paquete en modo editable si el proyecto está preparado para eso, pero en este curso usamos PYTHONPATH para mantener el foco en cobertura.

22.4 unrecognized arguments: --cov

Si pytest no reconoce --cov, falta instalar pytest-cov en el entorno virtual activo.

python -m pip install pytest-cov

Luego verifica:

python -m pytest --help

La ayuda debe mostrar opciones como --cov y --cov-report.

22.5 Coverage mide archivos de prueba

Si aparecen archivos dentro de tests, probablemente estás midiendo todo el proyecto en lugar de solo src.

Corrección con pytest-cov:

python -m pytest --cov=src --cov-report=term-missing

Corrección en pyproject.toml:

[tool.coverage.run]
source = ["src"]

22.6 El porcentaje no cambia

Si agregaste pruebas pero el porcentaje no cambia, revisa estas posibilidades:

  • No guardaste el archivo de prueba.
  • La prueba nueva no se está ejecutando.
  • Estás mirando un reporte viejo.
  • La prueba ejecuta líneas ya cubiertas.

Ejecuta desde cero:

python -m coverage erase
python -m coverage run -m pytest
python -m coverage report -m

22.7 El reporte HTML muestra datos viejos

El reporte HTML no se actualiza solo. Debes regenerarlo:

python -m coverage erase
python -m coverage run -m pytest
python -m coverage html

Después actualiza la página del navegador. Si hace falta, cierra y vuelve a abrir htmlcov/index.html.

22.8 La configuración no se aplica

Si pyproject.toml parece no tener efecto, revisa:

  • Que estés ejecutando los comandos desde la raíz del proyecto.
  • Que las secciones sean [tool.coverage.run] y [tool.coverage.report].
  • Que el archivo se llame exactamente pyproject.toml.
  • Que no haya otra configuración de coverage contradiciendo esos valores.

Para diagnosticar:

python -m coverage debug config

22.9 Branch coverage no aparece

Si no ves columnas como Branch o BrPart, probablemente no activaste cobertura de ramas.

Con coverage.py:

python -m coverage run --branch -m pytest
python -m coverage report -m

Con pytest-cov:

python -m pytest --cov=src --cov-branch --cov-report=term-missing

O en pyproject.toml:

[tool.coverage.run]
branch = true

22.10 El mínimo de cobertura falla

Si falla fail_under o --cov-fail-under, primero lee el reporte. No bajes el umbral automáticamente.

Posibles causas:

  • Se agregó código nuevo sin pruebas.
  • Se cambió la configuración y ahora se miden más archivos.
  • Se eliminaron pruebas que cubrían comportamiento importante.
  • El umbral era demasiado alto para el estado real del proyecto.

22.11 No data to combine

Este error aparece al ejecutar:

python -m coverage combine

y no hay archivos .coverage.* para combinar.

Corrección: activa parallel = true y ejecuta mediciones que generen archivos separados:

[tool.coverage.run]
parallel = true

22.12 Las líneas faltantes no coinciden

Si el reporte marca líneas que no coinciden con el archivo actual:

  • Guarda los archivos modificados.
  • Borra datos anteriores con coverage erase.
  • Vuelve a ejecutar las pruebas.
  • Regenera el reporte HTML si lo estás usando.

Los reportes siempre reflejan la medición realizada, no necesariamente el estado que tienes abierto si cambiaste archivos después.

22.13 Comando de diagnóstico rápido

Cuando algo no cierre, ejecuta una secuencia limpia:

python -m coverage erase
python -m coverage run -m pytest
python -m coverage report -m
python -m coverage debug config

Con pytest-cov:

python -m pytest --cov=src --cov-branch --cov-report=term-missing

22.14 Errores frecuentes de criterio

  • Corregir el número antes que la causa: primero entiende por qué cambió la cobertura.
  • Excluir archivos para pasar el mínimo: solo excluye si hay justificación técnica.
  • Agregar pruebas débiles: subir cobertura sin buenas aserciones no mejora la confianza.
  • No limpiar datos viejos: usa coverage erase cuando quieras medir desde cero.

22.15 Conclusión

En este tema repasamos errores frecuentes al medir cobertura y cómo diagnosticarlos. La mayoría se corrige revisando entorno, comandos, configuración y datos acumulados.

En el próximo tema vamos a definir una estrategia práctica para mejorar cobertura sin escribir pruebas frágiles.