使用代码覆盖率确定所测试的代码量
若要确定您的项目代码的比例由代码实际测试例如单元测试,您可以使用 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 章:单元测试:测试。