Glossário · Testes de API
Teste de contrato
Em inglês: Contract testing
Também chamado de: testes de contrato, teste de contrato orientado ao consumidor, consumer-driven contract testing, Pact
Definição
Verificar que um provedor de API e seus consumidores concordam sobre as requisições e respostas que trocam, sem precisar subir os dois juntos para um teste end-to-end.
O teste de contrato (contract testing) verifica o acordo entre dois serviços de forma isolada. Cada lado é testado contra uma descrição compartilhada das interações, o contrato, em vez de contra o outro serviço rodando de verdade. Se o provedor muda o nome de um campo do qual um consumidor depende, um teste de contrato falha no próprio pipeline do provedor, antes de qualquer deploy. Em custo e em confiança, ele fica entre os testes de integração e os testes end-to-end.
Como funciona o teste de contrato orientado ao consumidor
A forma mais comum, popularizada pela ferramenta Pact, é orientada ao consumidor (consumer-driven):
- O consumidor escreve um teste contra um provedor mockado, declarando as requisições que envia e as partes da resposta que realmente usa. Por exemplo:
GET /orders/42retorna200com um númeroide uma stringstatus. - Rodar esse teste gera um arquivo de contrato (um “pact”) que registra essas interações.
- O contrato é compartilhado, normalmente por meio de um serviço broker.
- O provedor verifica o contrato reproduzindo cada requisição registrada contra a sua implementação real e conferindo se as respostas batem.
- Antes do deploy, o time verifica se a versão que está prestes a liberar é compatível com as versões do outro lado que já estão naquele ambiente.
Como o consumidor lista apenas os campos que usa, o provedor fica livre para adicionar campos ou mudar qualquer coisa da qual nenhum consumidor dependa.
Diferença em relação a verificações parecidas
- Validação de schema compara uma resposta com o schema publicado pelo provedor. Ela mostra que o provedor é consistente com a própria documentação, não que ainda atende às necessidades de cada consumidor.
- Testes de integração chamam o provedor real. Precisam dos dois serviços e de suas dependências rodando, e tendem a ser mais lentos e mais instáveis.
- Testes end-to-end provam que uma jornada completa funciona, mas são uma forma lenta e cara de descobrir que um campo foi renomeado.
Contratos orientados ao provedor (provider-driven), em que o provedor publica uma especificação OpenAPI e os consumidores testam contra ela, são uma alternativa quando o provedor não consegue conhecer nem se coordenar com todos os seus consumidores, como no caso de uma API pública.
Erros comuns
- Especificar demais. Fazer asserções sobre valores exatos ou sobre todos os campos transforma os contratos em testes funcionais frágeis. Use matchers de tipo e inclua só o que o consumidor lê.
- Testar regra de negócio nos contratos. Contratos verificam o formato da conversa; a correção da lógica pertence aos testes do próprio provedor.
- Ignorar os provider states. “O pedido 42 existe” precisa ser preparado do lado do provedor durante a verificação, senão ela falha pelo motivo errado.