Teste uma Integração antes que ela Ocorra — Parte 4: Fornecedor
Visão Geral
Continuação do artigo “Teste uma Integração antes que ela Ocorra — Parte 3: Publicação de Contrato”.
Esse artigo tem o intuito de: exemplificar como ocorre a verificação de contratos antes que a integração em si ocorra, ou seja, como que ainda na fase de execução dos testes de unidade da aplicação fornecedora ocorre o match entre a resposta atual da API versus a resposta esperada pela aplicação consumidora.
Cenário
É necessário realizar uma refatoração em nossa API fictícia de artigos e essa mudança não pode impactar no funcionamento do front-end consumidor. Se em último caso existir uma mudança necessária também no front-end, a mesma precisa ser comunicada previamente para compor a estratégia de publicação dessa demanda.
Teste de Contrato do Fornecedor
Mantive os mesmos pré-requisitos utilizados para a aplicação consumidora para o "desenvolvimento" da aplicação fornecedora.
E na configuração do ambiente, temos as dependências de:
- Projeto:
npm i dotenv json-server
- Desenvolvimento:
npm i --save-dev @sucrase/jest-plugin @pact-foundation/pact @pact-foundation/pact-node jest json-server
Para simular o funcionamento real da API de artigos, vou pular etapas de desenvolvimento usando o módulo json-server, o json a seguir contém a resposta que a API fake vai retornar.
Modifiquei o arquivo de configuração para conter o script que vai iniciar nossa API fake:
Agora só iniciar a API fake:
npm run up:apifake
Para construção dos testes de contrato é preciso informar no arquivo de teste:
- Importar o módulo do Pact (linha 1);
- Definir as opções de verificação de contrato (linhas 8 a 17);
- Informar endereço da API de artigos (linha 10);
- Informar a URL obtida via interface do Pact Broker com o endereço do contrato mais recente do consumidor (linha 11);
- Informe se o resultado do teste deve ser publicado no Pact Broker (linha 12);
- Definir o ambiente que os contratos serão comparados (linha 14);
- A verificação do contrato (linha 19).
No arquivo de configuração indique o script para executar os testes de contrato:
Execute os testes de contrato:
npm run test:contract
Observe que na resposta da API fake de artigos tem o campo "tag" que não consta no contrato redigido pelo consumidor e mesmo assim os testes de contrato do fornecedor passaram, isso ocorre porque os testes do fornecedor só vão quebrar se este deixar de retornar a resposta mínima esperada pelo consumidor com seus respectivos valores e tipos de dados.
Em um contexto real sugiro que previamente à execução dos testes de contrato da perspectiva fornecedora seja disparado um script com o setup de ambiente, o script deve garantir um estado inicial na base de dados conhecido pelos testes para evitar falsos negativos.
Como os testes executados estavam configurados para serem publicados, então tanto o provedor quanto o consumidor podem consultar se a resposta atual da API está mantendo a resposta mínima esperada pelo consumidor via interface do Pact Broker.
Vão haver situações em que a API fornecedora faz modificações que acarretam mudanças não planejadas no consumidor, para esses casos o Pact permite a ambos os times insumos para detectar essas mudanças ainda na fase dos testes de unidade da API, reduzindo o custo de identificar essa mudança tardiamente somente no teste disparado sobre a interface do usuário.
Se de fato o consumidor precisar adequar a uma nova versão de contrato da API, a aplicação fornecedora avisa o time da aplicação consumidora, esse realiza adequações quanto à resposta da nova versão da API e publica novamente o contrato, se ambos derem match, então esse passa a ser o contrato vigente para uma dada branch.
Código da PoC atualizado em: https://github.com/PriCampos/poc-contract-test-with-pact.
No próximo artigo vou fazer um compilado do build do consumidor e provedor.
Referência
- COMUNIDADE PACT. Provider. Documentação oficial. Disponível em: <https://docs.pact.io/provider>. Acesso em 05 de agosto de 2022.