Personnaliser l’analyse de la couverture du codeCustomize code coverage analysis

Par défaut, la couverture du code analyse tous les assemblys de la solution chargés pendant les tests unitaires.By default, code coverage analyzes all solution assemblies that are loaded during unit tests. Nous vous recommandons d’utiliser ce comportement par défaut, car il est généralement efficace.We recommend that you use this default behavior, because it works well most of the time. Pour plus d’informations, consultez Utiliser la couverture du code pour déterminer la quantité de code testé.For more information, see Use code coverage to determine how much code is tested.

Pour exclure le code de test des résultats de la couverture du code et inclure uniquement le code d’application, ajoutez l’attribut ExcludeFromCodeCoverageAttribute à votre classe de test.To exclude test code from the code coverage results and only include application code, add the ExcludeFromCodeCoverageAttribute attribute to your test class.

Pour inclure des assemblys qui ne font pas partie de votre solution, obtenez les fichiers .pdb de ces assemblys et copiez-les dans le même dossier que les fichiers .dll de l’assembly.To include assemblies that aren't part of your solution, obtain the .pdb files for these assemblies and copy them into the same folder as the assembly .dll files.

Fichier de paramètres d’exécutionRun settings file

Le fichier de paramètres d’exécution est le fichier de configuration utilisé par les outils de test unitaire.The run settings file is the configuration file used by unit testing tools. Les paramètres avancés de la couverture du code sont spécifiées dans un fichier .runsettings.Advanced code coverage settings are specified in a .runsettings file.

Pour personnaliser la couverture du code, effectuez les étapes suivantes :To customize code coverage, follow these steps:

  1. Ajoutez un fichier de paramètres d’exécution à votre solution.Add a run settings file to your solution. Dans l’Explorateur de solutions, dans le menu contextuel de votre solution, choisissez Ajouter > Nouvel élément, puis sélectionnez Fichier XML.In Solution Explorer, on the shortcut menu of your solution, choose Add > New Item, and select XML File. Enregistrez le fichier sous un nom comme CodeCoverage.runsettings.Save the file with a name such as CodeCoverage.runsettings.

  2. Ajoutez le contenu de l’exemple de fichier à la fin de cet article, puis personnalisez-le selon vos besoins comme décrit dans les sections qui suivent.Add the content from the example file at the end of this article, and then customize it to your needs as described in the sections that follow.

  3. Pour sélectionner le fichier de paramètres d’exécution, dans le menu Test, choisissez Paramètres de test > Sélectionner le fichier de paramètres des tests.To select the run settings file, on the Test menu, choose Test Settings > Select Test Settings File. Pour spécifier un fichier de paramètres d’exécution afin d’exécuter des tests depuis la ligne de commande ou dans un flux de travail de build, consultez Configurer des tests unitaires à l’aide d’un fichier .runsettings.To specify a run settings file for running tests from the command line or in a build workflow, see Configure unit tests by using a .runsettings file.

    Quand vous sélectionnez Analyser la couverture du code, les informations de configuration sont lues à partir du fichier de paramètres d’exécution.When you select Analyze Code Coverage, the configuration information is read from the run settings file.

    Tip

    Les résultats de la couverture du code et la coloration du code précédents ne sont pas automatiquement masqués quand vous exécutez des tests ou que vous mettez à jour votre code.The previous code coverage results and code coloring aren't automatically hidden when you run tests or update your code.

Pour activer ou désactiver les paramètres personnalisés, désélectionnez ou sélectionnez le fichier dans le menu Test > Paramètres de test.To turn the custom settings off and on, deselect or select the file in the Test > Test Settings menu.

Menu Paramètres de test avec le fichier de paramètres de test

Spécifier les chemins de recherche de symbolesSpecify symbol search paths

