Probar APIs Web
Las pruebas de API acceden a tu aplicación en proceso sin iniciar un servidor. El TestClient de FastAPI, el cliente de prueba de Flask y el Client de Django envían solicitudes y verifican las respuestas.
Receta
from fastapi.testclient import TestClient
from myapp.main import app
client = TestClient(app)
def test_health():
response = client.get("/health")
assert response.status_code == 200
assert response.json() == {"status": "ok"}Cuándo usar esto:
- Verificar manejadores de rutas, códigos de estado y cuerpos de respuesta
- Probar middleware de autenticación y respuestas de error
- Pruebas de CI que no deben depender de servicios externos
Ejemplo de Trabajo
# tests/conftest.py
import pytest
from fastapi.testclient import TestClient
from myapp.main import app
@pytest.fixture
def client():
return TestClient(app)
@pytest.fixture
def auth_client(client):
client.headers.update({"Authorization": "Bearer test-token"})
def test_create_invoice(client):
response = client.post("/invoices", json={"amount": 100.0, "currency": "USD"})
assert response.status_code == 201
data = response.json()
assert data["amount"]
Lo que esto demuestra:
TestClientejecuta la aplicación ASGI en proceso- Pruebas de solicitud/respuesta JSON con
.json() - Fixture para cliente autenticado
- Los errores de validación de Pydantic devuelven 422
Inmersión Profunda
Clientes de Framework
| Framework | Cliente | Importar |
|---|---|---|
| FastAPI | TestClient | fastapi.testclient |
| Flask | test_client() | app.test_client() |
| Django | Client | django.test.Client |
| Cualquier ASGI | httpx + transport | httpx.ASGITransport |
Pruebas Asíncronas
import httpx
from httpx import ASGITransport
@pytest.fixture
async def async_client():
transport = ASGITransport(app=app)
async with httpx.AsyncClient(transport=transport, base_url="http://test") as c:
Errores Comunes
- TestClient con ciclo de vida asíncrono - los eventos de inicio pueden no ejecutarse. Solución: usar el gestor de contexto
with TestClient(app) as client:. - Estado de aplicación mutable compartido - las pruebas se afectan entre sí. Solución: aplicación con ámbito de fixture o reemplazos de dependencias por prueba.
- Probar contra una base de datos real - lento, inestable. Solución: reemplazar la dependencia de la base de datos con SQLite en memoria en las pruebas.
- No probar rutas de error - solo se probaron respuestas 200. Solución: verificar explícitamente respuestas 400, 401, 404, 422.
- Tokens de autenticación codificados en pruebas - se desvían de la autenticación real. Solución: fixture que imita el reemplazo de la dependencia de autenticación de producción.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| httpx contra servidor en ejecución | Pruebas E2E en staging | Pruebas unitarias/de ruta |
| Schemathesis | Fuzzing de OpenAPI | Rutas CRUD simples |
| Postman/Newman | Exploración manual | Pruebas unitarias automatizadas de CI |
Preguntas Frecuentes
¿TestClient o httpx?
TestClient para pruebas síncronas (más simple). httpx AsyncClient para suites de pruebas asíncronas.
¿Cómo reemplazo las dependencias de FastAPI?
app.dependency_overrides[dep] = lambda: mock_value en la configuración/limpieza de la fixture.
¿Cómo pruebo aplicaciones Flask?
client = app.test_client() luego client.get("/path").
¿Cómo pruebo vistas de Django?
pytest-django + client.get("/url/") con el Cliente de prueba de Django.
¿Necesito un servidor en ejecución?
No. Los clientes en proceso son más rápidos y deterministas.
¿Cómo pruebo WebSockets?
TestClient(app).websocket_connect("/ws") para FastAPI/Starlette.
¿Cómo pruebo cargas de archivos?
client.post("/upload", files={"file": ("test.txt", b"content")}).
¿Cómo pruebo middleware?
Envía solicitudes que activan el middleware. Verifica los cambios en las cabeceras y el estado.
¿Deben las pruebas de API usar una base de datos real?
Pruebas de integración: sí (base de datos de prueba). Pruebas de ruta unitarias: reemplazar con mock o SQLite.
¿Cómo pruebo el esquema OpenAPI?
Verifica la estructura de /openapi.json o usa Schemathesis para pruebas de API basadas en propiedades.
Relacionado
- Probar Código Asíncrono - cliente httpx asíncrono
- Fixtures - fixtures de cliente
- Mocking y Patching - reemplazar dependencias
- Pruebas de FastAPI - patrones específicos de FastAPI
Versiones de Stack: Esta página fue escrita para Python 3.14.0, 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+.