Résoudre les problèmes de couverture du code

              S’applique à : Visual Studio

L’outil d’analyse de la couverture du code dans Visual Studio collecte des données pour les assemblys natifs et managés ( fichiers.dll ou .exe ). Toutefois, dans certains cas, la fenêtre Résultats de la couverture du code affiche une erreur similaire à « Résultats vides générés : .... ». Cet article vous aide à résoudre les différentes raisons pour lesquelles vous pouvez rencontrer des résultats vides.

Qu’est-ce que vous devriez voir ?

Si vous choisissez une commande Analyser la couverture du code dans le menu Test et si la build et les tests s’exécutent correctement, vous devriez voir une liste de résultats dans la fenêtre Couverture du code . Vous devrez peut-être développer les éléments pour afficher les détails.

Capture d’écran montrant les résultats de la couverture du code avec coloration.

Pour plus d’informations, consultez Utiliser la couverture du code pour déterminer la quantité de code testé.

Raisons possibles de l’absence de résultats ou des anciens résultats

Vous n’utilisez pas la bonne édition de Visual Studio

Vous avez besoin de Visual Studio Enterprise.

Aucun test n’a été exécuté

Analyse

Vérifiez votre fenêtre de sortie. Dans la liste déroulante Afficher la sortie à partir de , choisissez Tests. Vérifiez s’il existe des avertissements ou des erreurs enregistrés.

Explication

L’analyse de la couverture du code est effectuée pendant l’exécution des tests. Il inclut uniquement les assemblys chargés en mémoire lorsque les tests s’exécutent. Si aucun des tests n’est exécuté, il n’y a rien à signaler pour la couverture du code.

Solution

Dans Test Explorer, sélectionnez Exécuter tout pour vérifier que les tests s’exécutent correctement. Corrigez les échecs avant d’utiliser Analyser la couverture du code.

Vous examinez un résultat précédent

Lorsque vous modifiez et réexécutez vos tests, un résultat de couverture du code précédent peut toujours être visible, y compris la coloration du code de cette ancienne exécution. Pour résoudre le problème, procédez comme suit :

  1. Exécutez Analyser la couverture du code.
  2. Vérifiez que vous avez sélectionné le jeu de résultats le plus récent dans la fenêtre Résultats de la couverture du code .

Les fichiers .pdb (symboles) ne sont pas disponibles

Analyse

Ouvrez le dossier cible de compilation (généralement bin\debug) et vérifiez que pour chaque assembly, il existe un fichier .pdb dans le même répertoire que le fichier.dll ou .exe .

Explication

Le moteur de couverture du code exige que chaque assembly ait son fichier .pdb associé accessible pendant la série de tests. S’il n’existe aucun fichier .pdb pour un assembly particulier, l’assembly n’est pas analysé.

Le fichier .pdb doit être généré à partir de la même build que les fichiers.dll ou .exe .

Solution

Assurez-vous que vos paramètres de build génèrent le fichier .pdb .

  • Si les fichiers .pdb ne sont pas mis à jour lors de la génération du projet, ouvrez les propriétés du projet, sélectionnez la page Générer , choisissez Avancé, puis inspectez les informations de débogage.

  • Dans Visual Studio 2022 et versions ultérieures, pour les projets C# ciblant .NET Core ou .NET 5+, ouvrez les propriétés du projet, sélectionnez l’onglet Générer , choisissez Général et inspectez les symboles de débogage.

  • Pour les projets C++, vérifiez que les fichiers .pdb générés ont des informations de débogage complètes. Ouvrez les propriétés du projet et vérifiez queLe débogage> de l’éditeur> de liensGénérer des informations de débogage est défini sur Générer des informations de débogage optimisées pour le partage et la publication (/DEBUG :FULL) .

Si les fichiers .pdb et .dll ou .exe se trouvent à des emplacements différents, copiez le fichier .pdb dans le même répertoire. Il est également possible de configurer le moteur de couverture du code pour rechercher des fichiers .pdb à un autre emplacement. Pour plus d’informations, consultez Personnaliser l’analyse de la couverture du code.

Un binaire instrumenté ou optimisé est utilisé

Analyse

Déterminez si le fichier binaire a subi une forme d’optimisation avancée telle que l’optimisation guidée par profil ou a été instrumenté par un outil de profilage tel que vsinstr.exe ou vsperfmon.exe.

