.NET 5 + ASP.NET Core + Middlewares: implementação e testes automatizados
Recentemente realizei uma apresentação no Canal .NET em conjunto com o Vinicius Moura, cobrindo a implementação de testes automatizados em .NET 5 e utilizando Mocks.
Ao longo da live foi abordada a utilização de frameworks como Moq, NSubstitute e Coverlet. Os testes aconteceram em um middleware construído para APIs REST baseadas no ASP.NET Core, com a execução automatizada destes a partir de soluções como Azure DevOps e GitHub Actions: esse componente tem por objetivo impedir o acesso a recursos de tais aplicações caso o horário atual se enquadre dentro de um período de indisponibilidade previamente cadastrado. Trata-se de um exemplo refatorado e com novas capacidades (já havia criado este middleware há algum tempo), com uma versão anterior podendo ser encontrada neste link.
Para conhecer os detalhes da implementação (e também dos testes) acesse gratuitamente a gravação da live mencionada no YouTube:
A listagem a seguir traz o arquivo .csproj do projeto contendo o middleware:
- Foram utilizadas nesta implementação soluções como Fluent Migrator, os providers ADO.NET para SQL Server e SQLite, além do package Microsoft.AspNetCore.Http.Abstractions (este último contendo estruturas básicas da infraestrutura do ASP.NET Core);
- As tags PackageId, Version, Authors, Company, PackageTags e Description em PropertyGroup se referem à configurações para a publicação deste projeto como um package no NuGet (algo demonstrado durante a live com Azure DevOps e GitHub Actions).
Para um possível uso em produção estou considerando a gravação dos períodos de indisponibilidade em SQL Server. Já para a condução dos testes empreguei o SQLite, alternativa open source e que depende no caso de um projeto .NET apenas da inclusão do provider ADO.NET correspondente.
O enum DBChecagemIndisponibilidade permitirá escolher entre SQL Server e SQLite para a utilização do middleware:
O tipo IndisponibilidadeMigration_v001 implementa uma Migration do Fluent Migrator, sendo responsável pela criação da tabela Indisponibilidade (que armazenará períodos nos quais a aplicação foi configurada como não acessível):
Já em uma instância da classe ConfiguracoesIndisponibilidade constarão o tipo de banco de dados escolhido, bem como a string de conexão ao mesmo:
A implementação do middleware está no tipo ChecagemIndisponibilidade:
- A instância de RequestDelegate recebida no construtor permitirá repassar o processamento para um próximo middleware ou não (no caso de uma indisponibilidade em vigência no momento atual);
- Já o objeto de contexto recebido em Invoke possibilitará o acesso à instância da classe ConfiguracoesIndisponibilidade com as definições para uso da base de dados, bem como a uma instância de ILogger. É neste método que o processamento de uma requisição HTTP será repassado ao próximo middleware da pilha (linha 64), ou ainda acontecerá a geração de um erro se o horário atual estiver dentro de um período de indisponibilidade (a partir da linha 68);
- Os objetos baseados em RequestDelegate e HttpContext deverão ser gerados como Mocks para a execução dos testes com Moq e NSubstitute.
Na classe ChecagemIndisponibilidadeExtensions foram definidos os Extension Methods:
- ConfigureChecagemIndisponibilidade, para definir a tecnologia de banco de dados escolhida e a string de conexão correspondente;
- UseChecagemIndisponibilidade, que permitirá adicionar o middleware à pilha de execução em um projeto ASP.NET Core.
Na próxima listagem temos um exemplo de utilização deste middleware na classe Startup de um projeto do tipo Web API, com as chamadas aos métodos de extensão ConfigureChecagemIndisponibilidade em ConfigureServices e UseChecagemIndisponibilidade em Configure:
Um teste via Postman envolvendo um período de indisponibilidade previamente cadastrado pode ser observado na próxima imagem, com a geração de um erro HTTP de código 403 - Forbidden:
Já na classe temos a criação de Mocks para as classes RequestDelegate e HttpContext, fazendo uso para isto do framework Moq no método SimularMiddleware (linhas 75 a 88):
Estas diferentes implementações foram disponibilizadas no seguinte repositório do GitHub:
Em um segundo repositório implementei Mocks com NSubstitute, além de demonstrar uma diferente possibilidade de uso do middleware de indisponibilidade (vinculado a uma Action):
No vídeo indicado no início deste artigo este exemplo adicional foi descrito em detalhes. Recomendo a você que assista ao mesmo a partir do ponto indicado a seguir:
E finalizo este post com mais um convite…
Que tal participar da Formação Azure DevOps promovida pelo Azure na Prática e aprender em profundidade como melhorar o seu ciclo de desenvolvimento na sua empresa? Trabalhe com seu time de forma colaborativa e ainda utilizando as melhores técnicas e práticas, a fim de garantir a qualidade do software que está sendo desenvolvido!
Acompanhe com comodidade e a qualquer tempo os diversos módulos deste treinamento, em que serão cobertas boas práticas + estratégias de build/deployment e o uso desta solução de automação com tecnologias como o próprio .NET, Azure Functions, Selenium WebDriver, Docker, Kubernetes, Azure App Service e outros serviços da nuvem Microsoft!
Acesse então o link a seguir para efetuar sua inscrição com um desconto especial de 10% (inclui certificado e grupo para resolução de dúvidas durante e após o curso):