Pact - Consumer Driven Contracts

Pact é uma ferramenta de teste, onde os contratos de negócio são dirigidos pelo consumidor.

Em geral, temos alguns termos que merecem destaque:

Contract
Acordos de negócio entre o consumidor e a API que será provedora.

Consumer Driven Contract
Desenvolvimento do sistema geral da API pela visão do consumidor, não apenas dos responsáveis pela sua codificação.

Pact
Ferramenta que garante que os Contratos estejam sempre funcionando, mesmo quando qualquer alteração seja necessária.

Como funciona?

O Pact atua na requisição do lado do consumidor, armazenando suas necessidades para só então serem retornadas a API.

Mas, o que isso quer dizer?

Isso significa que, por exemplo, se a API não tiver algum campo chave-valor, mas o usuário enviou um na requisição, o Pact irá garantir e proteger a integridade da API para que não sofra algum erro ao tentar resgatar aqueles dados, os quais ela ainda não consegue identificar como válidos.

Ok, mas, o consumidor enviou esses dados novos por algum motivo, certo? Então você precisa identificá-los.

Para isso, precisamos resgatar o que o Pact deixou guardado da requisição que o consumidor fez.

Existe um outro termo chamado Pact Broker, o qual é nada mais que um storage onde o Pact guarda os dados até que eles de fato cheguem à API.

Através desse processo, já é possível saber quais alterações precisam ser realizadas na API para que o consumidor tenha seus contratos funcionando perfeitamente. Assim, através de requisições do provedor da API com os dados armazenados do Pact, as mudanças podem ser feitas.

Ah, mas eu já tenho um ambiente de teste end-to-end e uso o Docker!

Ok, vamos lá.

Mesmo com ambientes de test hard-coded e o uso do Docker, os problemas ainda existem. Apenas podemos afirmar que eles estão apenas amenizados.

O objetivo do Pact é garantir ao máximo a integridade e a disponibilidade entre os serviços de toda a arquitetura. Dessa forma, o Pact pode ser mais prático e rápido, uma vez que você não precisa subir um ambiente end-to-end, que pode, ao longo do tempo, ficar confuso e bagunçado. Além disso, testes manuais também não são necessários.

Se mesmo com a rapidez e confiabilidade que a ferramenta traz você ainda não se sentir convencido, informo mais uma característica do Pact, se não a mais interessante delas:

Eficiência!

  • os contratos são verificados e gerados automaticamente.
  • faz single test integration: em uma estrutura de microservices, onde um serviço precisa de outros serviços para retornar um resultado para uma API, por exemplo, não seria mais necessário que esses outros serviços estivessem up, se o Pact já estivesse lá.

Hoje, existem algumas implementações e frameworks do Pact:

  • Ruby Pact
  • JVM — Pact / Scala — Pact
  • .NET Pact
  • JS Pact
  • Go Pact
  • Swift / Objective — C Pact

Um exemplo de implementação do Pact, pode ser visualizada na seguinte imagem, onde o serviço Animal recebe um mock e é aí onde a magia acontece:

O uso do Pact é, de fato interessante e gera um resultado muito mais satisfatório que ambientes de teste comuns. Portanto, comparando um mock local básico com o Pact, as seguintes características podem ser percebidas:

Características de um ambiente de testes convencional
Características do PACT

Numa visão geral, o Pact também pode ser comparado da seguinte forma:

API convencional
API com o Pact

Será que você se sentiu convencido a experimentar o Pact? Bom, conta pra gente nos comentários!

Vamos adorar saber se você descobrir algo novo que ainda não sabemos.

Até a pŕoxima!