Criando e executando Testes de Contrato com Pact.js — Parte II

Eduardo Pacheco Celeste
beyondTest
Published in
4 min readMay 4, 2020

Passo a passo de como criar o Broker e enviar os pactos gerados para assim serem validados

Docker or Pactflow?
Docker or Pactflow?

ATENÇÃO: Este artigo é a continuação do artigo Criando e executando Testes de Contrato com Pact.js — Parte I na qual iniciamos a escrita do nosso teste de contrato na perspectiva do Consumer.

Primeira etapa: Enviando o Pact File para o Broker/Pactflow

Agora que criamos nosso Pact File (caso queira ver o exemplo gerado, basta acessar através deste link) vamos hospedá-lo em um local onde o mesmo pode ser visualizado e verificado pelo nosso Provider.

Há duas formas de se fazer: a primeira é através de um Broker local e o segundo através de uma plataforma SaaS desenvolvida pelo próprio time do Pact.

Vamos começar com a primeira abordagem (A instalação do Docker e como baixar as imagens necessárias pra realizar este processo podem ser verificados através deste outro artigo: Pact Broker via Docker Images).

Pact Broker via Docker:

Uma vez que as imagens do Docker estejam rodando, vamos criar um novo arquivo chamado publish.js que irá realizar este processo. Esse novo arquivo iremos criar dentro de __tests__/contract/broker/publish.js:

E nele iremos adicionar o seguinte código:

De uma forma resumida o arquivo verifica se existe a variável de ambiente PACT_LOCAL_BROKER no nosso arquivo .env (Essa variável é o endereço do broker e por padrão quando iniciamos a imagem do Docker o valor é: http://localhost:9292/). Caso não exista ou tenha sido preenchida incorretamente, uma mensagem de erro será apresentada no console assim que tentarmos realizar o envio. Além disso, mais três informações estão sendo enviadas: o local onde o Pact File foi gerado, a tag e a versão do pacto.

ATENÇÃO: A versão é um valor que deve ser alterado sempre que houver uma mudança no contrato entre Consumer e Provider.

Por fim pra realizarmos o envio basta adicionarmos a variável PACT_LOCAL_BROKER dentro do .env (Um exemplo de como ficará o .env pode ser visto neste link) e incluirmos no package.json um novo script, conforme podemos ver no snippet abaixo:

package.json

Novamente no terminal basta executarmos o novo comando:

$ npm run publish:broker

E no broker, agora podemos ver o Pact File gerado. Basta acessarmos a URL http://localhost:9292/ através do nosso navegador:

Pact File através do Broker

Conforme podemos ver na imagem acima (última coluna) o contrato ainda não foi verificado pelo nosso Provider mas iremos fazer isso em breve 👊

Pactflow:

Via Pactflow o processo é significativamente mais simples. Porém isso tem um preço. A plataforma é gratuita para um período de teste e para uma quantidade definida de contratos (Para mais informações basta acessar este link).

O processo de abertura de conta é bem simples e pode ser feito através do link acima.

Uma vez que a conta tenha sido criada, basta acessarmos no menu superior direito o menu ‘Settings’ e na próxima página o primeiro menu chamado ‘Api Tokens’.

Neste menu haverá dois tokens, basta copiarmos o valor da segunda opção, conforme imagem abaixo:

Pactflow

Mais uma vez vamos automatizar a execução do processo através de um script no package.json:

package.json

IMPORTANTE: Note que é necessário substituir os valores das variáveis PACTFLOW_URI e PACTFLOW_TOKEN antes de executar o comando. Estas variáveis serão substituídas respectivamente pela URL do Pactflow assim que você gerar a sua conta e o token que foi copiado anteriormente. Um exemplo pode ser visto neste link.

Pra rodar o comando via terminal:

$ npm run publish:pactflow

No Pactflow agora podemos visualizar o nosso Pacto e o status de Unverified pois o mesmo ainda não foi verificado pelo nosso Provider.

Próximos passos

Agora que já criamos o nosso pacto e já o enviamos para o Broker/Pactflow temos que realizar a validação do Pacto na perspectiva do Provider. A continuação dessa saga acaba (será?) nesse último artigo: Criando e executando Testes de Contrato com Pact.js — Parte III

--

--