Codeblox Blog

ASP.NET - Badges de teste e cobertura no GitHub

Guilherme
06/10/2021

Ao migrar alguns projetos do Azure DevOps para o Github Actions, uma das coisas que senti falta foram os relatórios de testes e cobertura de código. A ideia que eu vou apresentar abaixo fala em como adicionar badges de testes no README de um projeto .NET, mas ela pode ser aproveitada para qualquer outra tecnologia.

O que eu queria era criar indicadores de:

E que esses indicadores fossem naturalmente acessíveis apenas pelos membros do time de um projeto privado no GitHub.

Em resumo, a solução que encontrei foi utilizar uma branch orfã no projeto, contendo as imagens das badges. Assim é possível referenciar essas imagens no README dos projetos. Essa branch é naturalmente acessível pelos membros do projeto, então todos conseguem visualizar essas imagens. Para geração das imagens utilizei GitHub Actions.

1. Criar uma branch orfã

No exemplo abaixo, vou chamar essa branch de “results”. Escolha o nome que achar mais adequado:

git checkout --orphan results

Agora remova todos os arquivos que estejam lá. Você quer uma branch totalmente vazia:

git rm -rf .

Realize o commit vazio:

git commit --allow-empty -m "commit inicial da branch de resultados"

Por fim, push:

git push origin results

Não esqueça de retornar para sua branch para trabalhar no código normalmente.

git checkout nome-da-branch-que-voce-trabalha

2. Preparar o projeto para realizar a cobertura de testes

Nos meus projetos costumo usar o coverlet para cobertura, criando um arquivo na pasta raiz da solução:

coverlet.runsettings:

<?xml version="1.0" encoding="utf-8" ?>
<RunSettings>
  <DataCollectionRunSettings>
    <DataCollectors>
      <DataCollector friendlyName="XPlat Code Coverage">
        <Configuration>
          <SkipAutoProps>true</SkipAutoProps>
        </Configuration>
      </DataCollector>
    </DataCollectors>
  </DataCollectionRunSettings>
</RunSettings>

E então em cada .csproj de projeto de testes eu faço a referência aos settings de coverlet:

<PropertyGroup>
  <TargetFramework>net5.0</TargetFramework>
  <IsPackable>false</IsPackable>
  <RunSettingsFilePath>$(SolutionDir)\coverlet.runsettings</RunSettingsFilePath>
</PropertyGroup>

3. Criar um GitHub Action

Em seguida, vou criar um GitHub Action (deve ficar no caminho .github/workflows/<nome-do-arquivo>.yml). Esta Action vai baixar o código do projeto, executar os testes, gerar as badges e commitar elas nas branch de resultados.

.github/workflows/testes.yml:

name: TESTES COMPLETOS
on:
  workflow_dispatch:
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    # checkout do projeto
    - uses: actions/checkout@v2
    # executa os testes (continua se houver erros)
    - run: dotnet test --logger trx
      continue-on-error: true
    # instala o dotnet-reportgenerator
    - run: dotnet new tool-manifest --force
    - run: dotnet tool install dotnet-reportgenerator-globaltool
    # executa o report generator com a opção de Badges
    - run: dotnet tool run reportgenerator -reports:**/coverage.cobertura.xml -targetdir:TestResult -reporttypes:"Badges;MarkdownSummary"
    # executa action para gerar badge de quantidade de testes
    - uses: cblx/trx-to-badge@v0.5
      with:
         label: 'TESTES COMPLETOS'
    - run: mv test-badge.svg TestResult/test-badge.svg
    # guarda as badges como artefato
    - uses: actions/upload-artifact@v2.2.4
      with:
         path: TestResult
         
    # realiza checkout da branch de resultados
    - uses: actions/checkout@v2
      with:
        ref: results
    # baixa os artefatos
    - uses: actions/download-artifact@v2.0.10
    # realiza o commit/push na branch de resultados
    - run: |
         mv ./artifact/* ./
         git config --global user.email "exemplo@email.com"
         git config --global user.name "Workflow"
         git add .
         git commit -m "coverage update"
         git push

Na Action acima, as badges de cobertura são geradas pelo dotnet-reportgenerator. Já para a badge de quantidade de testes executados/falhos, utilizei a action cblx/trx-to-badge que eu mesmo criei. O código dela pode ser conferido aqui => https://github.com/cblx/trx-to-badge.

3. Referenciar as badges no README do projeto

Com as badges geradas e commitadas na branch de resultados, podemos referenciar essas imagens no README da ramificação usual.

<img src="https://github.com/meu-projeto/blob/results/badge_linecoverage.svg">
<img src="https://github.com/meu-projeto/blob/results/badge_branchcoverage.svg">
<img src="https://github.com/meu-projeto/blob/results/test-badge.svg">

Ficando algo assim:

image

devops
github
dotnet
aspnet


Guilherme M. Abdo
Guilherme M. Abdo
Desenvolvedor fullstack .Net/Angular/Azure/GitHub