Patrones de Pruebas Python
Estrategias completas de pruebas para aplicaciones Python usando pytest, metodología TDD y buenas prácticas.
Cuándo Activar
- Escribir código Python nuevo (seguir TDD: rojo, verde, refactorizar)
- Diseñar suites de pruebas para proyectos Python
- Revisar la cobertura de pruebas Python
- Configurar infraestructura de pruebas
Filosofía Central de Pruebas
Desarrollo Guiado por Pruebas (TDD)
Siempre seguir el ciclo TDD:
- ROJO: Escribir una prueba que falle para el comportamiento deseado
- VERDE: Escribir el código mínimo para que la prueba pase
- REFACTORIZAR: Mejorar el código manteniendo las pruebas en verde
Requisitos de Cobertura
- Objetivo: 80%+ de cobertura de código
- Rutas críticas: 100% de cobertura requerida
- Usar
pytest --covpara medir la cobertura
Fundamentos de pytest
Estructura Básica de Pruebas
Aserciones
Fixtures
Uso Básico de Fixtures
Fixture con Setup/Teardown
Alcances de Fixtures
Fixture con Parámetros
Fixtures Autouse
Conftest.py para Fixtures Compartidos
Parametrización
Parametrización Básica
Múltiples Parámetros
Parametrizar con IDs
Markers y Selección de Pruebas
Markers Personalizados
Ejecutar Pruebas Específicas
Configurar Markers en pytest.ini
Mocking y Patching
Mocking de Funciones
Mocking de Excepciones
Mocking de Context Managers
Usar Autospec
Mock de Propiedades
Pruebas de Código Asíncrono
Pruebas Async con pytest-asyncio
Fixture Async
Pruebas de Excepciones
Probar Excepciones Esperadas
Pruebas con tmp_path
Organización de Pruebas
Estructura de Directorio
Clases de Prueba
Buenas Prácticas
HACER
- Seguir TDD: Escribir pruebas antes que el código (rojo-verde-refactorizar)
- Probar una sola cosa: Cada prueba debe verificar un único comportamiento
- Usar nombres descriptivos:
test_user_login_with_invalid_credentials_fails - Usar fixtures: Eliminar duplicación con fixtures
- Mockear dependencias externas: No depender de servicios externos
- Probar casos borde: Entradas vacías, valores None, condiciones de frontera
- Apuntar a 80%+ de cobertura: Enfocarse en rutas críticas
- Mantener pruebas rápidas: Usar markers para separar pruebas lentas
NO HACER
- No probar implementación: Probar comportamiento, no internos
- No usar condicionales complejos en pruebas: Mantener pruebas simples
- No ignorar fallos de prueba: Todas las pruebas deben pasar
- No probar código de terceros: Confiar en que las bibliotecas funcionan
- No compartir estado entre pruebas: Las pruebas deben ser independientes
Configuración de pytest
pytest.ini
Ejecutar Pruebas
Recuerda: Las pruebas también son código. Mantenlas limpias, legibles y mantenibles. Las buenas pruebas detectan bugs; las excelentes pruebas los previenen.

