pytest / Habilidad de Pruebas
Generación de pruebas y mejora de la cobertura: una Habilidad de Agente para Python 3.14 y pytest.
Qué Hace Esta Habilidad
Audita un módulo y añade pruebas: diseño de tests/, fixtures de conftest.py, casos límite parametrizados, integración de pytest.mark/lentos, httpx.MockTransport o pytest-httpx para HTTP, reversión de transacciones de base de datos y pytest --cov de CI con umbral sensato.
Cuándo Invocar
- Nuevo servicio sin pruebas antes del primer despliegue
- PR que añade lógica de rama compleja sin cobertura
- Limpieza de pruebas inestables después de ruido en CI
- Conversión de suite unittest a modismos de pytest
Entradas
| Entrada | Por qué |
|---|---|
| Paquete objetivo | Qué módulos cubrir primero |
| Dependencias externas | DB, Redis, HTTP a simular vs testcontainers |
| Objetivo de cobertura | Línea vs rama; porcentaje mínimo |
| Marcadores | slow, integration, no_ci |
| Código asíncrono | Modo pytest-asyncio automático |
Salidas
tests/conftest.pycon fixtures compartidos- Pruebas parametrizadas para casos límite de la documentación de Gotchas
pyproject.toml[tool.pytest.ini_options]- Patrones de omisión de
coverageparaif TYPE_CHECKING - Fragmento de CI que coincide con el comando local
uv run pytest
Barreras de Protección
- Probar el comportamiento, no la implementación - afirmar salidas y efectos secundarios.
- Un concepto de aserción por prueba - mensajes de fallo claros.
- Congelar el tiempo con monkeypatch - no
sleepen pruebas. - Sin red en pruebas unitarias - simulación explícita o cassettes VCR.
- No perseguir el 100% de cobertura - centrarse en módulos ponderados por riesgo.
- Marcar pruebas de integración - mantener rápido el
pytest -m "not integration"predeterminado.
Receta
uv sync --extra dev
uv run pytest -q
uv run pytest --cov=app --cov-report=term-missing --cov-fail-under=80
uv run ruff check tests/Ejemplo de Trabajo (parametrizar)
import pytest
from app.pricing import discount
@pytest.mark.parametrize(
"amount,coupon,expected",
[
(100, "SAVE10", 90),
(100, "INVALID", 100),
(0, "SAVE10", 0),
],
)
def test_discount(amount, coupon, expected):
assert discount(amount, coupon) == expectedPreguntas Frecuentes
¿pytest o unittest?
pytest por defecto para código nuevo - compatibilidad con unittest OK durante la migración.
¿Testcontainers para Postgres?
Usar para pruebas marcadas como integración - las pruebas unitarias usan SQLite o sesión simulada.
Relacionado
- Configuración de pytest - fundamentos
- Fixtures - patrones de fixtures
- Pruebas de FastAPI - pruebas de API
- BDD y Gherkin - capa de aceptación
Versiones de Stack: Esta página fue escrita para Python 3.14.0 (estable 3.14, mantenimiento 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+ y uv 0.6+.