Exemplo de 'Nirvana' do teste de contrato
Esse repositório exemplifica as melhores implementações de teste de contrato, atingindo o nirvana e tendo controle via pipeline e pact-broker de maneira totalmente confiável, fornecendo segurança para seguir com deploy.
Base de teste de contrato
Para aproveitar o repositório da melhor maneira consulte os seguintes materiais, necessários para conhecer os conceitos de teste de contrato:
- Introduction - Documentação do Pact
- AT Talks: Teste de contrato com Pact
- Testes de contratos com PACT #1 Conceitos - Vinícius Ribeiro
Sobre o repositório
O intuito desse material é demonstrar como deve ser a implementação de pipeline e testes de contrato de aplicações provider e consumer de forma com que siga o que é considerado o Nirvana do Pact.
O diagrama abaixo é a representação do Nirvana do Pact que foi implementado nesse repositório.
O pact-cli informado no diagrama se refere a comandos do Pact Broker Client.
Aplicações
As aplicações utilizadas estão divididas em 2 diretórios, tendo cada um seus arquivos fonte (/src), testes, dockerfile, package.json, etc, bem como cada aplicação tem sua pipeline implementada em .github/workflows.
Provider - clientsService
O provider é a aplicação que provem API para ser consumido por outro serviço. Está em provider-clients-service.
A pipeline do provider é executada apenas quando há alteração fora do diretório
consumer-frontend
(consumer).
Consumer - Frontend
O consumer é a aplicação que consome outra API. Pode também ser um provider. Está em consumer-frontend.
A pipeline do consumer é executada apenas quando há alteração fora do diretório
provider-clients-service
(provider).
Execução
Pré-requisitos
- Docker e Docker-compose instalados.
Teste de contrato do Consumer
make consumer-test-contract
Após a execução é gerado o contrato em consumer-frontend/pacts e log.
Como demonstrado no diagrama, a publicação do pact gerado no Pactflow é feita utilizando o comando publish do pactfoundation/pact-cli e apenas no CI, como pode ser visto na pipeline consumer-ci.
Teste de contrato do Provider
make provider-test-contract
Para conseguir executar o teste do provider altere o arquivo docker-compose conforme o exemplo abaixo para utilizar o token de leitura do Pactflow e possibilitar que baixe os contratos publicados pelo consumer.
environment:
- - PACT_BROKER_TOKEN
+ - PACT_BROKER_TOKEN='8sRF-XWVFpfLRpLp2B-lLw'
- PACT_URL
A publicação de resultado da execução é feito apenas via CI. (publishVerificationResult: process.env.CI == 'true'
)
Webhook
Quando o consumer publica um novo contrato é preciso garantir que o provider tenha feito execução encima desse contrato.
Para que isso ocorra é utilizado webhook no Pactflow que, ao identificar que foi publicado contrato com conteúdo alterado ou uma nova tag (nova branch), trigga a pipeline do provider passando a URL desse contrato.
A pipeline chamada via webhook é a provider-ci-triggered-by-webhook.yml.
A configuração do can-i-deploy
na pipeline do consumer permite que aguarde a execução do teste de contrato pelo provider e a publicação do resultado para saber se é possível ou não prosseguir com o novo contrato.