Utiliser la couverture du code pour déterminer la quantité de code testé

Pour déterminer quelle proportion du code de votre projet est testée par des tests codés tels que des tests unitaires, vous pouvez utiliser la fonctionnalité de couverture du code de Visual Studio. Pour vous protéger efficacement contre les bogues, vos tests doivent exercer ou « couvrir » une grande partie de votre code.

L’analyse de la couverture du code est possible pour le code managé (CLR) et non managé (natif).

L’option de couverture du code est disponible dans le menu Test lorsque vous exécutez des méthodes de test à l’aide de l’Explorateur de tests. Le tableau de résultats indique le pourcentage du code exécuté dans chaque assembly, classe et procédure. L’éditeur source met en évidence le code testé.

Spécifications

La fonctionnalité de couverture du code n’est disponible que dans l’édition Visual Studio Enterprise.

Analyser la couverture du code

  1. Dans le menu Test , sélectionnez Analyser la couverture du code pour tous les tests.

    Capture d’écran du menu Test avec Analyser la couverture du code mise en évidence.

    Conseil

    Vous pouvez également exécuter la couverture du code à partir de la fenêtre outil De l’Explorateur de tests .

  2. Une fois les tests exécutés, pour voir quelles lignes ont été exécutées, choisissez Capture d’écran du menu Analyser la couverture du code dans Visual StudioAfficher la coloration de la couverture du code dans la fenêtre Résultats de la couverture du code . Par défaut, le code couvert par les tests est mis en surbrillance en bleu clair. Capture d’écran montrant la couverture du code mise en évidence.

  3. Pour modifier les couleurs ou utiliser un visage en gras, choisissez Options Outils>Polices>d’environnement>et Couleurs>Afficher les paramètres pour : Éditeur de texte. Sous Afficher les éléments, ajustez les paramètres des éléments « Couverture », par exemple, Zone de couverture non touchée.

    Capture d’écran montrant les polices et les couleurs de couverture du code.

    Capture d’écran montrant les polices et les couleurs de couverture du code

  4. Si les résultats montrent une faible couverture, examinez les parties du code qui ne sont pas exécutées et écrivez d’autres tests pour les couvrir. Les équipes de développement visent généralement une couverture de code qui avoisine 80 %. Dans certaines situations, une couverture inférieure est acceptable. Par exemple, une couverture inférieure est acceptable lorsqu'un code est généré à partir d'un modèle standard.

Conseil

Pour optimiser la couverture du code :

  • Désactivez l’optimisation du compilateur.
  • Si vous utilisez du code non managé (natif), utilisez une build de débogage.
  • Générez des fichiers .pdb (symbole) pour chaque assembly.

Si vous n’obtenez pas les résultats escomptés, consultez Résoudre les problèmes liés à la couverture du code.

N’oubliez pas de réexécuter la couverture du code après la mise à jour de votre code. Les résultats de la couverture et la coloration du code ne sont pas automatiquement mis à jour une fois que vous avez modifié votre code ou que vous avez exécuté des tests.

Conseil

À partir de Visual Studio 2022 Update 2, vous pouvez accélérer les résultats des tests de couverture du code en sélectionnant Options outils > Fonctionnalités > de l’environnement > De préversion, puis en sélectionnant Améliorations de l’expérience de couverture du code, puis en redémarrant Visual Studio.

Rapport pour les blocs ou les lignes

La couverture du code est mesurée en blocs. Block fait partie du code avec exactement un point d’entrée et de sortie. Si le flux de contrôle du programme traverse un bloc pendant une série de tests, ce bloc est considéré comme couvert. Le nombre de fois où le bloc est utilisé n’affecte pas le résultat.

Vous pouvez également afficher les résultats pour les lignes en choisissant Ajouter/supprimer des colonnes dans l’en-tête de table. Certains utilisateurs préfèrent un nombre de lignes, car les pourcentages correspondent mieux à la taille des fragments que vous voyez dans le code source. Un long bloc de calcul serait considéré comme un seul bloc même s'il occupe plusieurs lignes.

Conseil

Une ligne de code peut contenir plusieurs blocs de code. Si tel est le cas, et si la série de tests teste tous les blocs de code de la ligne, cette dernière est considérée comme une seule ligne. Si tous les blocs de code de la ligne ne sont pas testés, cette dernière est considérée comme une ligne de code partiellement exécutée.

Filtrer les résultats de la couverture du code

