Testes em Sistemas Distribuídos
Testes de contrato e mocks
Tutorial de contract tests com JSON Schema, fixtures e casos negativos.
Nesta aula você vai
- Validar contratos de evento contra JSON Schema oficial
- Criar fixtures reutilizáveis para produtor e consumidor
- Quebrar build automaticamente em mudança incompatível
Testes de contrato e mocks
Nesta aula você vai transformar contratos em testes automatizados para evitar regressões entre serviços que publicam e consomem eventos.
Arquivos usados
contracts/events/order.created.v1.schema.jsoncontracts/events/fixtures/order.created.valid.jsoncontracts/events/fixtures/order.created.invalid.jsonservices/order-service/tests/contract/test_order_created_contract.pyservices/payment-service/internal/tests/contract/order_created_contract_test.go
Passo 1 - Crie fixture válida e inválida
contracts/events/fixtures/order.created.valid.json:
{
"eventType": "order.created",
"eventVersion": "v1",
"orderId": "ord-2001",
"customerId": "cus-99",
"totalAmount": 129.90
}
order.created.invalid.json (sem customerId) deve falhar.
Passo 2 - Valide contrato no produtor (Python)
def test_order_created_fixture_matches_schema(schema, valid_fixture):
jsonschema.validate(instance=valid_fixture, schema=schema)
Teste negativo:
with pytest.raises(jsonschema.ValidationError):
jsonschema.validate(instance=invalid_fixture, schema=schema)
Comando:
cd services/order-service
pytest tests/contract -q
Passo 3 - Valide no consumidor (Go)
func TestOrderCreatedContract_InvalidFixture(t *testing.T) {
schema := contract.LoadSchema(t, "../../../contracts/events/order.created.v1.schema.json")
payload := contract.LoadFixture(t, "../../../contracts/events/fixtures/order.created.invalid.json")
err := schema.Validate(payload)
require.Error(t, err)
}
Comando:
cd services/payment-service
go test ./internal/tests/contract/... -v
Passo 4 - Adicione ao pipeline
No Makefile:
test-contract:
cd services/order-service && pytest tests/contract -q
cd services/payment-service && go test ./internal/tests/contract/... -v
Critérios de qualidade
- Toda mudança em
contracts/eventsexige atualização de fixture. - Casos válidos e inválidos devem existir para cada evento crítico.
- Build falha em PR quando houver incompatibilidade.
- Mensagem de erro aponta o campo quebrado do contrato.
Resumo
Você converteu contratos em testes executáveis para produtor e consumidor, garantindo evolução segura de eventos no monorepo.