Usar cobertura de código para determinar la cantidad de código que se está probandoUsing 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 coloresCode coverage results with coloring

RequisitosRequirements

  • Visual Studio EnterpriseVisual Studio Enterprise

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 Show Code Coverage Coloring Icon(../test/media/codecoverage-showcoloringicon.png "CodeCoverage-ShowColoringIcon")Show Code Coverage Coloring.To see which lines have been run, choose Show Code Coverage Coloring IconShow 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.

Sugerencia

Para obtener resultados precisos:To get accurate results:

  • 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, vea Solución de problemas de cobertura de código.If you don't get the results you expect, see Troubleshooting 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.

Informes en bloques o líneasReporting 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 los resultados de la cobertura de códigoManaging 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 ejecucionesMerging 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.

Utilice icono para el botón Combinar en la ventana de cobertura de códigocombinar resultados de la cobertura de código para ello.Use Icon for Merge button in Code Coverage windowMerge 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ódigoExcluding 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.ExcludeFromCodeCoverage a cualquiera de los elementos de código: clase, struct, método, propiedad, establecedor o captador de propiedad, evento.Add the attribute System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage to any of the following code elements: class, struct, method, property, property setter or getter, event. Observe que excluir una clase no excluye sus clases derivadas.Note that 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++ nativoExcluding 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).

Nota

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 adicionalesIncluding or excluding additional elements

El análisis de cobertura de código se realiza únicamente en los ensamblados que están cargados, para los qué 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 consiguiente, 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, consulte Personalizar el análisis de cobertura de código.For more information, see Customizing Code Coverage Analysis.

Analizar la cobertura de código en el servicio de compilaciónAnalyzing code coverage in the build service

Al insertar en el repositorio el código, las pruebas se ejecutarán en el servidor de compilación, junto con todas las demás pruebas de otros miembros del equipo.When you check in your code, your tests will run on the build server, along with all the other tests from other team members. (Si aún no lo ha configurado, vea Ejecutar pruebas en el proceso de compilación). Es útil analizar la cobertura de código del servicio de compilación, porque proporciona la imagen más actualizada y más completa de cobertura de todo el proyecto.(If you haven't already set this up, see Run tests in your build process.) It's useful to analyze code coverage on the build service, because that gives 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 will also include automated system tests and other coded tests that you don't usually run on the development machines.

  1. En Team Explorer, abra Compilaciones y agregue o modifique una definición de compilación.In Team Explorer, open Builds, and then add or edit a build definition.

  2. En la página Proceso, expanda Pruebas automatizadas, Origen de la prueba, Parámetros de ejecución.On the Process page, expand Automated Tests, Test Source, Run Settings. Establezca Tipo de archivo de parámetros de configuración en Cobertura de código habilitada.Set Type of Run Settings File to Code Coverage Enabled.

    Si tiene más de una definición de origen de la prueba, repita este paso para cada una.If you have more than one Test Source definition, repeat this step for each one.

    • Pero no hay ningún campo denominadoTipo de archivo de parámetros de ejecución.But there is no field named **Type of Run Settings File.

      En Pruebas automatizadas, seleccione Ensamblado de prueba y elija los puntos suspensivos [...] al final de la línea.Under Automated Tests, select Test Assembly and choose the ellipsis button [...] at the end of the line. En el cuadro de diálogo Agregar o editar serie de pruebas, en Ejecutor de pruebas, elija Ejecutor de pruebas de Visual Studio.In the Add/Edit Test Run dialog box, under Test Runner, choose Visual Studio Test Runner.

    Establecer la definición de compilación para cobertura de códigoSetting the build definition for code coverage

    Después de que la compilación se ejecute, los resultados de cobertura de código están asociados a la serie de pruebas y aparecen en el resumen de la compilación.After the build runs, the code coverage results are attached to the test run and appear in the build summary.

Analizar la cobertura del código en una línea de comandosAnalyzing Code Coverage in a 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. Abra el símbolo del sistema de Visual Studio Developer:Launch the Visual Studio Developer Command Prompt:

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

  2. Ejecute el siguiente comando:Run the following command:

    vstest.console.exe MyTestAssembly.dll /EnableCodeCoverage

Solución de problemasTroubleshooting

Si no ve los resultados de la cobertura de código, consulte Solución de problemas de cobertura de código.If you do not see code coverage results, see Troubleshooting Code Coverage.

Recursos externosExternal resources

OrientaciónGuidance

Pruebas de entrega continua con Visual Studio 2012. Capítulo 2: Pruebas unitarias: Prueba del interiorTesting for Continuous Delivery with Visual Studio 2012 - Chapter 2: Unit Testing: Testing the Inside

Vea tambiénSee Also

Personalizar el análisis de cobertura de código Customizing Code Coverage Analysis
Solución de problemas de cobertura de código Troubleshooting Code Coverage
Haga una prueba unitaria de su códigoUnit Test Your Code