使用代码覆盖率确定所测试的代码量

若要确定您的项目代码的比例由代码实际测试例如单元测试,您可以使用 Visual Studio 代码复盖率功能。 若要有效地防范 bug,测试应执行或“中的”编码的一个大比例。

代码复盖率分析可应用于托管 (CLI) 和非托管 (本机) 代码。

当运行测试时,测试方法使用测试资源管理器时,代码复盖率是选项。 结果表显示在每个程序集、选件类和方法运行代码的百分比。 此外,源编辑器显示您要测试的代码。

着色的代码覆盖率结果

要求

  • Visual Studio 旗舰版, Visual Studio 高级专业版

若要分析在单元测试的代码复盖率测试资源管理器

  1. 测试 菜单中,选择 分析代码覆盖率

  2. 若要查看哪些行运行,请选择 “显示代码覆盖率着色”图标显示代码覆盖率着色

    若要修改颜色,或者使用粗体,选择 工具选项环境字体和颜色Show settings for:文本编辑器。 在 显示项目下,调整复盖率项目。

  3. 如果结果显示低复盖率,请检查代码的哪些部分,不会执行,并编写更测试报告它们。 开发团队为大约 80% 代码复盖率通常争取。 在某些情况下,较低的复盖率是可以接受的。 例如,较低的复盖率是可接受的某些代码从一个标准模板的位置生成。

提示

获取准确结果:

  • 确保编译器优化关闭。

    如果使用非托管 (本机) 代码,请使用调试版本。

  • 确保生成每个程序集的符号 (.pdb) 文件。

如果未获得预期结果,请参见 代码覆盖率疑难解答

报告块或行

代码复盖率计数 块。 块是代码部分与正好一项并退出点。 如果程序控制流通过块在测试运行期间,该块计数包括。 块使用的次数对结果的效果。

您也可以显示结果基于行通过选中表标头的 添加/移除列。 如果测试运行中执行过所有代码在所有行代码块,它将计为一行。 如果行包含一些代码块执行,并且不是的数组,这将计为一部分行。

有些用户首选一行进行计数,因为百分比很类似于您在源代码中看到片段的大小。 长块计算计数为单个块,即使它占用很多行。

托管代码复盖率结果

代码复盖率结果"窗口通常显示正在运行的结果的最新。 结果会有所不同,如果更改您的测试数据,或者,如果只运行一些您每次测试。

代码复盖率"窗口还可用于查看以前在其他计算机上获得的结果或结果。

可以将线程的结果运行,例如从运行不同的使用测试数据。

  • 查看以前的设置结果,选择它从下拉菜单。 菜单显示清除的临时列表,当您打开一个新的解决方案时。

  • 查看自上次会话的结果,选择 导入代码复盖率结果,定位到您的解决方案的 TestResults 文件夹,并导入 .coverage 文件。

    复盖率着色可能有误,如果将源代码已更改,则 .coverage 文件生成的。

  • 使结果可读取为文本,选择 导出代码复盖率结果。 这将启动您可以处理与其他工具或方便地发送消息的可读取的 .coveragexml 文件。

  • 将结果发送给其他人,发送一个 .coverage 文件或已导出的 .coveragexml 文件。 它们可以然后导入文件。 如果它们包含源代码的版本相同,它们可以看到复盖率着色。

将不同的结果运行

在某些情况下,多个不同的代码块根据测试数据是使用。 因此,可能要将不同的测试运行的结果。

例如,假设,当您执行与输入“2 "的测试时,您会发现 50% 特定功能包括。 运行测试时与输入的第二个“- 2 "时在复盖率" color "视图显示方 50% 函数中。 现在您将两测试运行的结果和报告和复盖率" color "视图显示 100% 函数中。

使用 “代码覆盖率”窗口中的“合并”按钮的图标合并代码复盖率结果 执行此操作。 可以选择任意组合的最近运行或导入了结果。 如果要合并导出的结果,必须先导入它们。

使用 导出代码复盖率结果 保存合并操作的结果。

Dd537628.collapse_all(zh-cn,VS.110).gif在合并的限制

  • 如果将代码的不同版本的复盖率数据,因此单独显示,但是,它们不会合并。 获取完全合并结果,使用代码的同一生成,仅更改测试数据。

  • 如果将导出了然后导入的一个结果文件,您可以按行只查看结果,而不是块。 使用 添加/移除列 命令显示行数据。

  • 如果将结果从测试 ASP.NET 项目,单独测试的结果显示,但是,不会合并。 这仅适用于 ASP.NET 项目:任何其他程序集的结果合并。

