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.
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
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>
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.
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: