Calculer la couverture de code d'un projet .Net
TL;DR Avec les outils AltCover et ReportGenerator il est relativement facile de générer des statistiques au format HTML sur la couverture de votre code .Net par les tests unitaires.
dotnet test /p:AltCover=true
ReportGenerator.exe -reports:coverage.xml -targetdir:./coverage
Article inspiré par l’excellent Scott Hanselman
Principe
La couverture de code est une mesure intéressante (mais pas infaillible) pour analyser comment
votre code est effectivement testé unitairement. Elle indique
quelles lignes de code sont exécutées par les tests unitaires
et dans quelle mesure les différents branchements
dans le code sont testés : par exemple si toutes les valeurs possibles d’un if
sont testées,
si toutes les clauses catch
sont testées, etc.
Et pourtant cette métrique est difficile à obtenir dans Visual Studio (ou VS Code) pour le commun des mortels, sauf si vous avez une licence Entreprise 💶 ou si vous utilisez une plateforme d’intégration continue comme VSTS avec des builds bien configurés 😇.
Heureusement la communauté fournit des initiatives ouvertes permettant d’obtenir ces informations à moindre frais. Voici une solution, parmi les multiples options disponibles, utilisant une combinaison de deux outils open source.
Analyser avec AltCover
AltCover va d’abord
lancer vos tests unitaires, les analyser et produire un ficher
de couverture de code coverage.xml
.
On peut installer cet outil dans son projet de tests avec NuGet :
cd [...]\MonProjet.Tests
dotnet add package AltCover
Puis lancer les tests unitaires et produire le ficher coverage.xml
:
dotnet test /p:AltCover=true
Le framework de tests unitaires utilisé importe peu, tant qu’il
peut être lancé avec dotnet test
.
Un rapport ReportGenerator
Le fichier généré par AltCover est un fichier XML au format OpenCover. Diffilement lisible par un être humain, il peut être transformé en pages HTML par ReportGenerator.
On peut installer cet outil, également avec NuGet :
dotnet add package ReportGenerator
Petite astuce pour continuer, il faut retrouver le chemin vers l’exécutable ReportGenerator.exe, caché quelque part dans votre répertoires de packages NuGet.
Get-ChildItem $env:USERPROFILE\.nuget\packages\reportgenerator -Recurse -File `
| Where-Object { $_.Name -eq "ReportGenerator.exe" } `
| Sort-Object -Descending { $_.LastWriteTime } `
| Select-Object -First 1 `
| ForEach-Object { $_.FullName }
Enfin lancer la génération du rapport HTML :
c:\[...]\ReportGenerator.exe -reports:coverage.xml -targetdir:./coverage
Le rapport est alors accessible dans ./coverage/index.htm
.
En résumé
Voici un script Powershell pour automatiser ces étapes (sauf l’installation des packages NuGet).
$reportgenerator = Get-ChildItem $env:USERPROFILE\.nuget\packages\reportgenerator -Recurse -File `
| Where-Object { $_.Name -eq "ReportGenerator.exe" } `
| Sort-Object -Descending { $_.LastWriteTime } `
| Select-Object -First 1 `
| ForEach-Object { $_.FullName }
dotnet test /p:AltCover=true /p:AltCoverXmlreport="./coverage/coverage.xml"
& $reportgenerator -reports:./coverage/coverage.xml -targetdir:./coverage/report
Start-Process ".\coverage\report\index.htm"
Autre astuce, générez le rapport dans le répertoire ./coverage
pour ne pas polluer la racine de votre projet avec les fichiers générés.
La dernière commande Start-Process
est optionelle, elle ouvre
le rapport dans votre navigateur préféré.