Ejecución paralela de pruebas unitarias con pytest y coverage
Clase 7 de 17 • Curso de Python Profesional: Arquitectura de Proyectos, Entornos y PyPI
Refactorizar sin pruebas es arriesgado. Con pruebas unitarias, pytest y coverage obtienes velocidad y confianza: ejecutas tests en paralelo, mides qué partes del código están cubiertas y ves errores con mejor detalle. Además, aplicar Test Driven Development guía el diseño y evita regresiones.
¿Qué es pytest y por qué mejora tus pruebas unitarias?
Pytest es el estándar moderno en Python para pruebas unitarias. Es más simple de escribir, ofrece mejor reporte de errores y soporta plugins avanzados sin complicar la sintaxis. Lo mejor: puede ejecutar los unit tests existentes sin reescribirlos.
- Pruebas unitarias: validan unidades pequeñas de código y documentan el comportamiento esperado.
- Unit Test: biblioteca estándar tradicional; en el proyecto de Platzi News se usó para crear tests.
- Pytest: ejecución sencilla, reporting claro y extensible mediante plugins.
¿Cómo instalar pytest como dependencia de desarrollo?
- Ejecuta:
v add --dev pytest. - Verás los paquetes instalados y cambios en
pyprojectcon la versión de pytest.
¿Qué configuración básica necesita pytest?
- En
pyproject, agrega la sección de configuración:tool.pytest.ini_options. - Define las rutas de pruebas con
testPathsy los patrones conpython_files. - Expón la app con
PYTHONPATHapuntando aSRCpara que pytest encuentre tu código.
# pyproject.toml
[tool.pytest.ini_options]
testPaths = ["tests"]
python_files = ["test_*.py"]
¿Cómo medir cobertura con coverage y generar reportes útiles?
La métrica coverage indica qué porcentaje de tu código está cubierto por pruebas. Ayuda a priorizar dónde escribir nuevos tests y a visualizar líneas no ejercitadas.
- Instala el plugin:
v add --dev pytest-cov. - Ejecuta con parámetros de cobertura y reporte HTML.
pytest --cov=SRC --cov-report=html
- Se genera la carpeta
htmlcovconindex.htmly un resumen por archivo. - Ejemplo observado: 80 % de cobertura total. Archivos con 100 % están completos; otros muestran líneas sin probar.
- Interpretación visual: líneas verdes aprobadas; líneas rojas sin pruebas que las ejecuten.
¿Qué decisiones tomar con el reporte de coverage?
- Prioriza módulos en rojo con lógica crítica.
- Agrega casos para ramas no cubiertas (condiciones, excepciones, bordes).
- Repite la medición hasta alcanzar un nivel objetivo sostenible.
¿Cómo paralelizar pruebas con xdist y aplicar TDD en tu flujo?
La ejecución paralela con xdist usa múltiples núcleos para reducir drásticamente el tiempo de feedback. Esto incentiva ciclos rápidos y seguros, ideal al practicar TDD.
- Instala el plugin:
v add --dev pytest-xdist. - Ejecuta en paralelo con detección automática de núcleos.
pytest -n auto
- Resultado observado: todas las pruebas en menos de un segundo usando 11 workers.
- Agrega verbosidad para más detalle en la terminal: progreso, nodo, clase y método del test.
pytest -n auto --cov=SRC --cov-report=html -b -v
¿Por qué sumar Test Driven Development a esta configuración?
- Test Driven Development te hace escribir el test antes del código.
- Beneficios: diseño más claro, foco en requisitos y verificación continua al refactorizar.
- Con pytest, coverage y xdist, el ciclo rojo–verde–refactor es ágil y confiable.
¿Qué otros plugins puedes explorar para tu contexto?
pytest-mock: crea mocks de dependencias fácilmente.pytest-randomly: ejecuta en orden aleatorio para detectar dependencias entre tests.- La ecosistema de pytest incluye miles de plugins: elige el que resuelva tu necesidad específica.
¿Te gustaría compartir qué plugin adicional probaste, cómo configuraste tu pyproject o qué mejoras viste en tiempos y cobertura?