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

Par défaut, l’outil Couverture du code de Visual Studio Code analyse tous les assemblys de la solution chargés pendant les tests unitaires.By default, the Visual Studio Code Coverage tool analyzes all solution assemblies that are loaded during unit tests. Nous vous recommandons de conserver ce paramètre par défaut, car il est généralement efficace.We recommend that you retain this default, because it works well most of the time. Pour plus d’informations, consultez Utilisation de la couverture du code pour déterminer la quantité de code testé.For more information, see Using Code Coverage to Determine How Much Code is being Tested.

Avant de personnaliser le comportement de la couverture du code, vérifiez les autres possibilités :Before customizing the code coverage behavior, consider some alternatives:

  • Je souhaite exclure le code de test des résultats de la couverture du code et inclure uniquement le code d’application.I want to exclude the test code from the code coverage results and include only the application code.

    Ajoutez ExcludeFromCodeCoverage Attribute à votre classe de test.Add the ExcludeFromCodeCoverage Attribute to your test class.

  • Je souhaite inclure des assemblys qui ne font pas partie de ma solution.I want to include assemblies that are not part of my solution.

    Obtenez les fichiers .pdb de ces assemblys et copiez-les dans le même dossier que les fichiers .dll de l’assembly.Obtain the .pdb files for these assemblies and copy them into the same folder as the assembly .dll files.

Pour personnaliser le comportement de la couverture du code, copiez l’exemple indiqué à la fin de cette rubrique et ajoutez-le à votre solution avec l’extension de fichier .runsettings.To customize the code coverage behavior, copy the sample at the end of this topic and add it to your solution, using the file extension .runsettings. Modifiez-le selon vos besoins, puis, dans le menu Test, choisissez Paramètres de test, Sélectionner le fichier de paramètres des tests.Edit it to your own needs, and then on the Test menu, choose Test Settings, Select Test Settings file. La suite de cet article décrit cette procédure plus en détails.The remainder of this article describes this procedure in more detail.

Fichier de paramètres d’exécutionThe run settings file

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. Le fichier des 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. Nous vous recommandons de copier l’exemple indiqué à la fin de cette rubrique et de le modifier selon vos besoins.We recommend you copy the sample at the end of this topic and edit it to suit your own needs.

Pour personnaliser la couverture du code, ajoutez un fichier de paramètres d’exécution à votre solution :To customize code coverage, add a run settings file to your solution:

  1. Ajoutez un fichier .xml comme élément de solution avec l’extension .runsettings :Add an .xml file as a solution item with the extension .runsettings:

    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 avec un nom se terminant par .runsettings, comme CodeCoverage.runsettings.Save the file with a name ending such as CodeCoverage.runsettings.

  2. Ajoutez le contenu de l’exemple à 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 at the end of this article, and then customize it to your needs as described in the sections that follow.

  3. Dans le menu Test, choisissez Paramètres de test > Sélectionner le fichier de paramètres des tests et sélectionnez le fichier.On the Test menu, choose Test Settings > Select Test Settings File and select the file.

  4. Désormais, quand vous exécutez Analyser la couverture du code, le fichier .runsettings contrôle son comportement.Now when you run Analyze Code Coverage, the run settings file will control its behavior. N’oubliez pas que vous devez réexécuter la couverture du code.Don't forget that you must run code coverage again. Les résultats de la couverture 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 coverage results and code coloring aren't automatically hidden when you run tests or update your code.

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

Vous pouvez configurer d’autres aspects des tests unitaires dans le même fichier .runsettings.Other aspects of unit tests can be configured in the same run settings file. Pour plus d’informations, consultez Tests unitaires sur votre code.For more information, see Unit Test Your Code.

Spécification des chemins de recherche de symbolesSpecifying symbol search paths

La couverture du code requiert que des symboles (.pdb) pour les assemblys soient présents.Code coverage requires symbols (.pdb files) for assemblies to be present. 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>

Avertissement

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. Par conséquent, envisagez de copier les fichiers distants .pdb au même emplacement local que les fichiers binaires (.dll et .exe).Therefore, consider copying remote .pdb files to the same local location as the binary (.dll and .exe) files.

Exclusion et inclusionExcluding and including

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 Utilisation d’expressions régulières dans Visual Studio.For more information, see Using Regular Expressions in Visual Studio. Les expressions régulières ne sont pas l'équivalent des caractères génériques.Regular expressions are not 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>

Avertissement

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 fonctionnera pas.If there is an error in a regular expression, such as an unescaped and unmatched parenthesis, then code coverage analysis will not run.

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

