Usar cobertura de código para determinar la cantidad de código que se está probandoUse code coverage to determine how much code is being tested

Para determinar qué proporción de código del proyecto se está probando realmente mediante pruebas codificadas como pruebas unitarias, se puede utilizar la característica de cobertura de código de Visual Studio.To determine what proportion of your project's code is actually being tested by coded tests such as unit tests, you can use the code coverage feature of Visual Studio. Para restringir con eficacia los errores, las pruebas deberían ensayar o “cubrir” una proporción considerable del código.To guard effectively against bugs, your tests should exercise or 'cover' a large proportion of your code.

El análisis de cobertura de código puede aplicarse al código administrado (CLI) y no administrado (nativo).Code coverage analysis can be applied to both managed (CLI) and unmanaged (native) code.

La cobertura de código es una opción al ejecutar métodos de prueba mediante el Explorador de pruebas.Code coverage is an option when you run test methods using Test Explorer. La tabla de salida muestra el porcentaje de código que se ejecuta en cada ensamblado, clase y método.The results table shows the percentage of the code that was run in each assembly, class, and method. Además, el editor de código fuente muestra qué código se ha probado.In addition, the source editor shows you which code has been tested.

Resultados de cobertura de código con colores

RequisitosRequirements

La característica de cobertura de código solo está disponible en la edición Visual Studio Enterprise.The code coverage feature is available only in Visual Studio Enterprise edition.

Para analizar la cobertura de código en pruebas unitarias en el Explorador de pruebasTo analyze code coverage on unit tests in Test Explorer

  1. En el menú Prueba, elija Analizar cobertura de código.On the Test menu, choose Analyze Code Coverage.

  2. Para ver qué líneas se han ejecutado, elija Icono Mostrar colores en cobertura de código Mostrar colores en cobertura de código.To see which lines have been run, choose Show Code Coverage Coloring Icon Show Code Coverage Coloring.

    Para modificar los colores o utilizar la negrita, elija Herramientas > Opciones > Entorno > Fuentes y colores > Mostrar valores para: Editor de texto.To alter the colors, or to use bold face, choose Tools > Options > Environment > Fonts and Colors > Show settings for: Text Editor. En Mostrar los elementos, ajuste los elementos de cobertura.Under Display Items, adjust the Coverage items.

  3. Si los resultados muestran una cobertura baja, investigue qué partes del código no se están ensayando y escriba más pruebas para abarcarlas.If the results show low coverage, investigate which parts of the code are not being exercised, and write more tests to cover them. Los equipos de desarrollo normalmente aspiran a una cobertura de código de un 80 %.Development teams typically aim for about 80% code coverage. En algunas situaciones, una cobertura menor es aceptable.In some situations, lower coverage is acceptable. Por ejemplo, una cobertura menor es aceptable cuando el código se genera a partir de una plantilla estándar.For example, lower coverage is acceptable where some code is generated from a standard template.

Tip

  • Asegúrese de que la optimización del compilador está desactivada.make sure that compiler optimization is turned off
  • Si está trabajando con código no administrado (nativo), utilice una compilación de depuración.if you are working with unmanaged (native) code, use a debug build
  • Asegúrese de que está generando los archivos .pdb (símbolo) para cada ensamblado.make sure that you are generating .pdb (symbol) files for each assembly.

Si no obtiene los resultados esperados, consulte Solución de problemas de cobertura de código.If you don't get the results you expect, see Troubleshoot code coverage. No olvide ejecutar la cobertura de código de nuevo después de actualizar el código.Don't forget to run code coverage again after updating your code. Los resultados de cobertura y color de código no se actualizan automáticamente después de modificar el código o al ejecutar pruebas.Coverage results and code coloring are not automatically updated after you modify your code or when you run tests.

Informar en bloques o líneasReport in blocks or lines

La cobertura de código se cuenta en bloques.Code coverage is counted in blocks. Un bloque es un fragmento de código con un punto de entrada y de salida exactamente.A block is a piece of code with exactly one entry and exit point. Si el flujo de control del programa pasa a través de un bloque durante una serie de pruebas, ese bloque se cuenta como cubierto.If the program's control flow passes through a block during a test run, that block is counted as covered. El número de veces que se utiliza el bloque no tiene ningún efecto en el resultado.The number of times the block is used has no effect on the result.

También se pueden mostrar los resultados en líneas eligiendo Agregar o quitar columnas en el encabezado de tabla.You can also have the results displayed in terms of lines by choosing Add/Remove Columns in the table header. Si la serie de pruebas probó todos los bloques de código en cualquier línea de código, se cuenta como una línea.If the test run exercised all the code blocks in any line of code, it is counted as one line. Siempre que una línea contenga algunos bloques de código que se han ejecutado y otros que no, se cuenta como una línea parcial.Where a line contains some code blocks that were exercised and some that were not, that is counted as a partial line.

