A veces la cobertura se obtiene en más de una ejecución: pruebas unitarias por un lado, pruebas de integración por otro, o la misma suite ejecutada en distintos sistemas operativos.
En este tema vamos a combinar esos resultados para obtener un reporte consolidado.
python -m coverage combine.
No siempre necesitas combinar cobertura. Es útil cuando el proyecto ejecuta pruebas en grupos separados.
Si ejecutas dos mediciones normales, la segunda puede sobrescribir los datos de la primera:
python -m coverage run -m pytest tests/unit
python -m coverage run -m pytest tests/integration
Al final podrías tener cobertura solo de la última ejecución. Para evitarlo, usamos modo paralelo.
En pyproject.toml, agrega parallel = true:
[tool.coverage.run]
source = ["src"]
branch = true
parallel = true
Con esta opción, coverage no escribe solo .coverage. Genera archivos con nombres únicos:
.coverage.DESKTOP.12345.Xabc
.coverage.DESKTOP.12346.Ydef
Ahora puedes ejecutar grupos separados:
python -m coverage erase
python -m coverage run -m pytest tests/unit
python -m coverage run -m pytest tests/integration
Cada ejecución guardará sus datos en un archivo separado gracias a parallel = true.
Para unir todos los archivos de datos, ejecuta:
python -m coverage combine
Coverage lee los archivos .coverage.* y genera un archivo combinado .coverage.
Luego puedes crear el reporte:
python -m coverage report -m
Una secuencia completa sería:
python -m coverage erase
python -m coverage run -m pytest tests/unit
python -m coverage run -m pytest tests/integration
python -m coverage combine
python -m coverage report -m
Si quieres reporte HTML:
python -m coverage html
Supongamos que las pruebas unitarias cubren funciones puras y las de integración cubren flujos completos:
tests/unit/test_tarifas.py
tests/unit/test_cupones.py
tests/integration/test_compra_completa.py
Por separado, cada suite muestra una parte del sistema. Al combinarlas, el reporte refleja todo lo ejecutado entre ambas.
Con pytest-cov, muchas veces el plugin maneja la combinación cuando ejecuta pruebas en paralelo dentro del mismo comando. Pero si haces ejecuciones separadas, sigue siendo útil entender coverage combine.
Una alternativa es generar datos con coverage.py directamente para tener control explícito del flujo.
En integración continua, puede haber varios trabajos que generan artefactos de cobertura. El flujo general es:
.coverage.* como artefactos.coverage combine y genera el reporte final.El detalle exacto depende de la plataforma de CI, pero la idea es siempre la misma.
Después de las ejecuciones, puedes listar los archivos de cobertura:
dir .coverage*
En Linux o macOS:
ls -a .coverage*
Si solo ves .coverage, quizá no está activo parallel = true o ya ejecutaste coverage combine.
Antes de una medición limpia, ejecuta:
python -m coverage erase
Esto elimina datos anteriores y evita mezclar resultados viejos con una corrida nueva.
.coverage.* para unir.parallel = true.python -m coverage erase antes de empezar.En este tema vimos cómo combinar resultados de cobertura de varias ejecuciones con parallel = true y python -m coverage combine.
En el próximo tema vamos a revisar errores frecuentes al medir cobertura y cómo corregirlos.