Hoverfly: virtualização de serviços para testes de integração

Recentemente, resolvi um problema que estávamos tendo ao implementar testes de integração entre nosso aplicativo e um serviço de terceiros. O Hoverfly é uma das ferramentas mencionadas que visa ajudar nisso.

De acordo com sua própria documentação: “Hoverfly é uma ferramenta de simulação de API leve” que faz uma simulação realista dos serviços dos quais seu aplicativo depende.

Alguns serviços de terceiros (não muitos) fornecem uma espécie de ambiente “sandbox” onde você pode executar testes sem afetar os dados da sua conta de produção. Este recurso resolve o problema acima.

OK, mas e os outros serviços que não fornecem esse ambiente “sandbox”? o que fazer?

O Hoverfly foi projetado para fornecer os recursos necessários para criar sua própria sandbox de serviço de terceiros, um ambiente simulado para desenvolvimento e teste de aplicativos.

Ao contrário de mocs e stubs (outros métodos de teste de integração), os mocks de ambiente permitem que você teste seu aplicativo em cenários muito próximos da realidade que você encontrará na produção.

Você pode testar aspectos como:

Simulação de latência de rede;
Simulação de falhas do serviço integrado;
Simulação de limites no número requisições;
Criação de cenários específicos gerados pelas regras de negócio da sua aplicação.
Passemos agora para uma abordagem mais técnica do funcionamento da Hoverfly.

Podemos utilizá-la de duas maneiras:

Como um servidor proxy;
Como um servidor web.

Pontos Principais

Em uma arquitetura de microsserviços, uma das partes mais importantes de um serviço é o módulo responsável pela comunicação com outros serviços.
Muitas vezes precisamos testar como um serviço se comunica com outros serviços de ponta a ponta. O mockar não é uma solução, pois o mockar não testa toda a comunicação e pula todas as partes relacionadas aos protocolos de rede (por exemplo, HTTP). A execução de serviços dependentes também não é uma opção devido à quantidade de trabalho necessária para preparar o processo para cada execução.

A virtualização de serviço é uma técnica para simular o comportamento de dependências de serviço a partir da criação de serviços proxy. Os testes são executados em um serviço (como um teste de ponta a ponta) sem iniciar o serviço real.
Hoverfly é uma ferramenta de simulação com API de virtualização de serviços escrita em GO, leve e de código aberto, totalmente integrada com Java.

O que é virtualização de serviços?

A virtualização de serviço é uma técnica para simular o comportamento de dependência de um determinado serviço. Embora a virtualização de serviço seja frequentemente associada a serviços baseados em API REST, os mesmos conceitos podem ser aplicados a qualquer outro tipo de dependência, como bancos de dados, ESBs, JMS, etc.

Além de ajudar a testar serviços internos, a virtualização de serviços também ajuda a testar serviços que não estão sob nosso controle, evitando alguns dos problemas comuns que tornam esses testes fracos. Alguns deles são:

A rede está offline, neste caso a comunicação com serviços externos não é possível;
O serviço externo está offline e recebemos alguns erros inesperados;
Restrições de API. Algumas APIs públicas têm restrições de solicitações por determinados períodos de tempo. Se atingirmos esse limite, os testes começarão a falhar.
Usando a virtualização de serviços, podemos evitar todos esses problemas desde que não solicitemos serviços reais, mas virtuais.

A virtualização de serviço pode ser usada não apenas para testar os melhores casos, pois muitos desenvolvedores e testadores acham que o verdadeiro poder está em testar perto dos limites de serviço, pois testar serviços reais é muito difícil porque eles se comportam em baixa latência ou erros inesperados.

Se pensarmos em como testar componentes em uma arquitetura monolítica, devemos usar algo assim entre objetos, isso se chama mocking. Quando usamos mocks, simulamos o comportamento dos objetos fornecendo respostas diretas às chamadas de métodos. Quando usamos a virtualização de serviço, estamos fazendo algo semelhante, mas em vez de simular o comportamento de um objeto, estamos fornecendo uma resposta direta de um serviço remoto. Por esse motivo, a virtualização de serviço às vezes é chamada de “emulação empresarial”.

Nesse caso, a comunicação com o serviço se dá por meio do protocolo HTTP, pois é utilizado um pequeno servidor, que é responsável por consumir as requisições da classe gateway e fornecer respostas.

Modo de execução

De um modo geral, existem dois modos de virtualização de serviços:

Modo de repetição: use simulações de dados para fornecer respostas em vez de encaminhá-las para o serviço real. Os mocks de dados podem ser criados manualmente (quando o serviço real ainda não existe) ou usando o modo de captura;
Modo de registro: intercepta a comunicação entre dois serviços registrando a solicitação e as respectivas respostas retornadas do serviço real. Normalmente, o modo de captura é usado como ponto de partida para o processo de criação da simulação de dados.
Dependendo da implementação, podem existir outros módulos, mas todos eles devem conter esses dois (reprodução ou gravação).

Hoverfly

O que é um hoverfly?

Hoverfly é uma ferramenta de simulação com uma API de virtualização de serviços escrita em Go, leve e de código aberto. Além disso, o Hoverfly é totalmente integrado ao Java.

Java Hoverfly

Java Hoverfly é um pacote de abstração Hoverfly para a linguagem Java que nos libera de instalar e gerenciar o ciclo de vida Hoverfly. O Java Hoverfly fornece um Java DSL para simular dados por meio de código e é totalmente integrado ao JUnit e ao Junit5.

Hoverfly Java Configura as propriedades de rede do Java para usar o proxy Hoverfly. Isso faz com que toda a comunicação entre a execução Java e a camada de rede seja interceptada pelo proxy Hoverfly. Isso significa que, embora uma conexão HTTP com um cliente Java possa apontar para um site externo como http://worldclockapi.com, a conexão será interceptada e encaminhada pelo Hoverfly.

Vale lembrar que precisamos definir as configurações de rede manualmente caso nosso cliente http não suporte as configurações de proxy Java.

A partir de agora, usaremos Hoverfly e Hoverfly Java alternadamente para nos referirmos especificamente ao Hoverfly Java.

Hoverfly se aplica em qualquer contexto?

Como mencionado, o Hoverfly só pode executar um modo de cada vez. No processo de criação de uma aplicação e implementação de sua funcionalidade, podemos usar diferentes padrões para diferentes propósitos.

O objetivo deste post é mostrar a possibilidade de utilizar o Hoverfly para solucionar problemas decorrentes de testes de integração entre aplicativos e serviços de terceiros acessados ​​por meio de APIs.

Muitas das informações fornecidas podem ser encontradas na documentação oficial da ferramenta e não abrangem uma série de outros recursos.

A questão é que temos um problema e uma solução comuns no desenvolvimento de aplicativos modernos.

Mas no final das contas, a avaliação dessa abordagem e o julgamento de sua verdadeira eficácia no contexto de um projeto só podem ser rastreados com precisão por sua equipe técnica.