Descomplicando a montagem de testes de integração com containers
Implementar testes de integração nem sempre é uma tarefa fácil, chegando até mesmo a ser postergada em muitos casos ao se considerar os inúmeros serviços dos quais uma aplicação pode depender. E as dificuldades só tendem a aumentar quando decidimos executar tais testes de maneira automatizada.
Embora muitos profissionais desconheçam, soluções de automação como Azure DevOps e GitHub Actions contam com ambientes conhecidos como virtual environments em que inúmeros recursos e ferramentas foram pré-instalados. Para saber mais sobre os virtual environments acesse o link a seguir (vale destacar que estes ambientes são comuns ao Azure DevOps e GitHub Actions):
GitHub Actions and Azure DevOps virtual environments
Podemos ir além nos valendo de containers criados nestes ambientes, emulando sem complicações instâncias de bancos de dados e até mesmo serviços de mensageria. A geração destes containers acontece tomando como base repositórios de imagens públicas como o Docker Hub.
Em uma live recente no Canal .NET demonstrei com meu amigo Vinicius Moura a execução automatizada de testes de integração no Azure DevOps e GitHub Actions. A gravação está disponível no YouTube e pode ser assistida gratuitamente (recomendo a você que faça isto para ficar a par de tudo o que fizemos em detalhes):
A aplicação submetida a tais testes foi um Worker Service criado com .NET 5, com a mesma recebendo mensagens a partir de um tópico do Apache Kafka e persistindo informações sobre a negociação de ações de empresas em uma coleção do MongoDB. A imagem a seguir traz uma representação esquemática deste processo:
Com esta abordagem teremos validações simulando situações mais próximas daquelas que encontraríamos em produção.
O projeto com a aplicação a ser validada e seus respetivos testes já foram disponibilizados no GitHub:
https://github.com/renatogroffe/DotNet5-WorkerService-Kafka-MongoDB-IntegrationTests_Acoes
Na listagem a seguir estão os testes, que foram implementados utilizando .NET 5 + xUnit + FluentAssertions. Nota-se neste exemplo o envio de mensagens para um tópico do Apache Kafka e, após algum tempo, uma consulta a uma coleção do MongoDB a fim de determinar se os dados foram persistidos corretamente:
Já na próxima listagem temos o workflow do GitHub Actions descrito e utilizado durante a live:
- Na seção services do job tests (a partir da linha 24) foram declarados containers para executar instâncias para o Apache Kafka, Zookeeper (uma dependência do Kafka) e do MongoDB;
- Todas as imagens referenciadas se encontram no Docker Hub, com as mesmas sendo baixadas quando do início da execução do job tests.
O código deste workflow e scripts adicionais para configuração do mesmo estão no seguinte repositório do GitHub:
No caso específico do Azure DevOps, as dependências foram declaradas em resources > containers do pipeline a partir da linha 4 da listagem a seguir (agradeço ao Vinicius Moura por permitir que eu incluísse este exemplo aqui):