Testes de Contrato para Microsserviços com Pact PHP


Este artigo irá abordar testes de contrato para microsserviços com Pact em PHP.
O desenvolvimento de sistemas sempre modificou-se rapidamente ao decorrer do tempo. Novos paradigmas de programação foram criados, novos tipos de linguagem, metodologias e processos. A arquitetura dos softwares também não poderia ficar fora, começando com uma arquitetura monolítica, passando para uma arquitetura orientada a serviços (SOA), até a arquitetura com maior destaque no momento, os microsserviços.

O aumento da utilização das arquiteturas baseadas em serviços e microsserviços fez com que um problema entrasse em foco, a quebra de contrato entre o fornecedor do serviço e o cliente.

Um contrato é uma coleção de acordos entre um cliente (Consumer) e uma API (Provider) que descreve as interações que podem ocorrer entre eles.

Consumer Driven Contracts é um padrão que impulsiona o desenvolvimento do provider do ponto de vista do consumer. É o TDD – Test Driven Development (desenvolvimento dirigido por testes) para serviços.

Basicamente o teste funciona da seguinte maneira: o sistema consumidor realiza uma chamada para o provedor e recebe os dados de retorno. A estrutura de dados retornada é comparada com a estrutura definida no contrato. Se os dados não forem iguais o teste falha indicando que a API está retornando dados diferentes do que o cliente está esperando, ou seja, houve a quebra de contrato de algum dado recebido.

A ideia geral é garantir a integridade da API antes que o sistema consumidor processe os dados da requisição enviada pelo provedor, que pode enviar alguma informação inconsistente que o consumidor ainda não consegue identificar como válida.

Testes de contrato com Pact PHP

O Pact, é um framework de teste que ajuda você a escrever contratos, e garante que esses contratos estejam atendidos. O Pact tem implementações para várias linguagens, entre elas, Java, .NET, Javascript, Go, Python, Swift e PHP.

Para melhor entender como o Pact funciona vamos construir um exemplo do zero com PHP. Os exemplos abaixo são baseados na API do Meetup.com. Temos um cenário com um consumer/client e um provider/api.

Primeiro vamos adicionar as dependências que precisamos para realizar os testes, para isso vamos utilizar o composer.

Ou criando um composer.json com o seguinte conteúdo:

Vamos criar um diretório src, onde vamos adicionar nossa classe de client com o nome de ‘ExampleOneMeetupApiClient.php’:

Nesta classe estamos fazendo um get para a API de consulta de categorias no sistema do meetup.

Agora criamos um diretório tests e neste diretório um arquivo chamado ‘phpunit.example.one.xml’ para configuração do PHPUnit, com as informações necessárias para executar nossos testes:

E criamos nossa classe de teste no diretório tests que já criamos acima, com o nome de ‘ExampleOneMeetupAPIClientTest.php’ com o seguinte conteúdo:

Nessa classe estamos testando a api de consulta de categorias do meetup. Para isso estamos criando um mock da resposta da api, instanciamos nossa classe de client passando a url do Mock Server. Depois testamos o código de resposta, o formato da resposta e verificamos o conteúdo da resposta, para assim garantir que não temos quebra de contrato.

E por fim executamos nosso teste, entre no diretório tests e execute:

Temos o seguinte retorno, mostrando os testes que passaram ou não:

Como pode ser visto na resposta dos testes, ao final é gerado um arquivo json com o contrato, como este:

Neste artigo vimos um exemplo de como pode ser implementado testes de contrato, mais alguns exemplos podem ser encontrado nos seguintes repositórios https://github.com/pact-foundation/pact-php e https://github.com/fernandodebrando/pact-php-example.

Conclusão – Testes de contratos para microsserviços em PHP

A evolução dos sistemas para microsserviços resultou com que novos problemas entrassem em foco, fazendo com que métodos alternativos de testes ganhassem mais destaque além dos testes de contratos tradicionais. Apesar de muitas empresas terem experiências ruins na migração para este tipo de arquitetura, existem vantagens bem relevantes em relação a aderir ao uso deste tipo de tecnologia, como builds e entregas mais rápidas e modularidade das API’s. Se quiser saber mais sobre microsserviços, no artigo Microsserviços: Distribuindo serviços críticos ao negócio falo sobre um case que a equipe que eu trabalho na KingHost desenvolveu a respeito do novo shopping cart da empresa, abordando vantagens, desvantagens, dificuldades e como migramos nosso sistema monolítico.

E você, qual a sua opinião sobre testes de contrato, já utilizou alguma vez? Deixe um comentário abaixo. Caso queira ficar por dentro de outros conteúdos relacionados, visite nosso Blog da KingHost. Obrigado pela leitura.

 

Fernando Silva

Fernando Silva

Analista de Desenvolvimento em KingHost
Analista de Desenvolvimento na KingHost, graduado em Análise e Desenvolvimento de Sistemas (ADS) pela Faculdade Senac Porto Alegre, onde ganhou o Prêmio Keller de melhor trajetória acadêmica. Atualmente faz pós-graduação em Segurança Cibernética pela UFGRS, além disso, é um dos coordenadores da comunidade PHP-RS, é entusiasta Open Source e Software Livre.
Fernando Silva

Comentários

comentário(s)

Categories