📊 Capítulo 16: Testes com Pytest & HTTPX
Especialização Backend com Python & FastAPI
🗺️ A Pirâmide de Testes Assíncronos no FastAPI
flowchart TD
UNIT["1. Testes Unitários Puros (Pytest)\n- Validação de funções isoladas, schemas Pydantic e regras"]
--> INTEG["2. Testes de Integração com AsyncClient (HTTPX)\n- Requisições HTTP completas contra endpoints da API"]
--> DB_TEST["3. Testes com Banco Efêmero (PostgreSQL em Docker / SQLite in-memory)\n- Rollback automático e fixtures isoladas"]
style UNIT fill:#e8f5e9,stroke:#4caf50,stroke-width:2px
style INTEG fill:#fff3e0,stroke:#ff9800,stroke-width:2px
style DB_TEST fill:#ede7f6,stroke:#512da8,stroke-width:2px
🎯 Slide 1: Configuração do conftest.py com AsyncClient
import pytest
from httpx import AsyncClient, ASGITransport
from app.main import app
@pytest.fixture
async def async_client():
transport = ASGITransport(app=app)
async with AsyncClient(transport=transport, base_url="http://test") as client:
yield client
- Executa requisições assíncronas reais em memória sem precisar subir um servidor na porta 8000!
🎯 Slide 2: Escrevendo Testes de Endpoints com pytest.mark.anyio
import pytest
@pytest.mark.anyio
async def test_deve_criar_produto_com_sucesso(async_client, auth_headers):
payload = {"nome": "Teclado Mecânico", "preco": 350.0}
response = await async_client.post("/api/v1/produtos", json=payload, headers=auth_headers)
assert response.status_code == 201
dados = response.json()
assert dados["nome"] == "Teclado Mecânico"
assert "id" in dados
🎯 Slide 3: Cobertura de Código com pytest-cov
pytest --cov=app --cov-report=term-missing --cov-report=html
- Gera relatórios detalhados linha por linha indicando branches e funções não cobertas por testes.
Slide 1 de 1
Atalhos: ← → Navegar • Espaço Avançar • F Tela Cheia • Home Início • End Fim