La couverture du code requiert des fichiers de symboles (fichiers .pdb) pour les assemblys.Code coverage requires symbol files (.pdb files) for assemblies. Pour les assemblys générés par votre solution, les fichiers de symboles sont généralement présents à côté des fichiers binaires, et la couverture du code s’exécute automatiquement.For assemblies built by your solution, symbol files are usually present alongside the binary files and code coverage works automatically. Mais, dans certains cas, vous pouvez inclure les assemblys référencés dans votre analyse de couverture du code.But in some cases, you might want to include referenced assemblies in your code coverage analysis. Dans ce cas, les fichiers .pdb peuvent ne pas être adjacents aux fichiers binaires, mais vous pouvez spécifier le chemin de recherche de symboles dans le fichier .runsettings.In such cases, the .pdb files might not be adjacent to the binaries, but you can specify the symbol search path in the .runsettings file.

<SymbolSearchPaths>
      <Path>\\mybuildshare\builds\ProjectX</Path>
      <!--More paths if required-->
</SymbolSearchPaths>

Note

La résolution des symboles peut prendre du temps, surtout quand vous utilisez un emplacement de fichier distant avec de nombreux assemblys.Symbol resolution can take time, especially when using a remote file location with many assemblies. Ainsi, envisagez de copier les fichiers .pdb au même emplacement local que les fichiers binaires (.dll et .exe).Therefore, consider copying .pdb files to the same local location as the binary (.dll and .exe) files.

Exclure et inclureExclude and include

Vous pouvez exclure les assemblys spécifiés de l'analyse de couverture du code.You can exclude specified assemblies from code coverage analysis. Exemple :For example:

<ModulePaths>
  <Exclude>
   <ModulePath>Fabrikam.Math.UnitTest.dll</ModulePath>
   <!-- Add more ModulePath nodes here. -->
  </Exclude>
</ModulePaths>

Sinon, vous pouvez spécifier les assemblys doivent être inclus.As an alternative, you can specify which assemblies should be included. Cette approche présente l'inconvénient suivant : lorsque vous ajoutez des assemblys à la solution, vous devez penser à les ajouter à la liste :This approach has the drawback that when you add more assemblies to the solution, you have to remember to add them to the list:

<ModulePaths>
  <Include>
   <ModulePath>Fabrikam.Math.dll</ModulePath>
   <!-- Add more ModulePath nodes here. -->
  </Include>
</ModulePaths>

Si Include est vide, le traitement de la couverture du code inclut tous les assemblys qui sont chargés et pour lesquels les fichiers .pdb sont trouvés.If Include is empty, then code coverage processing includes all assemblies that are loaded, and for which .pdb files can be found. La couverture du code n’inclut pas les éléments qui correspondent à une clause dans une liste Exclude.Code coverage does not include items that match a clause in an Exclude list.

Include est traité avant Exclude.Include is processed before Exclude.

Expressions régulièresRegular expressions

Les nœuds inclure et exclure utilisent des expressions régulières.Include and exclude nodes use regular expressions. Pour plus d’informations, consultez Utiliser des expressions régulières dans Visual Studio.For more information, see Use regular expressions in Visual Studio. Les expressions régulières ne sont pas l’équivalent des caractères génériques.Regular expressions aren't the same as wildcards. En particulier :In particular:

  • \* correspond à une chaîne de n’importe quels caractères.\* matches a string of any characters

  • \.\. correspond à un point « . »matches a dot ".")

  • \( \) correspond à des parenthèses « ( ) »\( \) matches parentheses "( )"

  • \\correspond à un séparateur de chemin de fichier « \ »\\ matches a file path delimiter "\"

  • ^ correspond au début de la chaîne^ matches the start of the string

  • $ correspond la fin de la chaîne$ matches the end of the string

Les correspondances ne respectent pas la casse.All matches are case-insensitive.

Exemple :For example:

<ModulePaths>
  <Include>
    <!-- Include all loaded .dll assemblies (but not .exe assemblies): -->
    <ModulePath>.*\.dll$</ModulePath>
  </Include>
  <Exclude>
    <!-- But exclude some assemblies: -->
    <ModulePath>.*\\Fabrikam\.MyTests1\.dll$</ModulePath>
    <!-- Exclude all file paths that contain "Temp": -->
    <ModulePath>.*Temp.*</ModulePath>
  </Exclude>
