🧩 Exercícios: Testes Automatizados com Pytest e HTTPX
Spec Backend Com Python E Fastapi • Trilha Progressiva em 4 Níveis
🎯 Nível 1: Fundamentos
Problema 16.1 — Teste Unitário de Endpoint com TestClient do FastAPI
Contexto: Teste Unitário de Endpoint com TestClient do FastAPI no contexto de Testes Automatizados com Pytest e HTTPX.
Requisitos de Execução:
- Escrever caso de teste com
TestClientvalidando código de status 200 e estrutura do payload.
Resultado Esperado
Teste GET /health -> Status 200 OK e JSON validado com sucesso.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_16_1_SeuNome - Envie na tarefa:
Atividade Cap 16 - Testes Automatizados com Pytest e HTTPX
🔑 Gabarito de Código & Solução Comentada
# test_health.py
from fastapi import FastAPI
from fastapi.testclient import TestClient
app = FastAPI()
@app.get("/health")
def health(): return {"status": "ok"}
client = TestClient(app)
def test_health_endpoint():
response = client.get("/health")
assert response.status_code == 200
assert response.json() == {"status": "ok"}
print("test_health_endpoint PASSOU ✅")
test_health_endpoint()
🔍 Nível 2: Prática
Problema 16.2 — Testes de Integração Assíncronos com HTTPX AsyncClient
Contexto: Testes de Integração Assíncronos com HTTPX AsyncClient no contexto de Testes Automatizados com Pytest e HTTPX.
Requisitos de Execução:
- Implementar teste assíncrono com
httpx.AsyncClient(app=app, base_url='http://test')e pytest-asyncio.
Resultado Esperado
Teste assíncrono concluído com sucesso.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_16_2_SeuNome - Envie na tarefa:
Atividade Cap 16 - Testes Automatizados com Pytest e HTTPX
🔑 Gabarito de Código & Solução Comentada
# test_async_routes.py
import asyncio
import httpx
from fastapi import FastAPI
app = FastAPI()
@app.get("/async-data")
async def get_data(): return {"itens": [1, 2, 3]}
async def test_async_endpoint():
async with httpx.AsyncClient(transport=httpx.ASGITransport(app=app), base_url="http://test") as ac:
response = await ac.get("/async-data")
assert response.status_code == 200
assert len(response.json()["itens"]) == 3
print("test_async_endpoint PASSOU ✅")
asyncio.run(test_async_endpoint())
⚡ Nível 3: Integração
Problema 16.3 — Sobrescrita de Dependências de Banco em Testes (app.dependency_overrides)
Contexto: Sobrescrita de Dependências de Banco em Testes (app.dependency_overrides) no contexto de Testes Automatizados com Pytest e HTTPX.
Requisitos de Execução:
- Substituir a dependência de banco de produção por uma sessão SQLite em memória usando
app.dependency_overrides.
Resultado Esperado
Dependência substituída por banco mock em memória durante os testes.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_16_3_SeuNome - Envie na tarefa:
Atividade Cap 16 - Testes Automatizados com Pytest e HTTPX
🔑 Gabarito de Código & Solução Comentada
# test_dependency_override.py
from fastapi import FastAPI, Depends
from fastapi.testclient import TestClient
app = FastAPI()
def get_db(): return "PROD_DATABASE"
@app.get("/db-info")
def db_info(db: str = Depends(get_db)): return {"db": db}
def get_test_db(): return "MOCK_TEST_DB"
app.dependency_overrides[get_db] = get_test_db
client = TestClient(app)
res = client.get("/db-info")
assert res.json()["db"] == "MOCK_TEST_DB"
print("Dependency Override Teste PASSOU ✅")
🏆 Nível 4: Desafio Corporativo
Problema 16.4 — Fixtures com Escopo e Transações de Teste com Rollback Automático
Contexto: Fixtures com Escopo e Transações de Teste com Rollback Automático no contexto de Testes Automatizados com Pytest e HTTPX.
Requisitos de Execução:
- Criar fixture do Pytest que inicie uma transação antes do teste e execute rollback no final, mantendo o banco limpo.
Resultado Esperado
Isolamento transacional garantido em cada caso de teste.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_16_4_SeuNome - Envie na tarefa:
Atividade Cap 16 - Testes Automatizados com Pytest e HTTPX
🔑 Gabarito de Código & Solução Comentada
# test_fixtures_rollback.py
def simular_fixture_transacional():
print("[FIXTURE]: Iniciando transação isolada de teste")
# Executa operações do teste
print("[TESTE]: Inserindo dados temporários")
print("[FIXTURE TEARDOWN]: Executando ROLLBACK. Banco 100% limpo.")
return True
simular_fixture_transacional()