Integração de testes com Go, Wiremock e Mongodb usando dockertest

Mahmoud aljadan
b2w engineering
Published in
3 min readMay 19, 2021

--

Na maioria das APIs prontas para produção, são necessários testes de integração para atestar tudo o que está relacionado à lógica da API, desde validações, cálculos e até o formato de resposta.

E quando maioria das APIs tem diferentes dependências externas, como o sistema de mensagens, ferramentas de monitoramento, ferramentas de rastreamento, entre outros, o que fazer para viabilizar este teste de integração, que pode ser muito mais difícil?

Com ele, é possível simular todas essas dependências externas, girando um contêiner para cada uma especificamente. Esse procedimento é feito escrevendo um arquivo docker-compose para orquestrar esses contêineres. É permitido também usar uma uma biblioteca docker, onde será escrita uma função para ativar esses contêineres antes da execução dos testes, que devem estar dentro da mesma rede docker.

Aqui, veremos como usar dockertest para escrever nossos testes de integração.

No exemplo, foi criada uma API simples com duas dependências. Uma acessará mongodb e a outra fará uma chamada de descanso para outra API. Ao escrever testes para esses endpoints isolados de suas dependências, será simulada a Chamada de API, usando o contêiner Wiremock. Já para o banco de dados, será executado um contêiner de teste mongodb.

Vamos entrar no código agora. Pontos finais:

  • GET /resource-status ( static response to check if the API is working)
  • Get /planets/:id ( call Star War API )
  • Get /people/:id ( get document from mongodb)

A ideia aqui é iniciar o mongodb, o Wiremock e nossa API e fazer uma chamada http normal para nossa API para testá-la. Isso será feito escrevendo uma função TestMain, que irá configurar e girar nossos contêineres antes de executar nossos testes. É importante mencionar aqui que, para que os contêineres se comuniquem entre si, precisam estar na mesma rede docker “docker network”.

Utilizando os nomes dos contêineres e suas respectivas portas internas, é permitido chamar o mongodb ou wiremock com início em nossa API. Para girar um contêiner Wiremock, precisamos montar nossos stubs dentro do contêiner e usar sua porta exposta para chamá-lo no método Repetir, checando se o Wiremock está ativo.

Será feita a mesma coisa para o contêiner mongodb. O nosso script init_db.js será montado dentro do contêiner para inicializar nosso banco de dados de teste, usando a porta exposta para conectar ao mongodb dentro do método Retry, verificando assim se está funcionando.

E, finalmente, contêiner de API é girado, usando um Dockerfile que criará o aplicativo e o executará, sendo anexado o logger para ver nossos logs de API (para fins de depuração).

Agora estamos prontos para escrever nossos testes fazendo chamadas http normais para nossos endpoints de API, começando o primeiro teste chamando /planets/:id

E o segundo teste chamando /people/:id

Também serão adicionadas tags de construção para evitar a execução de testes de integração durante a execução de testes de unidade, isso será adicionado a todos os arquivos de teste de integração.

Para executar o teste de integração, você pode executar:

go test -tags integration

O código completo está disponível em meu repositório no github.

Se você busca uma oportunidade de desenvolvimento, trabalhando com inovação em um negócio de alto impacto, acesse o portal B2W Carreiras! Nele, você consegue acessar todas as vagas disponíveis. Venha fazer parte do nosso time!

--

--