Consultez la section d’exemples à la fin de cette rubrique pour obtenir des exemples.See the sample at the end of this topic for examples.

  • ModulePath : assemblys spécifiés par le chemin de fichier d’assembly.ModulePath - 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. Par exemple, pour correspondre à tous les composants et extensions Visual Studio, utilisez <PublicKeyToken>^B03F5F7F11D50A3A$</PublicKeyToken>.For example to match all Visual Studio components and extensions, use <PublicKeyToken>^B03F5F7F11D50A3A$</PublicKeyToken>.

  • 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, en insérant « Attribute » à la fin du nom.Specify the full name of the attribute, including "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.

Correspondance avec un nom de fonctionMatching a function name

Votre 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.Your regular expression must match the fully qualified name of the function, including namespace, class name, method name, and parameter list. Par exemple :For example,

  • C# ou Visual Basic : Fabrikam.Math.LocalMath.SquareRoot(double)C# or Visual Basic: Fabrikam.Math.LocalMath.SquareRoot(double)

  • C++ : Fabrikam::Math::LocalMath::SquareRoot(double)C++: 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>

Comment spécifier des fichiers de paramètres d’exécution pendant l’exécution des testsHow to specify run settings files while running tests

Pour personnaliser un fichier de paramètres d’exécution dans des tests Visual StudioTo customize run settings in Visual Studio tests

Choisissez Test > Paramètres de test > Sélectionner le fichier de paramètres des tests et sélectionnez le fichier .runsettings.Choose Test > Test Settings > Select Test Settings File and select the .runsettings file. Le fichier apparaît dans le menu Paramètres de test. Vous pouvez le sélectionner ou l'annuler.The file appears on the Test Settings menu, and you can select or cancel it. Quand il est sélectionné, votre fichier de paramètres d’exécution s’applique quand vous utilisez Analyser la couverture du code.While selected, your run settings file applies whenever you use Analyze Code Coverage.

Pour personnaliser les paramètres d’exécution d’un test en ligne de commandeTo customize run settings in a command-line test

Pour exécuter des tests à partir de la ligne de commande, utilisez vstest.console.exe.To run tests from the command line, use vstest.console.exe. Le fichier de paramètres est un paramètre de cet utilitaire.The settings file is a parameter of this utility.

  1. Lancez l'invite de commandes développeur Visual Studio :Launch the Visual Studio Developer Command Prompt:

    Dans le menu Démarrer de Windows, choisissez Visual Studio 2017 > Invite de commandes développeur pour VS 2017.On the Windows Start menu, choose Visual Studio 2017 > Developer Command Prompt for VS 2017.

  2. Exécutez la commande suivante :Run the following command:

    vstest.console.exe MyTestAssembly.dll /EnableCodeCoverage /Settings:CodeCoverage.runsettings

Pour personnaliser des paramètres d'exécution dans une définition de buildTo customize run settings in a build definition

Vous pouvez obtenir des données de couverture du code depuis une build d’équipe.You can get code coverage data from a team build.

Spécification des paramètres d’exécution dans une définition de build

  1. Vérifiez que votre fichier de paramètres d’exécution est archivé.Make sure your run settings file is checked in.

  2. Dans Team Explorer, ouvrez Builds, puis ajoutez ou modifiez une définition de build.In Team Explorer, open Builds, and then add or edit a build definition.

  3. Dans la page Processus, développez Tests automatisés > Source de test > Paramètres d’exécution.On the Process page, expand Automated Tests > Test Source > Run Settings. Sélectionnez le fichier .runsettings.Select the .runsettings file.

    Conseil

    Si Assembly de test s’affiche à la place de Source de test, et que vous pouvez seulement sélectionner des fichiers .testsettings, définissez la propriété Test Runner comme suit.If Test Assembly appears instead of Test Source, and you can only select .testsettings files, set the Test Runner property as follows. Sous Tests automatisés, sélectionnez Assembly de test, puis choisissez […] à la fin de la ligne.Under Automated Tests, select Test Assembly, and then choose [...] at the end of the line. Dans la boîte de dialogue Ajouter/Modifier une série de tests, définissez Test Runner sur Visual Studio Test Runner.In the Add/Edit Test Run dialog box, set Test Runner to Visual Studio Test Runner.

Les résultats sont visibles dans la section de résumé du rapport de build.The results are visible in the summary section of the build report.

Exemple de fichier runsettingsSample .runsettings file

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

(Pour connaître d’autres utilisations du fichier de paramètres d’exécution, consultez Configurer des tests unitaires à l’aide d’un fichier de paramètres d’exécution.)(For other uses of the run settings file, see Configure unit tests by using a run settings file.)

<?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