La fenêtre Résultats de la couverture du code affiche généralement le résultat pour l’ensemble de la solution. Les résultats peuvent être filtrés pour afficher les résultats uniquement pour les fichiers qui ont été mis à jour dans la branche actuelle.

  • Pour afficher le rapport de l’ensemble de modifications, sélectionnez l’icône Configurer les vues de couverture du code dans la fenêtre Résultats de la couverture du code . Sélectionnez ensuite Changeset Report dans la liste déroulante Contenu du rapport . Mettez à jour le référentiel actif et la branche de base à comparer pour qu’ils fournissent le rapport de comparaison.

Dans la zone de recherche de la fenêtre Résultats de la couverture du code , il existe plusieurs façons de filtrer le rapport.

  • Pour rechercher par nom (Afficher uniquement ceux qui correspondent à la chaîne de recherche dans la fenêtre), entrez la chaîne de recherche dans la zone de recherche.
  • Pour Filtrer par type , entrez le nom du type dans la zone de recherche.
  • Pour afficher tout, désactivez la zone de recherche.
  • Pour afficher 100 % entièrement couvert, entrez « Couvert (%Lines) » : « 100 » dans la zone de recherche.
  • Pour afficher (>0 % &&< 100 %) partiellement couvert, entrez « Partiellement couvert (%Lines) »:"<## » en remplaçant le ## par le pourcentage couvert.
  • Pour afficher 0 % couvert, entrez « Non couvert (%Lines) »:"0 » dans la zone de recherche.

Gérer les résultats de la couverture du code

La fenêtre Résultats de la couverture du code affiche généralement le résultat de l’exécution la plus récente. Les résultats varient si vous modifiez les données de test ou si vous exécutez uniquement certains de vos tests chaque fois.

La fenêtre Résultats de la couverture du code peut également être utilisée pour afficher les résultats précédents ou les résultats obtenus sur d’autres ordinateurs.

Vous pouvez fusionner les résultats de plusieurs séries, par exemple les résultats de séries qui utilisent des données de test différentes.

  • Pour afficher un ensemble de résultats antérieur, sélectionnez-le dans le menu déroulant. Le menu affiche une liste temporaire qui est supprimée lorsque vous ouvrez une nouvelle solution.

  • Pour afficher les résultats d’une session précédente, choisissez Importer les résultats de la couverture du code, accédez au dossier TestResults dans votre solution, puis importez un fichier .coverage .

    La coloration de la couverture peut être incorrecte si le code source a changé depuis que le fichier .coverage a été généré.

  • Pour afficher les résultats sous forme de texte, choisissez Exporter les résultats de la couverture du code. Cela génère un fichier .coveragexml lisible, que vous pouvez traiter avec d’autres outils ou envoyer facilement par courrier électronique.

  • Pour envoyer des résultats à quelqu’un d’autre, envoyez un fichier .coverage ou un fichier .coveragexml exporté. Cela permet ensuite à la personne d'importer le fichier. Si la personne a la même version de code source, elle a accès à la coloration de couverture.

Fusionner les résultats de différentes exécutions

Dans certains cas, différents blocs de votre code seront utilisés, en fonction des données de test. Par conséquent, vous pouvez souhaiter combiner les résultats des plusieurs séries de tests.

Supposons par exemple que, lorsque vous exécutez un test avec l'entrée « 2 », vous constatez que 50 % d'une fonction spécifique est couvert. Si vous exécutez le test une deuxième fois avec l'entrée « -2 », la deuxième moitié de la fonction apparaît couverte dans la vue avec coloration de la couverture. Vous fusionnez maintenant les résultats des deux séries de tests, et la vue de coloration du rapport et de la couverture montre que 100 % de la fonction a été couverte.

Bouton Utiliser l’icône de fusion dans la fenêtre Couverture du code. Pour ce faire, fusionnez les résultats de la couverture du code. Vous pouvez choisir n'importe quelle combinaison de séries récentes ou de résultats importés. Si vous souhaitez combiner des résultats exportés, vous devez d'abord les importer.

Utilisez Exporter les résultats de la couverture du code pour enregistrer les résultats d’une opération de fusion.

Limitations lors de la fusion

  • Si vous fusionnez des données de couverture à partir de différentes versions du code, les résultats sont affichés séparément, mais ils ne sont pas combinés. Pour obtenir des résultats entièrement combinés, utilisez la même version du code et modifiez uniquement les données de test.

  • Si vous fusionnez un fichier de résultats qui a été exporté puis importé, vous pouvez uniquement consulter les résultats par lignes, et non pas par blocs. Utilisez la commande Ajouter/supprimer des colonnes pour afficher les données des lignes.

  • Si vous fusionnez les résultats des tests d’un projet ASP .NET, les résultats des tests distincts sont affichés, mais ils ne sont pas combinés. Ce comportement s’applique uniquement aux artefacts ASP.NET eux-mêmes : les résultats pour tous les autres assemblys seront combinés.

Exclure des éléments des résultats de la couverture du code