Algunos usuarios prefieren un recuento de líneas porque los porcentajes corresponden más al tamaño de los fragmentos que aparece en el código fuente.Some users prefer a count of lines because the percentages correspond more closely to the size of the fragments that you see in the source code. Un bloque grande de cálculo contaría como un único bloque aunque ocupe muchas líneas.A long block of calculation would count as a single block even if it occupies many lines.

Administrar resultados de cobertura de códigoManage code coverage results

La ventana de resultados de cobertura de código normalmente muestra el resultado de la ejecución más reciente.The Code Coverage Results window usually shows the result of the most recent run. Los resultados variarán si se cambian los datos de prueba, o si se ejecutan solo algunas pruebas cada vez.The results will vary if you change your test data, or if you run only some of your tests each time.

La ventana de cobertura de código también se puede utilizar para ver los resultados anteriores o los resultados obtenidos en otros equipos.The code coverage window can also be used to view previous results, or results obtained on other computers.

Se pueden fusionar mediante combinación los resultados de varias ejecuciones, por ejemplo de las ejecuciones que utilizan distintos datos de prueba.You can merge the results of several runs, for example from runs that use different test data.

  • Para ver un conjunto anterior de resultados, selecciónelo en el menú desplegable.To view a previous set of results, select it from the drop-down menu. El menú muestra una lista temporal que se borra cuando se abre una nueva solución.The menu shows a temporary list that is cleared when you open a new solution.

  • Para ver los resultados de una sesión anterior, elija Importar resultados de la cobertura de código, navegue hasta la carpeta TestResults de la solución e importe un archivo .coverage.To view results from a previous session, choose Import Code Coverage Results, navigate to the TestResults folder in your solution, and import a .coverage file.

    El color de cobertura puede ser incorrecto si el código fuente ha cambiado desde que se generó el archivo .coverage.The coverage coloring might be incorrect if the source code has changed since the .coverage file was generated.

  • Para crear resultados legibles como texto, elija Exportar resultados de la cobertura de código.To make results readable as text, choose Export Code Coverage Results. Esto genera un archivo .coveragexml legible que se puede procesar con otras herramientas o enviar por correo fácilmente.This generates a readable .coveragexml file, which you could process with other tools or send easily in mail.

  • Para enviar resultados a otra persona, envíe un archivo .coverage o un archivo exportado .coveragexml.To send results to someone else, send either a .coverage file or an exported .coveragexml file. Después pueden importar el archivo.They can then import the file. Si tienen la misma versión de código fuente, pueden ver el color de cobertura.If they have the same version of the source code, they can see coverage coloring.

Combinar resultados de diferentes ejecucionesMerge results from different runs

En algunas situaciones, se utilizarán diferentes bloques de código, en función de los datos de prueba.In some situations, different blocks in your code will be used depending on the test data. Por consiguiente, es posible que se deseen combinar los resultados de varias series de pruebas.Therefore, you might want to combine the results from different test runs.

Por ejemplo, suponga que al ejecutar una prueba con la entrada “2", se detecta que el 50 % de una determinada función está cubierto.For example, suppose that when you run a test with input "2", you find that 50% of a particular function is covered. Al ejecutar la prueba una segunda vez con la entrada "-2" se observa en la vista de color de destino que el otro 50 % de la función está cubierto.When you run the test a second time with the input "-2", you see in the coverage coloring view that the other 50% of the function is covered. Ahora se fusionan mediante combinación los resultados de las dos series de pruebas y tanto el informe como la vista de color de cobertura muestran que el 100 % de la función se ha analizado.Now you merge the results from the two test runs, and the report and coverage coloring view show that 100% of the function was covered.

Use Icono para el botón Combinar en la ventana de cobertura de código Combinar resultados de la cobertura de código para ello.Use Icon for Merge button in Code Coverage window Merge Code Coverage Results to do this. Se puede elegir cualquier combinación de ejecuciones recientes o de resultados importados.You can choose any combination of recent runs or imported results. Si se desea combinar resultados exportados, se deben importar primero.If you want to combine exported results, you must import them first.

Utilice Exportar resultados de la cobertura de código para guardar los resultados de una operación Merge.Use Export Code Coverage Results to save the results of a merge operation.

