4. Ejecutar pruebas con coverage run y generar el reporte básico

4.1 Objetivo del tema

En el tema anterior instalamos coverage.py y obtuvimos una primera medición. Ahora vamos a ordenar el flujo de trabajo básico: limpiar mediciones anteriores, ejecutar las pruebas bajo cobertura y generar el reporte desde la terminal.

La idea es que puedas repetir siempre la misma secuencia y entender qué archivo genera cada comando.

Objetivo práctico: ejecutar pytest mediante coverage run y generar un reporte básico con coverage report.

4.2 Punto de partida

Seguiremos usando el proyecto cobertura-demo. Entra en la carpeta del proyecto y activa el entorno virtual antes de ejecutar los comandos.

En Windows PowerShell:

cd cobertura-demo
.venv\Scripts\Activate.ps1

En Linux o macOS:

cd cobertura-demo
source .venv/bin/activate

También necesitamos que Python encuentre el paquete dentro de src. Por eso usaremos PYTHONPATH en los comandos.

4.3 Por qué usamos python -m coverage

La herramienta puede ejecutarse como coverage, pero en este curso usaremos la forma:

python -m coverage

Esto ayuda a evitar confusiones cuando hay varios Python instalados. El comando se ejecuta con el mismo intérprete del entorno virtual activo.

4.4 Limpiar mediciones anteriores

Antes de medir desde cero, puedes borrar los datos acumulados de cobertura:

python -m coverage erase

Este comando elimina el archivo .coverage si existe. No borra tu código ni tus pruebas; solamente elimina los datos guardados por mediciones anteriores.

4.5 Ejecutar pytest con coverage run

Para medir cobertura, no ejecutamos pytest directamente. Lo ejecutamos a través de coverage run.

En Windows PowerShell:

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

En Linux o macOS:

PYTHONPATH=src python -m coverage run -m pytest

La opción -m pytest le indica a Python que ejecute pytest como módulo. Coverage observa esa ejecución y registra qué líneas del programa fueron ejecutadas.

4.6 Qué genera coverage run

Después de ejecutar las pruebas, coverage crea un archivo llamado .coverage en la carpeta del proyecto.

cobertura-demo/
|-- .coverage
|-- src/
|-- tests/
`-- requirements.txt

Ese archivo contiene los datos crudos de la medición. Normalmente no se abre ni se edita a mano. Se usa como entrada para generar reportes.

4.7 Generar el reporte básico

Una vez creada la medición, genera el reporte en la terminal:

python -m coverage report

Una salida posible es:

Name                     Stmts   Miss  Cover
--------------------------------------------
src\tienda\__init__.py       0      0   100%
src\tienda\precios.py       14      2    86%
tests\test_precios.py       10      0   100%
--------------------------------------------
TOTAL                       24      2    92%

El reporte básico permite ver rápidamente cuántas sentencias fueron detectadas, cuántas no se ejecutaron y qué porcentaje de cobertura tiene cada archivo.

4.8 Ejecutar el flujo completo

Cuando quieras medir desde cero, puedes usar esta secuencia.

En Windows PowerShell:

python -m coverage erase
$env:PYTHONPATH="src"
python -m coverage run -m pytest
python -m coverage report

En Linux o macOS:

python -m coverage erase
PYTHONPATH=src python -m coverage run -m pytest
python -m coverage report

Esta secuencia evita mezclar datos viejos con la medición actual.

4.9 Diferencia entre pytest y coverage run

Si ejecutas solamente:

python -m pytest

las pruebas se ejecutan, pero no se genera información de cobertura. En cambio, con:

python -m coverage run -m pytest

las pruebas también se ejecutan, pero coverage registra qué partes del código fueron recorridas.

4.10 Problemas frecuentes

  • No data to report: primero ejecuta python -m coverage run -m pytest y luego python -m coverage report.
  • No module named tienda: revisa que PYTHONPATH apunte a src.
  • El porcentaje no cambia: borra los datos anteriores con python -m coverage erase y vuelve a ejecutar la medición.
  • Coverage mide archivos de prueba: más adelante configuraremos qué fuentes incluir y qué archivos omitir.

4.11 Conclusión

En este tema ordenamos el flujo básico de cobertura: limpiar datos anteriores, ejecutar pytest mediante python -m coverage run -m pytest y generar el reporte con python -m coverage report.

En el próximo tema vamos a interpretar con más detalle las columnas del reporte: Stmts, Miss, Cover y otros valores que aparecen al configurar mejor la medición.