Quiz: Testing, Documentación y Despliegue

Quiz
10 min~6 min lectura

Quiz Interactivo

Pon a prueba tus conocimientos

Concepto clave

En el desarrollo profesional de APIs con FastAPI, el testing, la documentación y el despliegue no son etapas separadas, sino componentes integrados del ciclo de vida del software. Imagina construir un puente: el testing son las pruebas de carga que validan su resistencia, la documentación son los planos que permiten a otros ingenieros entender su estructura, y el despliegue es la inauguración que lo pone al servicio de la comunidad. Un enfoque integrado garantiza que tu API no solo funcione, sino que sea mantenible, escalable y confiable en producción.

El testing en FastAPI va más allá de verificar endpoints; abarca pruebas unitarias, de integración y end-to-end que simulan escenarios reales. La documentación automática con Swagger y ReDoc se convierte en tu mejor aliado para la colaboración en equipo y la adopción por parte de clientes. El despliegue profesional implica contenerización con Docker, orquestación con Kubernetes y configuración de CI/CD para entregas continuas. Dominar estos aspectos te posiciona como un desarrollador capaz de llevar proyectos desde el código hasta la nube con confianza.

Cómo funciona en la práctica

Comienza configurando un entorno de pruebas con pytest y FastAPI's TestClient. Crea fixtures para datos de prueba y simula dependencias externas como bases de datos o servicios de terceros. Para la documentación, utiliza los decoradores de FastAPI como @app.get con parámetros descriptivos y modelos Pydantic detallados; esto genera automáticamente una interfaz interactiva. En el despliegue, define un Dockerfile optimizado para Python y FastAPI, luego configura un pipeline de CI/CD con GitHub Actions o GitLab CI para ejecutar pruebas y desplegar en plataformas como AWS, Google Cloud o Heroku.

Paso a paso: 1) Escribe pruebas que cubran casos de éxito, error y validación de esquemas. 2) Refina la documentación agregando ejemplos de request/response y descripciones claras. 3) Construye la imagen Docker, prueba localmente y despliega en un entorno de staging antes de producción. Este flujo asegura que cada cambio sea validado y documentado, reduciendo riesgos en el lanzamiento.

Codigo en accion

Ejemplo de testing con FastAPI y pytest, mostrando un antes y después de refactorizar para mejor cobertura:

# Antes: prueba básica sin fixtures
def test_read_item():
    from fastapi.testclient import TestClient
    from main import app
    client = TestClient(app)
    response = client.get("/items/1")
    assert response.status_code == 200
    assert response.json() == {"id": 1, "name": "Item 1"}

# Después: prueba refactorizada con fixtures y mayor robustez
import pytest
from fastapi.testclient import TestClient
from main import app

@pytest.fixture
def client():
    return TestClient(app)

@pytest.fixture
def sample_item():
    return {"id": 1, "name": "Item de prueba", "price": 29.99}

def test_read_item_exists(client, sample_item):
    # Simula una base de datos en memoria para pruebas
    app.dependency_overrides[get_db] = lambda: sample_item
    response = client.get("/items/1")
    assert response.status_code == 200
    assert response.json()["name"] == "Item de prueba"
    app.dependency_overrides.clear()

def test_read_item_not_found(client):
    response = client.get("/items/999")
    assert response.status_code == 404
    assert response.json()["detail"] == "Item no encontrado"

Ejemplo de configuración de documentación mejorada en FastAPI:

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from typing import Optional

app = FastAPI(
    title="API de Ejemplo Profesional",
    description="Una API escalable para gestión de items con testing y despliegue integrados.",
    version="1.0.0",
    openapi_tags=[
        {"name": "items", "description": "Operaciones relacionadas con items"},
        {"name": "users", "description": "Gestión de usuarios"}
    ]
)

class Item(BaseModel):
    id: int
    name: str
    price: float
    description: Optional[str] = None

@app.get(
    "/items/{item_id}",
    response_model=Item,
    tags=["items"],
    summary="Obtener un item por ID",
    description="Retorna los detalles de un item específico basado en su ID. Lanza un error 404 si no existe.",
    responses={
        200: {"description": "Item encontrado exitosamente"},
        404: {"description": "Item no encontrado"}
    }
)
async def read_item(item_id: int):
    # Lógica para recuperar el item de la base de datos
    return Item(id=item_id, name="Ejemplo", price=19.99)

