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:

  1. Escrever caso de teste com TestClient validando 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)

  1. Salve o arquivo como: Atividade_16_1_SeuNome
  2. 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:

  1. 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)

  1. Salve o arquivo como: Atividade_16_2_SeuNome
  2. 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:

  1. 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)

  1. Salve o arquivo como: Atividade_16_3_SeuNome
  2. 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:

  1. 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)

  1. Salve o arquivo como: Atividade_16_4_SeuNome
  2. 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()