Personalizar el análisis de cobertura de códigoCustomize code coverage analysis

De forma predeterminada, la cobertura de código analiza todos los ensamblados de la solución que se cargan durante las pruebas unitarias.By default, code coverage analyzes all solution assemblies that are loaded during unit tests. Se recomienda usar este comportamiento de forma predeterminada, porque funciona bien la mayoría de los casos.We recommend that you use this default behavior, because it works well most of the time. Para obtener más información, vea Usar cobertura de código para determinar la cantidad de código que se está probando.For more information, see Use code coverage to determine how much code is tested.

Para excluir el código de prueba de los resultados de cobertura de código e incluir solo código de la aplicación, agregue el atributo ExcludeFromCodeCoverageAttribute a la clase de prueba.To exclude test code from the code coverage results and only include application code, add the ExcludeFromCodeCoverageAttribute attribute to your test class.

Para incluir ensamblados que no forman parte de la solución, obtenga los archivos .pdb para los ensamblados y cópielos en la misma carpeta que los archivos de ensamblado .dll.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.

Archivo de parámetros de ejecuciónRun settings file

Es el archivo de parámetros de ejecución que usan las herramientas de pruebas unitarias.The run settings file is the configuration file used by unit testing tools. La configuración avanzada de la cobertura de código se especifica en un archivo .runsettings.Advanced code coverage settings are specified in a .runsettings file.

Para personalizar la cobertura de código, siga estos pasos:To customize code coverage, follow these steps:

  1. Agregue un archivo de parámetros de ejecución a la solución.Add a run settings file to your solution. En el Explorador de soluciones, en el menú contextual de la solución, seleccione Agregar > Nuevo elemento y seleccione Archivo XML.In Solution Explorer, on the shortcut menu of your solution, choose Add > New Item, and select XML File. Guarde el archivo con un nombre como CodeCoverage.runsettings.Save the file with a name such as CodeCoverage.runsettings.

  2. Agregue el contenido que se muestra en el archivo de ejemplo al final del artículo y después personalícelo de acuerdo con sus necesidades como se describe en las secciones siguientes.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. Para seleccionar el archivo de parámetros de ejecución, en el menú Prueba, elija Configuración de pruebas > Seleccionar archivo de configuración de pruebas.To select the run settings file, on the Test menu, choose Test Settings > Select Test Settings File. Para especificar un archivo de parámetros de ejecución para ejecutar pruebas desde la línea de comandos o en un flujo de trabajo de compilación, vea Configure unit tests by using a .runsettings file (Configurar pruebas unitarias utilizando el archivo .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.

    Al seleccionar Analizar cobertura de código, la información de configuración se lee desde el archivo de parámetros de ejecución.When you select Analyze Code Coverage, the configuration information is read from the run settings file.

    Tip

    Los anteriores resultados de cobertura de y colores de código no se ocultan automáticamente al ejecutar pruebas o actualizar el código.The previous code coverage results and code coloring aren't automatically hidden when you run tests or update your code.

Para desactivar y activar la configuración personalizada, anule la selección o seleccione el archivo en el menú Prueba > Configuración de pruebas.To turn the custom settings off and on, deselect or select the file in the Test > Test Settings menu.

Menú de configuración de pruebas con archivo de configuración personalizado

Especificar rutas de búsqueda de símbolosSpecify symbol search paths

La cobertura de código requiere que haya símbolos (archivos .pdb) para los ensamblados.Code coverage requires symbol files (.pdb files) for assemblies. En el caso de los ensamblados compilados por su solución, los archivos de símbolos normalmente están presentes con los archivos binarios y la cobertura de código funciona automáticamente.For assemblies built by your solution, symbol files are usually present alongside the binary files and code coverage works automatically. Pero, en algunos casos, puede que desee incluir los ensamblados a los que se hace referencia en el análisis de cobertura de código.But in some cases, you might want to include referenced assemblies in your code coverage analysis. En esos casos, los archivos .pdb podrían no estar adyacentes a los archivos binarios pero puede especificar la ruta de búsqueda de símbolos en el archivo .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 resolución de símbolos puede tardar tiempo, especialmente al utilizar una ubicación de archivo remota con muchos ensamblados.Symbol resolution can take time, especially when using a remote file location with many assemblies. Por tanto, considere la posibilidad de copiar los archivos .pdb en la misma ubicación local que los archivos binarios (.dll y .exe).Therefore, consider copying .pdb files to the same local location as the binary (.dll and .exe) files.

Excluir e incluirExclude and include

Puede excluir los ensamblados especificados del análisis de cobertura de código.You can exclude specified assemblies from code coverage analysis. Por ejemplo:For example:

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

Como alternativa, puede especificar qué ensamblados deben incluirse.As an alternative, you can specify which assemblies should be included. Este enfoque tiene la desventaja de que, cuando agrega más ensamblados a la solución, tiene que recordar agregarlos a la lista: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 el campo Incluir está vacío, el procesamiento de cobertura de código incluye todos los ensamblados que se cargan y para los que se pueden encontrar archivos .pdb.If Include is empty, then code coverage processing includes all assemblies that are loaded, and for which .pdb files can be found. La cobertura de código no incluye elementos que coinciden con una cláusula en una lista Excluir.Code coverage does not include items that match a clause in an Exclude list.

Incluir se procesa antes que Excluir.Include is processed before Exclude.

Expresiones regularesRegular expressions

Los nodos de inclusión y exclusión usan expresiones regulares.Include and exclude nodes use regular expressions. Para obtener más información, vea Usar expresiones regulares en Visual Studio.For more information, see Use regular expressions in Visual Studio. Las expresiones regulares no son iguales que los caracteres comodín.Regular expressions aren't the same as wildcards. En concreto:In particular:

  • .\* coincide con una cadena de caracteres cualquiera.\* matches a string of any characters

  • \.\. coincide con un punto (".")matches a dot ".")

  • \( \) coincide con paréntesis "( )"\( \) matches parentheses "( )"

  • \\ coincide con el delimitador de ruta de acceso "\"\\ matches a file path delimiter "\"

  • ^ coincide con el inicio de la cadena^ matches the start of the string

  • $ coincide con el final de la cadena$ matches the end of the string

