使用代码覆盖率确定所测试的代码量
若要确定您的项目代码的比例由代码实际测试例如单元测试,您可以使用 Visual Studio 代码复盖率功能。 若要有效地防范 bug,测试应执行或“中的”编码的一个大比例。
代码复盖率分析可应用于托管 (CLI) 和非托管 (本机) 代码。
当运行测试时,测试方法使用测试资源管理器时,代码复盖率是选项。 结果表显示在每个程序集、选件类和方法运行代码的百分比。 此外,源编辑器显示您要测试的代码。
要求
- Visual Studio 旗舰版, Visual Studio 高级专业版
若要分析在单元测试的代码复盖率测试资源管理器
在 测试 菜单中,选择 分析代码覆盖率。
若要查看哪些行运行,请选择 显示代码覆盖率着色。
若要修改颜色,或者使用粗体,选择 工具,选项,环境,字体和颜色,Show settings for:文本编辑器。 在 显示项目下,调整复盖率项目。
如果结果显示低复盖率,请检查代码的哪些部分,不会执行,并编写更测试报告它们。 开发团队为大约 80% 代码复盖率通常争取。 在某些情况下,较低的复盖率是可以接受的。 例如,较低的复盖率是可接受的某些代码从一个标准模板的位置生成。
报告块或行
代码复盖率计数 块。 块是代码部分与正好一项并退出点。 如果程序控制流通过块在测试运行期间,该块计数包括。 块使用的次数对结果的效果。
您也可以显示结果基于行通过选中表标头的 添加/移除列。 如果测试运行中执行过所有代码在所有行代码块,它将计为一行。 如果行包含一些代码块执行,并且不是的数组,这将计为一部分行。
有些用户首选一行进行计数,因为百分比很类似于您在源代码中看到片段的大小。 长块计算计数为单个块,即使它占用很多行。
托管代码复盖率结果
代码复盖率结果"窗口通常显示正在运行的结果的最新。 结果会有所不同,如果更改您的测试数据,或者,如果只运行一些您每次测试。
代码复盖率"窗口还可用于查看以前在其他计算机上获得的结果或结果。
可以将线程的结果运行,例如从运行不同的使用测试数据。
查看以前的设置结果,选择它从下拉菜单。 菜单显示清除的临时列表,当您打开一个新的解决方案时。
查看自上次会话的结果,选择 导入代码复盖率结果,定位到您的解决方案的 TestResults 文件夹,并导入 .coverage 文件。
复盖率着色可能有误,如果将源代码已更改,则 .coverage 文件生成的。
使结果可读取为文本,选择 导出代码复盖率结果。 这将启动您可以处理与其他工具或方便地发送消息的可读取的 .coveragexml 文件。
将结果发送给其他人,发送一个 .coverage 文件或已导出的 .coveragexml 文件。 它们可以然后导入文件。 如果它们包含源代码的版本相同,它们可以看到复盖率着色。
将不同的结果运行
在某些情况下,多个不同的代码块根据测试数据是使用。 因此,可能要将不同的测试运行的结果。
例如,假设,当您执行与输入“2 "的测试时,您会发现 50% 特定功能包括。 运行测试时与输入的第二个“- 2 "时在复盖率" color "视图显示方 50% 函数中。 现在您将两测试运行的结果和报告和复盖率" color "视图显示 100% 函数中。
使用 合并代码复盖率结果 执行此操作。 可以选择任意组合的最近运行或导入了结果。 如果要合并导出的结果,必须先导入它们。
使用 导出代码复盖率结果 保存合并操作的结果。
在合并的限制
如果将代码的不同版本的复盖率数据,因此单独显示,但是,它们不会合并。 获取完全合并结果,使用代码的同一生成,仅更改测试数据。
如果将导出了然后导入的一个结果文件,您可以按行只查看结果,而不是块。 使用 添加/移除列 命令显示行数据。
如果将结果从测试 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
{ ... }
但在本机 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# 中。
包括或排除其他元素
代码复盖率分析在加载的程序集仅执行,并为哪些 .pdb 文件位于的目录和该 .dll 或 .exe 文件同名。 因此在某些情况下,您可以扩展通过获取适当的 .pdb 文件的副本包括的程序集。
可以执行程序集和元素为代码复盖率分析中选择通过编写 .runsettings 文件的多个控件。 例如,您可以排除特定类型的程序集,而无需将特性添加到其选件类。 有关更多信息,请参见自定义代码覆盖率分析。
在生成服务期间分析代码复盖率
在签入代码,则在生成服务器上测试将运行,并且任何其他一起从其他团队成员测试。 (如果您尚未设置此功能,请参见 在生成过程中运行测试。)因为它提供复盖率的最新的和最全面的图片在整个项目,分析在生成服务的代码复盖率很有用。 它还将包括自动化的系统测试,并且代码的其他测试在开发计算机上通常不会运行。
在“团队资源管理器”中,打开**“生成”**,然后添加或编辑生成定义。
在 过程 页上,展开 自动测试,测试源,运行设置。 设置 运行设置文件的类型 到 启用代码复盖率。
如果您有多个测试源定义,请重复的每个此步骤。
但没有名为 运行设置文件的类型的字段。
在 自动测试,选择下的 测试程序集 和选择省略号按钮 [...] 在行尾。 在 添加/编辑测试运行 对话框中,在 测试运行程序下,选择 Visual Studio 测试运行程序。
在生成运行后,代码复盖率结果附加到测试运行并显示生成摘要。
分析命令行上的代码复盖率
若要从命令行运行测试,请使用 vstest.console.exe。 代码复盖率是此实用工具的选项。 有关更多信息,请参见VSTest.Console.exe 命令行选项。
生成 Visual Studio 开发人员命令提示:
在窗口 启动 菜单中,选择 所有程序,Microsoft Visual Studio中,Visual Studio 工具,开发人员命令提示。
运行:
vstest.console.exe MyTestAssembly.dll /EnableCodeCoverage
疑难解答
如果看不到代码复盖率结果,请参见 代码覆盖率疑难解答。
外部资源
指南
测试使用 Visual Studio 进行附带的 2012 版–第 2 章:单元测试:测试。