</ModulePaths>

Warning

S’il existe une erreur dans une expression régulière, telle qu’une séquence d’échappement ou une parenthèse sans correspondance, l’analyse de couverture du code ne fonctionne pas.If there is an error in a regular expression, such as an unescaped or unmatched parenthesis, code coverage analysis won't run.

Autres façons d'inclure ou d'exclure des élémentsOther ways to include or exclude elements

  • ModulePath : correspond aux assemblys spécifiés par le chemin de fichier d’assembly.ModulePath - matches assemblies specified by assembly file path.

  • CompanyName : correspond aux assemblys par l’attribut Société.CompanyName - matches assemblies by the Company attribute.

  • PublicKeyToken : correspond aux assemblys signés par le jeton de clé publique.PublicKeyToken - matches signed assemblies by the public key token.

  • Source : correspond à des éléments par le chemin du fichier source dans lequel ils sont définis.Source - matches elements by the path name of the source file in which they are defined.

  • Attribute : correspond à des éléments auxquels un attribut spécial est attaché.Attribute - matches elements to which a particular attribute is attached. Spécifiez le nom complet de l’attribut et insérez « Attribute » à la fin du nom.Specify the full name of the attribute, and include "Attribute" at the end of the name.

  • Function : correspond à des procédures, des fonctions ou des méthodes par le nom qualifié complet.Function - matches procedures, functions, or methods by fully qualified name. Pour correspondre à un nom de fonction, l’expression régulière doit correspondre au nom complet de la fonction, y compris l’espace de noms, le nom de classe, le nom de méthode et la liste des paramètres.To match a function name, the regular expression must match the fully qualified name of the function, including namespace, class name, method name, and parameter list. Exemple :For example:

    Fabrikam.Math.LocalMath.SquareRoot(double);
    
    Fabrikam::Math::LocalMath::SquareRoot(double)
    
    <Functions>
      <Include>
        <!-- Include methods in the Fabrikam namespace: -->
        <Function>^Fabrikam\..*</Function>
        <!-- Include all methods named EqualTo: -->
        <Function>.*\.EqualTo\(.*</Function>
      </Include>
      <Exclude>
        <!-- Exclude methods in a class or namespace named UnitTest: -->
        <Function>.*\.UnitTest\..*</Function>
      </Exclude>
    </Functions>
    

Fichier d'exemple .runsettingsSample .runsettings file

Copiez ce code et modifiez-le selon vos besoins.Copy this code and edit it to suit your needs.

<?xml version="1.0" encoding="utf-8"?>
<!-- File name extension must be .runsettings -->
<RunSettings>
  <DataCollectionRunSettings>
    <DataCollectors>
      <DataCollector friendlyName="Code Coverage" uri="datacollector://Microsoft/CodeCoverage/2.0" assemblyQualifiedName="Microsoft.VisualStudio.Coverage.DynamicCoverageDataCollector, Microsoft.VisualStudio.TraceCollector, Version=11.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
        <Configuration>
          <CodeCoverage>
<!--
Additional paths to search for .pdb (symbol) files. Symbols must be found for modules to be instrumented.
If .pdb files are in the same folder as the .dll or .exe files, they are automatically found. Otherwise, specify them here.
Note that searching for symbols increases code coverage runtime. So keep this small and local.
-->
<!--
            <SymbolSearchPaths>
                   <Path>C:\Users\User\Documents\Visual Studio 2012\Projects\ProjectX\bin\Debug</Path>
                   <Path>\\mybuildshare\builds\ProjectX</Path>
            </SymbolSearchPaths>
-->

<!--
About include/exclude lists:
Empty "Include" clauses imply all; empty "Exclude" clauses imply none.
Each element in the list is a regular expression (ECMAScript syntax). See http://msdn.microsoft.com/library/2k3te2cs.aspx.
An item must first match at least one entry in the include list to be included.
Included items must then not match any entries in the exclude list to remain included.
-->

            <!-- Match assembly file paths: -->
            <ModulePaths>
              <Include>
                <ModulePath>.*\.dll$</ModulePath>
                <ModulePath>.*\.exe$</ModulePath>
              </Include>
              <Exclude>
                <ModulePath>.*CPPUnitTestFramework.*</ModulePath>
              </Exclude>
            </ModulePaths>

            <!-- Match fully qualified names of functions: -->
            <!-- (Use "\." to delimit namespaces in C# or Visual Basic, "::" in C++.)  -->
            <Functions>
              <Exclude>
                <Function>^Fabrikam\.UnitTest\..*</Function>
                <Function>^std::.*</Function>
                <Function>^ATL::.*</Function>
                <Function>.*::__GetTestMethodInfo.*</Function>
                <Function>^Microsoft::VisualStudio::CppCodeCoverageFramework::.*</Function>
                <Function>^Microsoft::VisualStudio::CppUnitTestFramework::.*</Function>
              </Exclude>
            </Functions>

            <!-- Match attributes on any code element: -->
            <Attributes>
              <Exclude>
                <!-- Don't forget "Attribute" at the end of the name -->
                <Attribute>^System\.Diagnostics\.DebuggerHiddenAttribute$</Attribute>
                <Attribute>^System\.Diagnostics\.DebuggerNonUserCodeAttribute$</Attribute>
                <Attribute>^System\.Runtime\.CompilerServices.CompilerGeneratedAttribute$</Attribute>
                <Attribute>^System\.CodeDom\.Compiler.GeneratedCodeAttribute$</Attribute>
                <Attribute>^System\.Diagnostics\.CodeAnalysis.ExcludeFromCodeCoverageAttribute$</Attribute>
              </Exclude>
            </Attributes>

            <!-- Match the path of the source files in which each method is defined: -->
            <Sources>
              <Exclude>
                <Source>.*\\atlmfc\\.*</Source>
                <Source>.*\\vctools\\.*</Source>
                <Source>.*\\public\\sdk\\.*</Source>
                <Source>.*\\microsoft sdks\\.*</Source>
                <Source>.*\\vc\\include\\.*</Source>
              </Exclude>
            </Sources>

            <!-- Match the company name property in the assembly: -->
            <CompanyNames>
              <Exclude>
                <CompanyName>.*microsoft.*</CompanyName>
              </Exclude>
            </CompanyNames>

            <!-- Match the public key token of a signed assembly: -->
            <PublicKeyTokens>
              <!-- Exclude Visual Studio extensions: -->
              <Exclude>
                <PublicKeyToken>^B77A5C561934E089$</PublicKeyToken>
                <PublicKeyToken>^B03F5F7F11D50A3A$</PublicKeyToken>
                <PublicKeyToken>^31BF3856AD364E35$</PublicKeyToken>
                <PublicKeyToken>^89845DCD8080CC91$</PublicKeyToken>
                <PublicKeyToken>^71E9BCE111E9429C$</PublicKeyToken>
                <PublicKeyToken>^8F50407C4E9E73B6$</PublicKeyToken>
                <PublicKeyToken>^E361AF139669C375$</PublicKeyToken>
              </Exclude>
            </PublicKeyTokens>

            <!-- We recommend you do not change the following values: -->
            <UseVerifiableInstrumentation>True</UseVerifiableInstrumentation>
            <AllowLowIntegrityProcesses>True</AllowLowIntegrityProcesses>
            <CollectFromChildProcesses>True</CollectFromChildProcesses>
            <CollectAspDotNet>False</CollectAspDotNet>

          </CodeCoverage>
        </Configuration>
      </DataCollector>
    </DataCollectors>
  </DataCollectionRunSettings>
</RunSettings>

Voir aussiSee also