Vous pouvez exclure des éléments spécifiques dans votre code à partir des notes de couverture, par exemple si le code est généré à partir d'un modèle de texte. Ajoutez l'attribut System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverageAttribute aux éléments de code suivants : classe, struct, méthode, propriété, setter ou getter de propriété, événement.

Conseil

Le fait d’exclure une classe n'a pas pour effet d’exclure ses classes dérivées.

Par exemple :

using System.Diagnostics.CodeAnalysis;
...
public class ExampleClass1
{
    [ExcludeFromCodeCoverage]
    void ExampleMethod() {...}

    [ExcludeFromCodeCoverage] // exclude property
    int ExampleProperty1
    { get {...} set{...}}

    int ExampleProperty2
    {
        get
        {
            ...
        }
        [ExcludeFromCodeCoverage] // exclude setter
        set
        {
            ...
        }
    }

}
[ExcludeFromCodeCoverage]
class ExampleClass2 { ... }

Utilisez les macros suivante :

ExcludeFromCodeCoverage(ExclusionName, L"Functionname");

ExcludeSourceFromCodeCoverage(ExclusionName, L"SourceFilePath");

  • NomExclusion est un nom unique.

  • NomFonction est un nom qualifié complet de fonction. Il peut contenir des caractères génériques. Par exemple, pour exclure toutes les fonctions d'une classe, écrivez MyNamespace::MyClass::*

  • SourceFilePath est le chemin local ou UNC d’un fichier .cpp . Il peut contenir des caractères génériques. L'exemple suivant exclut tous les fichiers d'un répertoire particulier : \\MyComputer\Source\UnitTests\*.cpp

  • #include <CodeCoverage\CodeCoverage.h>

  • Placez les appels aux macros d'exclusion dans l'espace de noms global, et non dans un espace de noms ou dans une classe.

  • Vous pouvez placer les exclusions dans le fichier de code de test unitaire ou dans le fichier de code de l'application.

  • Les exclusions doivent être compilées en tant que code non managé (natif), en définissant l'option du compilateur ou à l'aide de #pragma managed(off).

Notes

Pour exclure des fonctions dans le code C++/CLI, appliquez l'attribut [System::Diagnostics::CodeAnalysis::ExcludeFromCodeCoverage] à la fonction. La procédure est la même que pour C#.

Inclure ou exclure des éléments supplémentaires

L’analyse de la couverture du code est effectuée uniquement sur les assemblys chargés et pour lesquels un fichier .pdb est disponible dans le même répertoire que le fichier.dll ou .exe . Par conséquent, dans certaines circonstances, vous pouvez étendre l’ensemble d’assemblys inclus en obtenant des copies des fichiers .pdb appropriés.

Vous pouvez exercer un contrôle accru sur les assemblys et les éléments sélectionnés pour l’analyse de la couverture du code en écrivant un fichier .runsettings . Par exemple, vous pouvez exclure des assemblys de type particulier sans devoir ajouter des attributs à leurs classes. Pour plus d’informations, consultez Personnaliser l’analyse de la couverture du code.

Analyse de la couverture du code dans Azure Pipelines

Lorsque vous archivez votre code, vos tests s’exécutent sur le serveur de builds, avec les tests des autres membres de l’équipe. Il est utile d’analyser la couverture du code dans Azure Pipelines, car cela permet d’obtenir l’image la plus récente et la plus complète possible de la couverture sur la totalité du projet. La couverture du code dans Azure Pipelines inclut également des tests système automatisés et d’autres tests codés que vous n’exécutez généralement pas sur les machines de développement.

Analyser la couverture du code depuis la ligne de commande

Pour exécuter des tests à partir de la ligne de commande, utilisez vstest.console.exe utilitaire. La couverture du code est une option de l’utilitaire vstest.console.exe appelée par /EnableCodeCoverage l’option .

  1. Lancez l’Invite de commandes développeur pour Visual Studio :

    Dans le menu Démarrer de Windows, recherchez Developer Command Prompt for VS et sélectionnez le résultat de l’application associé à votre texte de recherche.

  2. À l'invite de commandes, exécutez la commande suivante :

    vstest.console.exe MyTestAssembly.dll /EnableCodeCoverage
    

    Conseil

    Pour Developer PowerShell, le répertoire de départ de l’interpréteur de commandes est l’emplacement du projet Visual Studio. Remplacez MyTestAssembly.dll par le chemin d’accès et le nom du fichier de test. Pour plus d’informations, consultez Options de ligne de commande VSTest.Console.exe.

Dépanner

Si vous ne voyez pas les résultats de la couverture du code, l’article Résoudre les problèmes de couverture du code peut vous aider.

Voir aussi