Limitaciones de la combinaciónLimitations in merging

  • Si se combinan datos de cobertura de distintas versiones del código, los resultados se muestran por separado, pero no se combinan.If you merge coverage data from different versions of the code, the results are shown separately, but they are not combined. Para obtener resultados combinados totalmente, utilice la misma compilación del código, cambiando únicamente los datos de prueba.To get fully combined results, use the same build of the code, changing only the test data.

  • Si se fusiona mediante combinación un archivo de resultados que se ha exportado y después se ha importado, se pueden ver únicamente los resultados por líneas, no por bloques.If you merge a results file that has been exported and then imported, you can only view the results by lines, not by blocks. Utilice el comando Agregar o quitar columnas para mostrar los datos de línea.Use the Add/Remove Columns command to show the line data.

  • Si se fusionan mediante combinación los resultados de pruebas de un proyecto ASP.NET, los resultados de pruebas separadas se muestran, pero no se combinan.If you merge results from tests of an ASP.NET project, the results for the separate tests are displayed, but not combined. Esto se aplica solo a los artefactos de ASP.NET: los resultados para cualquier otro ensamblado se combinan.This applies only to the ASP.NET artifacts themselves: results for any other assemblies will be combined.

Excluir elementos de los resultados de la cobertura de códigoExclude elements from the code coverage results

Puede que se desee excluir elementos concretos del código de las puntuaciones de cobertura, por ejemplo si el código se genera a partir de una plantilla de texto.You might want to exclude specific elements in your code from the coverage scores, for example if the code is generated from a text template. Agregue el atributo System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverageAttribute a cualquiera de los elementos de código: clase, struct, método, propiedad, establecedor o captador de propiedad, evento.Add the System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverageAttribute attribute to any of the following code elements: class, struct, method, property, property setter or getter, event.

Tip

Excluir una clase no excluye sus clases derivadas.Excluding a class does not exclude its derived classes.

Por ejemplo:For example:

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 { ... }
Imports System.Diagnostics.CodeAnalysis

Class ExampleClass1
    <ExcludeFromCodeCoverage()>
    Public Sub ExampleSub1()
        ...
    End Sub

    ' Exclude property
    < ExcludeFromCodeCoverage()>
    Property ExampleProperty1 As Integer
        ...
    End Property

    ' Exclude setter
    Property ExampleProperty2 As Integer
        Get
            ...
        End Get
        <ExcludeFromCodeCoverage()>
        Set(ByVal value As Integer)
            ...
        End Set
    End Property
End Class

<ExcludeFromCodeCoverage()>
Class ExampleClass2
...
End Class
// A .cpp file compiled as managed (CLI) code.
using namespace System::Diagnostics::CodeAnalysis;
...
public ref class ExampleClass1
{
  public:
    [ExcludeFromCodeCoverage]
    void ExampleFunction1() { ... }

    [ExcludeFromCodeCoverage]
    property int ExampleProperty2 {...}

    property int ExampleProperty2 {
      int get() { ... }
     [ExcludeFromCodeCoverage]
      void set(int value) { ...  }
   }
}

[ExcludeFromCodeCoverage]
public ref class ExampleClass2
{ ... }

Excluir elementos en código de C++ nativoExclude elements in Native C++ code

Para excluir elementos no administrados (nativos) en código de C++:To exclude unmanaged (native) elements in C++ code:

#include <CodeCoverage\CodeCoverage.h>
...

// Exclusions must be compiled as unmanaged (native):
#pragma managed(push, off)

// Exclude a particular function:
ExcludeFromCodeCoverage(Exclusion1, L"MyNamespace::MyClass::MyFunction");

// Exclude all the functions in a particular class:
ExcludeFromCodeCoverage(Exclusion2, L"MyNamespace::MyClass2::*");

// Exclude all the functions generated from a particular template:
ExcludeFromCodeCoverage(Exclusion3, L"*::MyFunction<*>");

// Exclude all the code from a particular .cpp file:
ExcludeSourceFromCodeCoverage(Exclusion4, L"*\\unittest1.cpp");

// After setting exclusions, restore the previous managed/unmanaged state:
#pragma managed(pop)

Use las macros siguientes:Use the following macros:

ExcludeFromCodeCoverage( ExclusionName , L" FunctionName ");ExcludeFromCodeCoverage( ExclusionName , L" FunctionName ");