Errores comunes

  • Testing insuficiente: No probar casos de borde o errores de validación. Solución: Cubre al menos el 80% del código con pruebas unitarias y de integración, usando herramientas como coverage.py.
  • Documentación desactualizada: Olvidar actualizar la documentación automática después de cambios en los endpoints. Solución: Integra la generación de documentación en el pipeline de CI/CD para asegurar consistencia.
  • Despliegue sin staging: Desplegar directamente a producción sin un entorno de pruebas. Solución: Configura entornos separados (dev, staging, prod) y usa feature flags para lanzamientos graduales.
  • Ignorar la seguridad en el despliegue: Exponer credenciales en el código o no usar HTTPS. Solución: Almacena secretos en variables de entorno o servicios como AWS Secrets Manager, y fuerza SSL/TLS.
  • No monitorear después del despliegue: Asumir que todo funciona sin logs o métricas. Solución: Implementa logging estructurado con herramientas como Logstash y métricas con Prometheus para detectar problemas rápidamente.

Checklist de dominio

  1. ¿Has escrito pruebas que cubran casos de éxito, error y validación para al menos el 80% de tus endpoints?
  2. ¿Tu documentación automática incluye ejemplos de request/response y descripciones claras por cada operación?
  3. ¿Has configurado un pipeline de CI/CD que ejecute pruebas automáticamente antes de cada despliegue?
  4. ¿Usas contenedores Docker optimizados para FastAPI y has probado su funcionamiento en un entorno local?
  5. ¿Has desplegado tu API en un entorno de staging y realizado pruebas de carga antes de producción?
  6. ¿Manejas secretos y configuraciones de forma segura, sin hardcodear en el repositorio?
  7. ¿Tienes un plan de monitoreo y alertas para tu API en producción?

Implementa un sistema de testing, documentación y despliegue para una API FastAPI existente

En este ejercicio, tomarás una API FastAPI básica y la llevarás a un nivel profesional integrando testing robusto, documentación detallada y un pipeline de despliegue. Sigue estos pasos:

  1. Prepara el entorno: Clona o crea un proyecto FastAPI con al menos dos endpoints (ej., GET /items y POST /items). Asegúrate de tener Python 3.8+, FastAPI, pytest y Docker instalados.
  2. Mejora el testing: Escribe pruebas unitarias y de integración usando pytest y TestClient. Cubre casos como respuestas exitosas, errores 404, validación de datos con Pydantic, y simula una base de datos con fixtures. Ejecuta las pruebas con pytest -v y verifica la cobertura con pytest --cov=..
  3. Optimiza la documentación: Añade descripciones, ejemplos y tags a los decoradores de FastAPI. Genera la documentación automática y accede a ella en /docs y /redoc. Prueba los endpoints desde la interfaz de Swagger.
  4. Configura el despliegue: Crea un Dockerfile que use una imagen base ligera de Python, copie el código, instale dependencias y ejecute la API con uvicorn. Construye la imagen con docker build -t fastapi-app . y ejecútala localmente para verificar.
  5. Automatiza con CI/CD: Configura un archivo de GitHub Actions (.github/workflows/deploy.yml) que, en cada push a main, ejecute las pruebas y, si pasan, despliegue la imagen en un servicio como Heroku o AWS ECS. Incluye pasos para manejar secretos de forma segura.

Entrega un repositorio Git con el código completo, incluyendo los archivos de prueba, Dockerfile y pipeline de CI/CD. Verifica que todo funcione en un entorno de staging antes de considerar el ejercicio completo.

Pistas
  • Usa pytest fixtures para reutilizar configuraciones de prueba y evitar código duplicado.
  • En el Dockerfile, considera usar multi-stage builds para reducir el tamaño de la imagen final.
  • Para el pipeline de CI/CD, comienza con un entorno simple como Heroku antes de escalar a soluciones más complejas como Kubernetes.

Evalua tu comprension

Completa el quiz interactivo de arriba para ganar XP.