Testes de Integração em uma WebAPI utilizando WebApplicationFactory e WireMock
Introdução
Testes de integração têm como objetivo verificar se os diferentes componentes de uma aplicação interagem corretamente entre si. Eles garantem que as partes integradas funcionem conforme o esperado, identificando problemas de comunicação, erros de configuração e comportamentos inesperados. Esses testes são essenciais para validar a integração de serviços, APIs externas, bancos de dados e outros sistemas com a sua aplicação. 🚀
Neste modelo, usaremos como atores principais o WebApplicationFactory e WireMock.net.
A classe WebApplicationFactory é usada para criar um servidor de teste em memória e hospedar sua aplicação durante os testes de integração. Este servidor é 100% configurável e permite a personalização de serviços, middlewares e endpoints antes da execução dos testes, podendo assim simular qualquer cenário específico desejado.💪
Já o WireMock.net é usado para simular respostas HTTP em seus testes de integração. Ele permite predefinir respostas para solicitações externas que atendam a critérios específicos.🦾
Referências
Aqui utilizamos Xunit e os seguintes pacotes para criar os testes (porém fique a vontade de usar os pacotes que tiver mais afinidade):
- FluentAssertions
- FluentAssertions. Web
- Microsoft.AspNetCore.Mvc.Testing
- Microsoft.NET.Test.Sdk
- WireMock.Net.StandAlone
estes podem ser instalados via nuget package manager no visual studio ou rodando o comando:
Configuração da API ⚙
A classe WebApplicationFactory é usada para criar um servidor de teste para hospedar sua aplicação. Ela permite configurar os serviços, middlewares e endpoints antes de executar os testes.
O Teste 🧪
O exemplo abaixo mostra um teste de integração cujo objetivo é chamar o endpoint “/api/meucontroller/meu-metodo” da API sob teste. Para isso, subimos uma API em memória e criamos o client que vai consumi-la. Com a ajuda do Wiremock, mockamos o que seria uma chamada externa ao endpoint “/apiExterna/endpoint” simulando um retorno 200 com o body “Hello World”:
Ao debugar a execução deste teste, verá que T-O-D-A a sua API estará sob teste, desde middlewares, injeção de dependência, attributes, etc. 🤘
Conclusão
Diferentemente de um teste de unidade em que o foco é uma pequena parte de seu código e todo o restante é mock ou stub, os testes de integração são peça fundamental para aumentar a confiança no código. Com a habilidade de fazer uma verdadeira requisição http, conseguimos testar “de fora pra dentro” nossa API alvo, da mesma forma que uma aplicação (ou usuário) faria.