✅ Conceptos básicos de pytest
pytest es el framework de pruebas estándar del ecosistema Python. Un archivo test_*.py, funciones que comienzan con test_, e assert para verificar. Así de simple. Pídele a Claude Code: "escreve testes pytest para este modulo" y genera pruebas para cada función.
from calculator import add, divide
def test_add():
assert add(2, 3) == 5
assert add(-1, 1) == 0
def test_divide():
assert divide(10, 2) == 5.0
def test_divide_by_zero():
import pytest
with pytest.raises(ZeroDivisionError):
divide(1, 0)
# Rodar: pytest -v
En 1 frase: pytest -v = comentarios instantáneos sobre lo que funciona y lo que se rompió.
🔩 Fixtures y conftest
Fixtures preparan el estado que necesitan tus pruebas: una base de datos temporal, un cliente HTTP, datos de ejemplo. El archivo conftest.py comparte fixtures entre todos los archivos de prueba del directorio. Usa @pytest.fixture es el parámetro scope para controlar el ciclo de vida.
import pytest
from fastapi.testclient import TestClient
from main import app
@pytest.fixture
def client():
return TestClient(app)
@pytest.fixture
def sample_item():
return {"name": "Widget", "price": 9.99, "tags": ["new"]}
En 1 frase: fixtures = configuración reutilizable; conftest.py = fixtures compartidas.
🎭 Mocks y parches
Los mocks simulan dependencias externas. Si tu función llama a una API, la prueba no debe depender de que esa API esté disponible. Usa unittest.mock.patch para sustituir la llamada real por una respuesta controlada. Claude Code genera mocks precisos cuando indicas qué quieres aislar.
En 1 frase: mock.patch = probar tu código sin depender del mundo externo.
📊 Informe de cobertura
La cobertura mide qué líneas de tu código ejecutan las pruebas. Con pytest-cov, ejecuta pytest --cov=src --cov-report=html y mira exactamente qué rutas no están cubiertas. No busques el 100 %; busca cubrir las rutas críticas.
# Instalar pip install pytest-cov # Rodar com coverage pytest --cov=src --cov-report=term-missing # Gerar relatorio HTML pytest --cov=src --cov-report=html # Abrir htmlcov/index.html no browser
En 1 frase: coverage muestra lo que NO probaste; enfócate en las rutas críticas.
🔴 TDD con Claude
TDD con IA es un superpoder: tú escribes la prueba (el «qué»), Claude Code genera la implementación (el «cómo»). Ciclo: Rojo (la prueba falla) -> Verde (Claude implementa hasta que pase) -> Refactorización (Claude limpia el código). Tú controlas la especificación; la IA hace el trabajo pesado.
Flujo de trabajo TDD + Claude Code
1. Escribe la prueba para el comportamiento deseado
2. Ejecuta pytest (rojo: la prueba falla)
3. Pídele a Claude: "implementa para que pase esta prueba"
4. Ejecuta pytest (en verde: la prueba pasa)
5. Pídele a Claude: "refactoriza manteniendo las pruebas en verde"
En 1 frase: TDD + IA = tú defines QUÉ, Claude hace CÓMO.
🔗 Integración de CI
Las pruebas locales son buenas; las pruebas en CI son obligatorias. GitHub Actions ejecuta pytest en cada push/PR automáticamente. Si alguna prueba falla, se bloquea el merge. Claude Code genera el workflow YAML completo: "cria um GitHub Actions que roda pytest com coverage".
name: Tests
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.12"
- run: pip install -r requirements.txt
- run: pytest --cov=src -v
En 1 frase: CI = las pruebas se ejecutan automáticamente en cada push; nadie rompe lo que funciona.
🧾 Resumen del módulo
Siguiente módulo:
5.5 — Deploy e infraestructura: Docker, cloud y monitoring.