Explication

Si un assembly a déjà été instrumenté ou optimisé par un autre outil de profilage, l’assembly est omis de l’analyse de la couverture du code. L’analyse de la couverture du code ne peut pas être effectuée sur ces assemblys.

Solution

Désactivez l’optimisation et utilisez une nouvelle build.

Le code n’est pas managé (.NET) ou natif (C++)

Analyse

Déterminez si vous exécutez des tests sur du code managé ou C++.

Explication

L’analyse de la couverture du code dans Visual Studio est disponible uniquement sur le code managé et natif (C++). Si vous utilisez des outils tiers, tout ou partie du code peut s’exécuter sur une autre plateforme.

Solution

Aucun disponible.

Le nom du projet inclut « DataCollector »

Les projets qui utilisent DataCollector dans le nom du projet ne sont pas identifiés par la couverture du code.

L’assembly a été installé par NGen

Analyse

Déterminez si l’assembly est chargé à partir du cache d’images native.

Explication

Pour des raisons de performances, les assemblys d’images natives ne sont pas analysés. Pour plus d’informations, consultez Ngen.exe (Générateur d’images natives).

Solution

Utilisez une version MSIL de l’assembly. Ne le traitez pas avec NGen.

Le fichier .runsettings personnalisé présente des problèmes de syntaxe

Analyse

Si vous utilisez un fichier .runsettings personnalisé, il peut contenir une erreur de syntaxe. La couverture du code n’est pas exécutée et la fenêtre de couverture du code ne s’ouvre pas à la fin de la série de tests ou affiche les anciens résultats.

Explication

Vous pouvez exécuter vos tests unitaires avec un fichier .runsettings personnalisé pour configurer les options de couverture du code. Les options vous permettent d’inclure ou d’exclure des fichiers. Pour plus d’informations, consultez Personnaliser l’analyse de la couverture du code.

Solution

Il existe deux types d’erreurs possibles :

  • Erreur XML

    Ouvrez le fichier .runsettings dans l’éditeur XML de Visual Studio. Recherchez les indications d’erreur.

  • Erreur d’expression régulière

    Chaque chaîne du fichier est une expression régulière. Examinez chacune d’elles pour rechercher les erreurs, et recherchez en particulier :

    • Parenthèses incompatibles (...) ou parenthèses sans séquence d’échappement \(...\). Si vous souhaitez faire correspondre une parenthèse dans la chaîne de recherche, vous devez la placer dans une séquence d’échappement. Par exemple, pour faire correspondre une fonction, utilisez : .*MyFunction\(double\)
    • Astérisque ou plus au début d’une expression. Pour faire correspondre une chaîne de caractères, utilisez un point suivi d’un astérisque : .*

Fichier .runsettings personnalisé avec exclusions incorrectes

Analyse

Si vous utilisez un fichier .runsettings personnalisé, assurez-vous qu’il inclut votre assembly.

Explication

Vous pouvez exécuter vos tests unitaires avec un fichier .runsettings personnalisé pour configurer les options de couverture du code. Les options vous permettent d’inclure ou d’exclure des fichiers. Pour plus d’informations, consultez Personnaliser l’analyse de la couverture du code.

Solution

Supprimez tous les Include nœuds du fichier .runsettings , puis supprimez tous les Exclude nœuds. Si cela résout le problème, remettez-les en phases.

Assurez-vous que le nœud DataCollectors spécifie la couverture du code. Comparez-le à l’exemple dans Personnaliser l’analyse de la couverture du code.

Certains codes sont toujours affichés comme non couverts

Le code d’initialisation dans les DLL natives est exécuté avant l’instrumentation

Analyse

Dans le code natif lié statiquement, une partie de la fonction d’initialisation DllMain et du code qu’elle appelle est parfois affichée comme non couverte, même si le code a été exécuté.

Explication

L’outil de couverture du code fonctionne en insérant l’instrumentation dans un assembly juste avant que l’application ne commence à s’exécuter. Dans tout assembly chargé au préalable, le code d’initialisation dans DllMain s’exécute dès le chargement de l’assembly et avant l’exécution de l’application. Ce code semble ne pas être couvert, ce qui s’applique généralement aux assemblys chargés statiquement.

Solution

Aucun.

References