Ninguna coincidencia distingue entre mayúsculas y minúsculas.All matches are case-insensitive.

Por ejemplo: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

Si hay un error en una expresión regular, como paréntesis sin caracteres de escape o sin su correspondiente pareja, el análisis de cobertura de código no se ejecutará.If there is an error in a regular expression, such as an unescaped or unmatched parenthesis, code coverage analysis won't run.

Otras maneras de incluir o excluir elementosOther ways to include or exclude elements

  • ModulePath: busca coincidencias con los ensamblados especificados por la ruta de acceso del ensamblado.ModulePath - matches assemblies specified by assembly file path.

  • CompanyName: busca coincidencias con los ensamblados por el atributo de Compañía.CompanyName - matches assemblies by the Company attribute.

  • PublicKeyToken: busca coincidencias con los ensamblados firmados por el token de clave pública.PublicKeyToken - matches signed assemblies by the public key token.

  • Source: busca coincidencias con los elementos por el nombre de ruta de acceso del archivo de código fuente en el cual se definen.Source - matches elements by the path name of the source file in which they are defined.

  • Attribute: busca coincidencias con los elementos en los que se asocia un atributo determinado.Attribute - matches elements to which a particular attribute is attached. Especifique el nombre completo del atributo e incluya "Attribute" al final del nombre.Specify the full name of the attribute, and include "Attribute" at the end of the name.

  • Function: busca coincidencias con procedimientos, funciones o métodos por el nombre completo.Function - matches procedures, functions, or methods by fully qualified name. Para buscar coincidencias con un nombre de función, la expresión regular debe coincidir con el nombre completo de la función, incluidos el espacio de nombres, el nombre de clase, el nombre de método y la lista de parámetros.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. Por ejemplo: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>
    

Archivo de ejemplo .runsettingsSample .runsettings file

Copie el código y edítelo para satisfacer sus necesidades.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 https://docs.microsoft.com/visualstudio/ide/using-regular-expressions-in-visual-studio.
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>

Vea tambiénSee also