Desbloquea o poder dos testes em ASP.NET: aprimora a qualidade do software: xUnit e Coverlet I
Testes e cobertura de testes com xUnit e Coverlet - Parte I
Vou partilhar um pouco sobre testes, nesta primeira parte os conceitos teóricos e algumas especificidades aplicado à aplicações ASP.NET, na próxima publicação vou trazer um exemplo.
Testes é um tema que nem sempre é tido em consideração, acredito que, muito pela falta de entendimento dos ganhos. Quando os gestores ou líderes de equipas que, ainda não incluem testes como parte dos trabalhos, tiverem a plena consciência que se trata de um investimento a longo prazo, que testes, podem melhorar e elevar a qualidade qualidade do produto a ser entregue, além disso, serve como uma garantia que futuras alterações não comprometem o normal funcionamento do que já funciona.
Fazer testes implica também considerar e implementar conceitos importantes como SOLID Principles, principalmente Single Responsibility Principle, Interface Segregation Principle e Dependency Inversion Principle, caso contrário fazer teste pode-se tornar num processo inviável.
Durante a apresentação do GitHub Copilot, na Microsoft Build, foi apresentado uma inteligência artificial que consegue gerar testes,parece ser uma boa ajuda.
Pirâmide de teste
Os testes podem ser classificados de acordo com o nível de importância e dificuldade de realização, classificação que facilita a explicação e demonstração, temos uma pirâmide abaixo que elucida os diferentes níveis de testes.
Podemos encontrar outros tipos de testes em várias outras bibliografias, contudo, aqui vamos considerar três tipos de testes:
- Testes de unitário ou de unidade;
- Testes de Integração;
- Testes Ponta a Ponta (E2E, UI ou Testes de Interface);
Os teste na base da pirâmide são as mais simples de serem criados, uma vez que estamos a tratar de componentes independentes, no entanto, é preciso fazer mais testes unitários do que E2E para garantir uma boa qualidade de software.
Para não tornar o artigo extenso, vamos concentram na base da pirâmide, nos testes unitários, mais a frente vamos incluir o tema cobertura de teste.
Testes de unitários
Os testes de unitários possibilitam testar o menor componente de software, que no contexto de aplicações desenvolvidas em ASP.NET, podemos testar propriedades, métodos ou classes. Os testes unitários asseguram se os resultados esperados estejam de acordo com o esperado, para diferentes cenários e ou input fornecido.
Importância de testes
- Assegura que mesmo com alterações de código, mudança de biblioteca ou atualização para uma nova versão, o comportamento mantém-se sempre o mesmo.
- Força a implementação de conceitos como SOLID Principles, o que representa ganhos principalmente no processo de manutenção.
- Possibilita identificar, corrigir e reduzir bugs antes de entregar o software no cliente ou em produção.
- Assegurar que em cenários de CI/CD, a publicação só se materializa quando todos os testes forem bem sucedidos.
- Assegurar que desenvolvedores experientes ou não, tenham um entendimento correto da funcionalidade.
Para projetos desenvolvidos em ASP.NET temos algumas ferramentas como xUnit, NUnit ou MSTest para realização de testes. A ferramenta que vamos usar para fazer os testes é o xUnit.
xUnit é uma biblioteca livre, open source, cross platform, que permite testar aplicações desenvolvidos em ASP.NET. Criada pelos criadores do NUnit, é parte do .NET Foundation, licenciado sob Apache 2.
Para testar código com xUnit, temos de criar classes com métodos comuns e marcar os métodos com [Fact] ou [Theory], sendo que no segundo, pode ser fornecido vários input para testar um mesmo método.
Cobertura de testes
Embora os testes unitários servem para garantir o bom funcionamento de um determinado trecho de código, os testes podem não cobrir todas as possibilidades, para isso temos bibliotecas de cobertura de código que indicam o nível de cobertura de testes do projeto.
Para medir a cobertura de testes, temos uma biblioteca denominada Coverlet, é uma biblioteca open source, cross platform que recolhe dados relativos a testes das funcionalidades existentes e apresenta um relatório com a indicação do nível de cobertura de cada unidade e do projeto. Criado por Toni Solarin-Sodara, é um projeto da .NET Foundation.
A separação de projecto em camadas, como sugere Clean Architecture, na imagem acima, permite testar e saber a cobertura de código das camadas, assim sendo, consegue-se testar apenas as regras de negócio ou core da aplicação, que é a parte mais importante a ser testada, sem se preocupar com questões externas à aplicação.
Conclusão
Invista em testes, principalmente os testes unitários, não apenas por ser o alicerce da pirâmide apresentada, mas se houver garantia que cada unidade funciona bem as chances de serem bem sucedidos nos outros teste aumenta.
Referência
coverlet-coverage/coverlet: Cross platform code coverage for .NET (github.com)
C# — XUnit Básico (macoratti.net)
Pirâmide de Testes: o que você precisa saber sobre esse conceito (onedaytesting.com.br)