除了从代码复盖率结果的元素

例如,如果代码从文本模板生成,您可能希望从复盖率分数排除在代码中特定元素。 添加属性 System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage 为以下任一代码元素:选件类、结构、方法、属性、属性 setter 或 getter,事件。 请注意,除选件类不排除其派生类。

例如:

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
{ ... }

Dd537628.collapse_all(zh-cn,VS.110).gif但在本机 C++ 代码元素

排除在 C++ 代码的非托管 (本机) 元素:

#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)

使用下面的宏:

-
ExcludeFromCodeCoverage(ExclusionName, L"FunctionName");

ExcludeSourceFromCodeCoverage(ExclusionName, L"SourceFilePath");
  • ExclusionName 是所有唯一的名称。

  • FunctionName 是完全限定的函数的名称。 它可以包含通配符。 例如,排除选件类的所有功能,编写 MyNamespace::MyClass::*

  • SourceFilePath 是本地或 .cpp 文件的 UNC 路径。 它可以包含通配符。 下面的示例排除在特定目录中的所有文件:\\MyComputer\Source\UnitTests\*.cpp

  • #include <CodeCoverage\CodeCoverage.h>

  • 将对在全局命名空间的排除宏,不在任何命名空间或选件类中。

  • 您在单元测试可以将排除测试代码文件或应用程序代码文件。

  • 必须生成中排除为非托管 (本机) 使用 #pragma managed(off),代码,则通过设置编译器选项或。

备注

若要排除在 C++/CLI 的功能代码,请将特性 [System::Diagnostics::CodeAnalysis::ExcludeFromCodeCoverage] 于函数。这与 C# 中。

Dd537628.collapse_all(zh-cn,VS.110).gif包括或排除其他元素

代码复盖率分析在加载的程序集仅执行,并为哪些 .pdb 文件位于的目录和该 .dll 或 .exe 文件同名。 因此在某些情况下,您可以扩展通过获取适当的 .pdb 文件的副本包括的程序集。

可以执行程序集和元素为代码复盖率分析中选择通过编写 .runsettings 文件的多个控件。 例如,您可以排除特定类型的程序集,而无需将特性添加到其选件类。 有关更多信息,请参见自定义代码覆盖率分析

在生成服务期间分析代码复盖率

在签入代码,则在生成服务器上测试将运行,并且任何其他一起从其他团队成员测试。 (如果您尚未设置此功能,请参见 在生成过程中运行测试。)因为它提供复盖率的最新的和最全面的图片在整个项目,分析在生成服务的代码复盖率很有用。 它还将包括自动化的系统测试,并且代码的其他测试在开发计算机上通常不会运行。

  1. 在“团队资源管理器”中,打开**“生成”**,然后添加或编辑生成定义。

  2. 过程 页上,展开 自动测试测试源运行设置。 设置 运行设置文件的类型启用代码复盖率

    如果您有多个测试源定义,请重复的每个此步骤。

    • 但没有名为 运行设置文件的类型的字段。

      自动测试,选择下的 测试程序集 和选择省略号按钮 [...] 在行尾。 在 添加/编辑测试运行 对话框中,在 测试运行程序下,选择 Visual Studio 测试运行程序

为代码覆盖率设置生成定义

在生成运行后,代码复盖率结果附加到测试运行并显示生成摘要。

分析命令行上的代码复盖率

若要从命令行运行测试,请使用 vstest.console.exe。 代码复盖率是此实用工具的选项。 有关更多信息,请参见VSTest.Console.exe 命令行选项

  1. 生成 Visual Studio 开发人员命令提示:

    在窗口 启动 菜单中,选择 所有程序Microsoft Visual Studio中,Visual Studio 工具开发人员命令提示

  2. 运行:

    vstest.console.exe MyTestAssembly.dll /EnableCodeCoverage

疑难解答

如果看不到代码复盖率结果,请参见 代码覆盖率疑难解答

外部资源

Dd537628.collapse_all(zh-cn,VS.110).gif指南

测试使用 Visual Studio 进行附带的 2012 版–第 2 章:单元测试:测试。

请参见

概念

自定义代码覆盖率分析

代码覆盖率疑难解答

使用单元测试验证代码