DÍA 11Pruebas y contrato HTTP · Python Backend y APIs para Datos

Envía solicitudes HTTP desde pytest y comprueba respuestas sin abrir un navegador.

Día 11 18 minIntermedio

Probar rutas con TestClient

Objetivos

Vas a simular una solicitud HTTP desde una prueba y comprobar el contrato que recibe una persona cliente de la API.

Concepto

Una prueba de API envía una solicitud y compara la respuesta real con lo esperado. FastAPI ofrece TestClient, que llama a la aplicación dentro del proceso; no necesitas iniciar Uvicorn ni abrir un navegador para estas comprobaciones. pytest encuentra funciones cuyo nombre comienza con test_.

Una prueba de /health no necesita MySQL porque la ruta solo devuelve un estado de la aplicación. Para endpoints que consultan datos, en las siguientes lecciones reemplazarás la dependencia de base por una base temporal con filas sintéticas. Esa prueba verifica comportamiento HTTP; no demuestra que MySQL esté instalado correctamente.

Ejemplo

Instala los paquetes de pruebas desde la carpeta del proyecto con py -m pip install -r requirements.txt. En tests/test_api.py:

from fastapi.testclient import TestClient
 
from app.main import app
 
client = TestClient(app)
 
 
def test_health():
    response = client.get("/health")
    assert response.status_code == 200
    assert response.json() == {"status": "ok"}

Ejecuta py -m pytest -q. La respuesta pasa por el router y los serializadores de FastAPI. No se consulta la base porque el endpoint de salud no depende de get_db. FastAPI documenta el uso de TestClient con pytest.

Práctica guiada

  1. Provoca temporalmente una respuesta ready en la ruta.
  2. Actualiza la aserción para revisar el nuevo JSON.
  3. Revierte la modificación cuando la prueba vuelva a pasar.

Reto

Escribe una prueba que verifique que el documento OpenAPI de la aplicación contiene la ruta /health.

Intenta el reto antes de consultar las pistas.

Quiz

1. ¿Qué simula TestClient?
2. ¿Por qué una prueba de /health puede correr sin MySQL?
3. ¿Qué significa una aserción response.status_code == 200?

Comprobación

Probaste el contrato HTTP de salud. Para probar rutas de Sakila sin depender de datos reales, reemplazarás get_db durante la prueba.

TU PROGRESO

Cargando estado…