Saber qué partes del código están probadas y cuáles no es uno de los retos más importantes en proyectos grandes de software. Coverage es la herramienta que resuelve exactamente ese problema: ejecuta tus pruebas y, al mismo tiempo, registra qué líneas de código fueron alcanzadas y cuáles quedaron sin cubrir. Con esa información puedes generar reportes claros, establecer estándares de calidad con tu equipo y mejorar la confiabilidad de tu proyecto.
¿Qué es Coverage y por qué es esencial en tus proyectos?
Coverage, o cobertura de código, es una librería que corre tus pruebas unitarias y captura un registro detallado de cada línea ejecutada [0:26]. Una vez finalizada la ejecución, genera un reporte que indica qué porcentaje del código fuente fue cubierto por las pruebas.
El beneficio principal es la visibilidad: si tienes una clase con quinientas líneas y solo pruebas la mitad, el reporte mostrará un cincuenta por ciento de cobertura [1:00]. Esto permite que todo el equipo de desarrollo acuerde un porcentaje mínimo permitido. La recomendación es que sea al menos el ochenta por ciento [1:13].
¿Cómo se instala Coverage en Python?
La instalación sigue el flujo habitual de cualquier librería de Python [1:24]:
- Abre la terminal y ejecuta
pip install coverage.
- Congela la versión con
pip freeze | grep coverage.
- Copia el resultado en tu archivo
requirements.txt para que el resto del equipo pueda instalarla.
Una vez instalada, ejecuta coverage help para ver los comandos disponibles [1:48].
¿Cuáles son los comandos principales de Coverage?
Los tres comandos fundamentales son:
- run: ejecuta las pruebas y captura todas las variables y el contexto de ejecución [2:02].
- report: muestra el reporte de cobertura en la terminal.
- html: genera un reporte visual en HTML que puedes compartir con tu equipo [2:16].
¿Cómo ejecutar pruebas y generar reportes con Coverage?
Para correr las pruebas se usa el comando coverage run -m unittest discover tests [2:28]. El parámetro discover indica que debe buscar pruebas automáticamente dentro de la carpeta tests.
Al ejecutar el comando, Coverage muestra cuántas pruebas corrieron y cuáles fallaron. En el ejemplo práctico, algunas pruebas fallaban porque se habían agregado funcionalidades nuevas —como la restricción de retiros entre las 8 AM y las 5 PM— sin actualizar los mocks correspondientes [3:08]. La solución fue agregar el mock de datetime para simular una hora válida, como las diez de la mañana.
Una vez corregidas las pruebas, el reporte se genera con coverage report [4:02]. Este muestra:
- Cada archivo del proyecto.
- El número de sentencias definidas.
- Las sentencias que faltan por probar.
- El porcentaje de cobertura por archivo y total.
¿Cómo excluir archivos de prueba del reporte?
Un problema común es que Coverage incluya los propios archivos de prueba como si fueran código fuente [4:30]. Para resolverlo, se usa el parámetro --source al ejecutar run, indicando la carpeta del código fuente: coverage run --source=src -m unittest discover tests [4:50]. Así el reporte solo refleja la cobertura del código de producción.
¿Cómo usar el reporte HTML para encontrar líneas sin probar?
El comando coverage html genera una carpeta llamada htmlcov con un archivo index.html [5:28]. Al abrirlo en el navegador, puedes ver el mismo reporte de forma visual e interactiva: cada archivo es clickeable y resalta en color las líneas que no fueron ejecutadas por ninguna prueba [5:48].
En el ejemplo, el reporte reveló que:
- En
api_client.py había código que no se estaba probando desde las pruebas actuales, y como ese método ya se validaba en otra parte, se eliminó [6:06].
- En
calculator.py faltaba probar la línea que lanza un error al dividir por cero [6:30].
Para cubrir esa línea, se agregó una prueba usando self.assertRaises(ValueError) con una división entre cero [6:46]. Un detalle importante: al duplicar una prueba, hay que cambiar el nombre del método, porque Python solo reconoce la última definición si dos métodos comparten nombre [7:24].
Tras corregir esto y regenerar el reporte, la cobertura alcanzó el cien por ciento [7:40]. Sin embargo, en la práctica los proyectos rara vez llegan a ese número.
Como paso adicional, revisa la documentación oficial de Coverage para aprender a configurar un porcentaje mínimo de cobertura que impida que las pruebas pasen si no se alcanza ese umbral [8:00]. Comparte en los comentarios cuál es el coverage de los proyectos en los que has trabajado.