Ejecución paralela de pruebas unitarias con pytest y coverage

Clase 7 de 17Curso de Python Profesional: Arquitectura de Proyectos, Entornos y PyPI

Resumen

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 pyproject con 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 testPaths y los patrones con python_files.
  • Expón la app con PYTHONPATH apuntando a SRC para 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 htmlcov con index.html y 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?