Introdução — Detekt
Detekt é uma ferramenta de análise estática de código para a linguagem de programação Kotlin. Seu objetivo é auxiliar os desenvolvedores a aprimorar a qualidade de código gerado, possuí funcionalidades que irão analisar o código e gerar relatórios alertando sobre possíveis vulnerabilidades e imperfeições. Para utilizar essa ferramenta, é necessário realizar a integração no projeto através do Gradle e utilizar as Tasks geradas para realizar as análises, também é possível customizar suas Tasks para adequar ao seu projeto e suas particularidades.
Funcionalidades
- Code Smell: são características de código que indicam a violação de um princípio fundamental de Design e que podem ter impacto na qualidade do código, possivelmente aumentando o risco de ocorrência de bugs e falhas futuras na aplicação.
Exemplos: Códigos duplicados, Mutação de variáveis, Classes e métodos gigantes, etc; - Complexity Report: relatório gerado a partir da análise realizada pela ferramenta, indicando quantidade de Code Smells, Linhas de códigos, Comentários, etc;
- Highly configurable: através do XML de configuração, é possível determinar quais regras serão utilizadas pela ferramenta e quais deverão ser aplicadas. É possível desativar e adicionar critérios de aceite para cada regra;
- Suppress findings: possibilidade de suprimir erros e avisos através do uso das anotações
@Suppress (Kotlin) e @SuppressWarnings (Java);
- Thresholds: são valores de aceite para determinadas regras, possibilitando que uma violação exista dentro de uma classe até o valor de Threshold definido;
- Baseline: responsável por definir exceções que serão consideradas Whitelist (apenas novos casos serão analisados) e Blacklist (todos os casos serão analisados) para fins de alertar o desenvolvedor sobre os problemas encontrados;
- Intelij Plugin: plugin que irá auxiliar o desenvolvedor a não gerar novas infrações de código, indicando alertas para cada violação de regras;
- Gradle Tasks: são tarefas customizáveis para alterar o comportamento da ferramenta;
- Danger integration: através do relatório gerado pelo Detekt é possível envia-lo para o Danger interpretar e comentar nos Pull Requests, assim recusando ou aprovando a validação automática.
Integração
Iremos criar um package chamado config no root do projeto, que irá conter todas configurações relacionadas a Análise Estática;
Devemos criar o arquivo detekt.gradle que irá conter as configurações da Task que iremos executar para obter o relatório da análise, ele estará localizado no diretório config/detekt/;
Agora, devemos criar o arquivo de configuração detekt-config.yml no diretório /cofing/detekt/ que irá conter as regras que o Detekt irá adotar para suas análises. No momento, não iremos entrar em detalhes do arquivo de configuração.
Após criar o detekt-config.yml, está na hora de incluir as dependências em nosso build.gradle (root):
Para finalizar, devemos incluir o detekt.gradle em nosso build.gradle (app) através da linha: apply from: “${rootDir}/config/detekt/detekt.gradle” (essa linha será incluída embaixo das linhas com “apply plugin …”). Assim poderemos executar a task detektVerification.
Agora podemos conferir o resultado da task (executando ./gradlew detektVerification) através do exemplo:
O resultado será exibido no terminal em que a task foi executada, neste exemplo vemos que foram detectados infrações relacionadas a EmpyBlocks (Blocos vazios de código), MatchingDeclarationName (Classe com nome diferente do Arquivo) e NewLineAtEndOfFile (Ausência de uma linha em branco no final do código).
Repositório: https://github.com/sp4wna1/StaticAnalysis