Escrevendo Fitness Functions em uma aplicação .net core com suporte a XUnit, SonarQube e Azure Devops
Fitness Function é uma técnica suportada por testes automatizados de software que nos auxilia evidenciar o quanto uma arquitetura está perto de atingir seus objetivos de qualidade. Na prática isso significa que, se durante o desenvolvimento orientado a testes, escrevemos testes para verificar se os recursos estão em conformidade com os resultados de negócios desejados; no desenvolvimento orientado à Fitness Functions, escrevemos testes que medem o alinhamento de um sistema com os objetivos arquitetônicos. Neste Post apresentaremos uma proposta de escrita de Fitness Functions utilizando as tecnologias .net core, XUnit, Sonar e Archunit.
Definição de atributos de qualidade
Antes de tudo, é preciso entender que a definição arquitetural de um software não deveria ser algo abstrato ou simplesmente intuitivo: as escolhas que definem as estruturas e comportamentos de uma aplicação devem ser baseadas em decisões capazes de fornecer evidências que indiquem o quanto o software está próximo das suas metas de qualidade.
Quem Não Sabe Para Aonde Vai, Qualquer Caminho Serve! (Alice no pais das maravilhas — fala da personagem Gato)
Nesse sentido, nosso primeiro passo é identificar quais os atributos de qualidade mais importantes para o sucesso de negócio. Esses atributos geralmente se alinham com as “-ilidades” arquitetônicas (ver ISO/IEC 25000). Sendo assim, agrupa-se os resultados em temas comuns, como como usabilidade, confiabilidade, disponibilidade, manutenibilidade etc.
Esboçando e estruturando o projeto de testes
Nessa etapa devemos esboçar nossas funções em uma estrutura de testes. Idealmente, as Fitness Functions devem descrever a intenção da “-ilidade”. Para isso, criamos um projeto de testes específico com sufixo “*.FitnessFunctions” — Isso ajudará a isolá-lo dos demais testes em termos de configuração de pipeline — , depois separamos as Fitness Functions por atributos de qualidade utilizando pastas de projeto, como ilustra a Figura 1.
Escrevendo nossa Fitness Functions
As Fitness Functions são escritas de forma a validar se determinado atributo de qualidade está sendo atendido ou não. Por exemplo, podemos escrever uma função que verifique se nosso código está com o índice de qualidade acima de “B” (sqale rating). Ainda podemos, validar se nosso código possui uma cobertura acima dos 70%, como ilustra a Figura 2.
Podemos ainda, escrever funções que validam se nossa estrutura de projeto segue o estilo arquitetural definido, como ilustra a Figura 3.
A ideia por trás desses testes é que eles promovam maior visibilidade para os desenvolvedores se as metas de qualidade ou a estrutura arquitetural foram comprometidas durante o desenvolvimento.
Coletando Métricas e executando os testes
Para que esses testes funcionem adequadamente eles precisam ter acesso as métricas calculadas e atualizadas dos atributos. Aqui apresentaremos duas ferramentas: o SonarQube, como fornecedor das métricas de Code Quality e ArchUnit, fornecendo resultados de análise de estrutura arquitetural.
Recuperando métrica de Code Quality do SonarQube.
Como ilustra a Figura 4, Para recuperar métricas do sonar, precisamos realizar uma chamada autenticada em sua API. Para isso, devemos criar um token, que nos permita consumir os serviços. Esse token pode ser gerado pela aplicação do Sonar acessando o menu “My Account > Security > Token”. Com o token devidamente registrado, podemos realizar chamadas na API do SonarQube, como ilustra o exemplo a seguir:
Utilizando Framework ArchUnit
O ArchUnit pode verificar dependências entre pacotes, classes e camadas; também verifica dependências cíclicas e muito mais. Ele faz isso analisando o bytecode do software, importando todas as classes para uma estrutura de código Java/C#. No contexto de Fitness Function, utilizaremos essa biblioteca para validar se nosso projeto atende requisitos de manutenibilidade.
Para mais detalhes de como utilizar esse framework, você pode consultar os seguintes recursos:
Executando nosso testes localmente
Uma vez que as Fitness Functions foram escritas e os mecanismos de atualizações das métricas devidamente programados, podemos executar nossa camada de testes.
A figura 5, ilustra o resultado de uma execução. Analisando esses resultados, percebe-se que, em termos de Code quality, que acobertura está próxima do valor desejado (70%), apresentando uma de cobertura de 64.1%; em termos de Maintainability nosso código está com o índice acima de B.
Ajustando Pipeline
Integrar nossas Fitness Functions em nosso pipeline no Azure Devops é algo simples: primeiro editamos a pipeline do projeto incluindo um novo agente; em seguida, vamos adicionar uma task do tipo .net core e configurá-la para executar o command “test”, como ilustra a Figura 7.
Lembre-se de adicionar essa etapa após o build e atualização do sonar, para garantir que as métricas vão estar corretas. Com as configurações devidamente realizadas, sua etapa de Fitness Functions estará incorporada no pipeline do Azure Devops promovendo várias oportunidades de intervir na geração de release e publicação de sua aplicação.
Conclusão
Apresentamos neste artigo como escrever Fitness Functions em seu projeto .net core utilizando os suportes do XUnit, Sonar, ArchUnit e Azure Devops. Espero que tenha curtido o artigo! Deixe seus comentários sobre essa implementação e sugestões de melhorias. Obrigado pela leitura!