6. Usar pytest-cov para medir cobertura al ejecutar pytest

6.1 Objetivo del tema

Hasta ahora ejecutamos las pruebas con python -m coverage run -m pytest y luego generamos el reporte con python -m coverage report. Ese flujo funciona bien, pero en proyectos con pytest es muy común usar el plugin pytest-cov.

pytest-cov permite pedir la cobertura directamente en el comando de pytest, sin separar la ejecución de las pruebas y la generación del reporte.

Objetivo práctico: ejecutar pytest con --cov y obtener el reporte de cobertura en la misma corrida.

6.2 Instalar pytest-cov

Con el entorno virtual activo, instala el plugin:

python -m pip install pytest-cov

Si el proyecto usa requirements.txt, conviene agregar la dependencia para que otros puedan recrear el entorno:

pytest
coverage
pytest-cov

Luego puedes reinstalar las dependencias con:

python -m pip install -r requirements.txt

6.3 Verificar que el plugin está disponible

Para confirmar que pytest reconoce la opción --cov, puedes ejecutar:

python -m pytest --help

En la ayuda debe aparecer una sección con opciones de cobertura, como --cov y --cov-report.

6.4 Ejecutar pytest con cobertura

El comando básico es:

En Windows PowerShell:

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

En Linux o macOS:

PYTHONPATH=src python -m pytest --cov=src

La opción --cov=src indica que queremos medir la cobertura del código ubicado dentro de la carpeta src.

6.5 Salida esperada

La ejecución muestra primero el resultado de las pruebas y luego el reporte de cobertura:

---------- coverage: platform win32, python 3.x.x-final-0 -----------
Name                     Stmts   Miss  Cover
--------------------------------------------
src\tienda\__init__.py       0      0   100%
src\tienda\precios.py       14      2    86%
--------------------------------------------
TOTAL                       14      2    86%

A diferencia de reportes anteriores, al usar --cov=src se mide solamente el código de aplicación dentro de src, no los archivos de prueba.

6.6 Mostrar líneas faltantes

Para ver qué líneas quedaron sin ejecutar, usa --cov-report=term-missing:

En Windows PowerShell:

$env:PYTHONPATH="src"
python -m pytest --cov=src --cov-report=term-missing

En Linux o macOS:

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

La salida agrega la columna Missing:

Name                     Stmts   Miss  Cover   Missing
------------------------------------------------------
src\tienda\__init__.py       0      0   100%
src\tienda\precios.py       14      2    86%   6, 14
------------------------------------------------------
TOTAL                       14      2    86%

6.7 Medir un paquete específico

También puedes indicar el paquete que quieres medir:

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

Esto funciona si PYTHONPATH apunta a src o si el paquete está instalado en el entorno. En este curso seguiremos usando --cov=src hasta configurar el proyecto con más detalle.

6.8 Diferencia con coverage run

Estos dos enfoques miden cobertura usando la misma herramienta de base, pero cambian la forma de invocarla.

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

Con coverage run separas la medición y el reporte. Con pytest-cov obtienes ambas cosas desde pytest. Para trabajo diario con pytest, pytest-cov suele ser más cómodo.

6.9 Cuándo usar cada opción

  • coverage run: útil para entender el flujo interno y para medir programas que no se ejecutan con pytest.
  • pytest-cov: cómodo cuando todo el flujo de pruebas pasa por pytest.
  • coverage report: útil cuando quieres generar reportes después de una medición ya guardada.
  • term-missing: útil cuando necesitas ver rápidamente qué líneas faltan.

6.10 Problemas frecuentes

  • unrecognized arguments: --cov: instala pytest-cov en el entorno virtual activo.
  • No module named tienda: define PYTHONPATH=src o instala el paquete correctamente.
  • El reporte incluye archivos inesperados: revisa el valor usado en --cov.
  • El porcentaje cambió respecto del tema anterior: puede deberse a que ahora se mide solo src y no tests.

6.11 Conclusión

En este tema instalamos pytest-cov y usamos python -m pytest --cov=src para medir cobertura directamente al ejecutar pytest.

También usamos --cov-report=term-missing para ver las líneas faltantes. En el próximo tema vamos a profundizar en los reportes de terminal y en cómo leerlos con más criterio.