Testes em Sistemas Distribuídos

Testes de contrato e mocks

Tutorial de contract tests com JSON Schema, fixtures e casos negativos.

Avançado 35 min 30 pontos Leitura 0%

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.json
  • contracts/events/fixtures/order.created.valid.json
  • contracts/events/fixtures/order.created.invalid.json
  • services/order-service/tests/contract/test_order_created_contract.py
  • services/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/events exige 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.