ExcludeSourceFromCodeCoverage( ExclusionName , L" SourceFilePath ");ExcludeSourceFromCodeCoverage( ExclusionName , L" SourceFilePath ");

  • ExclusionName es cualquier hombre único.ExclusionName is any unique name.

  • FunctionName es un nombre de función completo.FunctionName is a fully qualified function name. Puede contener comodines.It may contain wildcards. Por ejemplo, para excluir todas las funciones de una clase, escriba MyNamespace::MyClass::*For example, to exclude all the functions of a class, write MyNamespace::MyClass::*

  • SourceFilePath es la ruta de acceso UNC o local de un archivo .cpp.SourceFilePath is the local or UNC path of a .cpp file. Puede contener comodines.It may contain wildcards. En el siguiente ejemplo se excluyen todos los archivos de un directorio concreto: \\MyComputer\Source\UnitTests\*.cppThe following example excludes all files in a particular directory: \\MyComputer\Source\UnitTests\*.cpp

  • #include <CodeCoverage\CodeCoverage.h>

  • Coloque llamadas a macros de exclusión en el espacio de nombres global, no dentro de ningún espacio de nombres o clase.Place calls to the exclusion macros in the global namespace, not within any namespace or class.

  • Se pueden colocar las exclusiones en el archivo de código de pruebas unitarias o en el archivo de código de aplicación.You can place the exclusions either in the unit test code file or the application code file.

  • Las exclusiones se deben compilar como código no administrado (nativo), estableciendo la opción del compilador o mediante #pragma managed(off).The exclusions must be compiled as unmanaged (native) code, either by setting the compiler option or by using #pragma managed(off).

Note

Para excluir funciones en el código de C++/CLI, aplique el atributo [System::Diagnostics::CodeAnalysis::ExcludeFromCodeCoverage] a la función.To exclude functions in C++/CLI code, apply the attribute [System::Diagnostics::CodeAnalysis::ExcludeFromCodeCoverage] to the function. Este el mismo que para C#.This is the same as for C#.

Incluir o excluir elementos adicionalesInclude or exclude additional elements

El análisis de cobertura de código se realiza únicamente en los ensamblados que están cargados, para los que está disponible un archivo .pdb en el mismo directorio que el archivo .dll o .exe.Code coverage analysis is performed only on assemblies that are loaded and for which a .pdb file is available in the same directory as the .dll or .exe file. Por tanto, en determinadas circunstancias, se puede extender el conjunto de ensamblados que se incluye obteniendo copias de los archivos .pdb adecuados.Therefore in some circumstances, you can extend the set of assemblies that is included by getting copies of the appropriate .pdb files.

Se puede tener más control sobre qué ensamblados y elementos están seleccionados para el análisis de cobertura de código escribiendo un archivo .runsettings.You can exercise more control over which assemblies and elements are selected for code coverage analysis by writing a .runsettings file. Por ejemplo, se pueden excluir los ensamblados de determinados tipos sin tener que agregar atributos a sus clases.For example, you can exclude assemblies of particular kinds without having to add attributes to their classes. Para obtener más información, vea Personalizar el análisis de cobertura de código.For more information, see Customize code coverage analysis.

Analizar la cobertura de código en Azure PipelinesAnalyze code coverage in Azure Pipelines

Al insertar el código en el repositorio, las pruebas se ejecutan en el servidor de compilación junto con las pruebas de otros miembros del equipo.When you check in your code, your tests run on the build server along with tests from other team members. Es útil analizar la cobertura de código en Azure Pipelines para obtener la imagen más actualizada y completa de cobertura de todo el proyecto.It's useful to analyze code coverage in Azure Pipelines to get the most up-to-date and comprehensive picture of coverage in the whole project. También se incluyen las pruebas del sistema automatizadas y otras pruebas codificadas que no se ejecutan normalmente en los equipos de desarrollo.It also includes automated system tests and other coded tests that you don't usually run on the development machines. Para más información, consulte Ejecutar pruebas unitarias con las compilaciones.For more information, see Run unit tests with your builds.

Analizar la cobertura del código desde una línea de comandosAnalyze code coverage from the command line

Para ejecutar pruebas desde la línea de comandos, utilice vstest.console.exe.To run tests from the command line, use vstest.console.exe. La cobertura de código es una opción de la utilidad vstest.console.exe.Code coverage is an option of the vstest.console.exe utility.

  1. Inicie el Símbolo del sistema para desarrolladores de Visual Studio:Launch the Developer Command Prompt for Visual Studio:

    En el menú Inicio de Windows, elija Visual Studio 2017 > Símbolo del sistema para desarrolladores de VS 2017.In the Windows Start menu, choose Visual Studio 2017 > Developer Command Prompt for VS 2017.

  2. En el símbolo del sistema, ejecute el siguiente comando:At the command prompt, run the following command:

    vstest.console.exe MyTestAssembly.dll /EnableCodeCoverage
    

Para obtener más información, vea Opciones de la línea de comandos para VSTest.Console.exe.For more information, see VSTest.Console.exe command-line options.

Solucionar problemasTroubleshoot

Si no ve los resultados de la cobertura de código, puede encontrar ayuda en el artículo Solución de problemas de cobertura de código.If you do not see code coverage results, the Troubleshoot code coverage article might help you.

Vea tambiénSee also