Adicionar informação da cobertura ao Sonarqube

Segundo a documentação:

SonarQube oferece suporte ao relatório de informações de cobertura de teste como parte da análise do seu projeto JS/TS.
No entanto, o SonarQube não gera o próprio relatório de cobertura. Em vez disso, você deve configurar uma ferramenta de terceiros para produzir o relatório como parte do seu processo de construção. Em seguida, você precisa configurar sua análise para informar ao SonarScanner onde o relatório está localizado, para que ele possa pegá-lo e enviá-lo ao SonarQube, onde será exibido no painel do seu projeto junto com as demais métricas de análise.
Para projetos JS/TS, o SonarQube oferece suporte direto a todas as ferramentas de cobertura que produzem relatórios no formato LCOV. Além disso, um formato de cobertura genérico também é suportado se você desejar usar uma ferramenta não suportada (embora você mesmo tenha que converter sua saída para o formato genérico).

Sabendo disso vamos integrar essa informação ao sonar afim de ser possível ler a informação da cobertura, essa informação é gerada através de outras ferramentas de terceiros que provêm os dados de cobertura no formato lcov, o sonar lê essas informações e disponibiliza como parte da análise.

Neste mesmo link, que compartilhei acima, existe um passo a passo para adicionar a informação da cobertura ao seu projeto. O objetivo desta publicação é adicionar a informação da cobertura ao sonar.

Requisitos:

  • Ter um servidor sonar configurado
  • Ter um cliente sonar configurado

Para isso vamos utilizar o projeto tokenAuthDatastore, que é um código fonte público que pode ser utilizado para testar essa configuração, após finalizar a leitura isso você pode integrar ao seu projeto. Esse projeto tokenAuthDatastore já possui bibliotecas para execução e geração de informação da cobertura. As ferramentas que utilizei neste projeto podem ser vistas nas configurações do package.json

chai, mocha, nyc, sinon, supertest

Vamos ao passo-a-passo:

clone o projeto:

  git clone git@github.com:danizavtz/tokenAuthDatastore.git

entre no diretório do projeto que foi clonado e instale as dependências:

cd tokenAuthDatastore
npm install

Agora basta executar os testes de cobertura neste projeto. Ao executar os testes de cobertura serão gerados meta-dados de cobertura do seu código fonte no diretório  .nyc_output é a partir dessas informações que será gerado o relatório de cobertura.

Sabendo disso, vamos executar a cobertura do código:

npm run coverage

Após executar a cobertura, gerar a informação de cobertura, com o seguinte comando:

npm run report-coverage

A partir dos meta-dados será gerado um novo arquivo na raiz do projeto, o arquivo coverage.lcov.

É esse arquivo que vai servir de insumo para gerar a informação de cobertura exibida no sonar. Agora basta executar a sua automação do sonar para ler este arquivo.

Agora vamos configurar este projeto no sonar, vamos fazer a configuração local, para isso siga os passos da interface gráfica do sonar:

Preencha as informações do projeto na página seguinte:

Repare que no campo main branch nameo nome da branch é o mesmo nome da branch que eu clonei o meu projeto, que neste caso é a branch master. (você pode verificar esta informação, executando o comando: git  branch no diretório raiz do projeto que deseja configurar).

Escolha o método de análise e clique em Generate. Para esse exemplo vou utilizar o método local, mas existem várias possibilidades de configuração, os relevantes são, Jenkins, Gitlab e Github além de outros.

Após clicar em generate, será encaminhado para a próxima tela onde será exibido o token. Agora basta apenas clicar em continue.

Como se trata de um projeto javascript, então eu seleciono a opção de acordo.

Após selecionar esta opção será apresentado o próximo menu com as instruções para executar o sonar no projeto. Clique no botão copiar.

O importante nesta tela é este comando para executar o sonar. Com este comando vá para o diretório raiz de onde o projeto foi clonado (o mesmo que possui o arquivo coverage.lcov, que geramos em um passo anterior). Este é o comando:

sonar-scanner.bat -D"sonar.projectKey=tokenAuthDatastore" -D"sonar.sources=." -D"sonar.host.url=http://localhost:9000" -D"sonar.token=sqp_ec913a0f15298a323d67862cfd3a5f3ecc49cdf8"

Após executar este comando será gerado um relatório do sonar. Ao gerar o relatório você verá que a cobertura está zerada.

Isso acontece pois é necessário passar mais alguns argumentos de linha de comando, para que seja possível localizar o arquivo *.lcove utilizar as informações contidas nele, seguindo a documentação compartilhada no inicio da publicação temos que passar este parâmetro com o seguinte argumento:

 sonar.javascript.lcov.reportPaths=coverage.lcov

Lembrando que o valor deste argumento, deve ser o nome do arquivo que possui a informação da cobertura, em nosso projeto o nome deste arquivo é coverage.lcov.

Então agora, basta executar o comando anterior novamente, com esse novo parâmetro com seu respectivo argumento. Segue o comando completo:

sonar-scanner.bat -D"sonar.projectKey=tokenAuthDatastore" -D"sonar.sources=." -D"sonar.host.url=http://localhost:9000" -D"sonar.token=sqp_ec913a0f15298a323d67862cfd3a5f3ecc49cdf8" -D"sonar.javascript.lcov.reportPaths=coverage.lcov"

Pronto, agora as informações de cobertura já estarão disponíveis, segue um exemplo de como deve ficar:

Agora só mais um ajuste, vemos que em nosso projeto, será executado o sonar em todas as pasta, mas na verdade eu não gostaria de analisar códigos presentes nos diretórios node_modules, assim como também no diretório tests.  Isso vai manter o foco da análise em meu código fonte desenvolvido.

Vamos então reduzir o escopo da análise, que pode ser conseguido através da exclusão de certos diretórios de serem analisados.

Vamos usar o parâmetro: sonar.exclusions .

O comando final fica assim:

sonar-scanner.bat -D"sonar.projectKey=tokenAuthDatastore" -D"sonar.sources=." -D"sonar.host.url=http://localhost:9000" -D"sonar.token=sqp_ec913a0f15298a323d67862cfd3a5f3ecc49cdf8" -D"sonar.javascript.lcov.reportPaths=coverage.lcov" -D"sonar.exclusions=test/**,node_modules/**"

Repare que no final eu utilizei a seguinte sintaxe: test/**. Isso está explicado na documentação, e é um padrão para ignorar subdiretórios e arquivos contidos nestes diretórios.

Agora ao executar o mesmo comando (adicionando as exclusões), temos a seguinte saída:

E isso encerra o nosso tutorial, vemos que o valor da cobertura está de acordo com o mesmo que é exibido no github. Por outra ferramenta a codecov. 🙌

Também é possível fazer estas mesmas configurações via interface gráfica sem a necessidade de utilizar a linha de comando,  basta seguir as instruções presentes na documentação, que já foi referenciada.

Agora que já configurou o sonar acrescentando a informação de cobertura em um projeto, será possível utilizar as mesmas ideias presentes aqui para outros projetos.