使用测试资源管理器运行单元测试

使用测试资源管理器从 Visual Studio 或第三方单元测试项目运行单元测试。 在测试资源管理器中,可以将测试分组为类别、筛选测试列表,以及创建、保存和运行测试播放列表。 还可以使用测试资源管理器 调试单元测试,并在 Visual Studio Enterprise 中 分析代码覆盖率

测试资源管理器可以从解决方案中的多个测试项目以及属于生产代码项目的测试类运行测试。 测试项目可以使用各种单元测试框架。 为 .NET 编写受测代码时,无论目标代码的语言如何,都可以使用任何同样面向 .NET 的语言编写测试项目。 必须使用C++单元测试框架来测试本机 C 和C++代码项目。

生成测试项目

如果 Visual Studio 解决方案中尚未设置测试项目,必须先创建并生成测试项目。 使用以下资源:

Visual Studio 包括托管代码和本机代码的Microsoft单元测试框架。 但是,测试资源管理器还可以运行已实现测试资源管理器适配器的任何单元测试框架。 有关安装第三方单元测试框架的详细信息,请参阅 安装单元测试框架

在测试资源管理器中运行测试

生成测试项目时,测试将显示在测试资源管理器中。 如果测试资源管理器不可见,请在 Visual Studio 菜单上选择 测试,然后选择 测试资源管理器(或选择 Ctrl+E、T)。

显示测试资源管理器中的测试列表的屏幕截图。

显示测试资源管理器中的测试列表的屏幕截图。

运行、写入和重新运行测试时,测试资源管理器会在默认分组中显示 Project命名空间的结果。 可以更改测试资源管理器对测试进行分组的方式。

可以从 测试资源管理器 工具栏执行查找、组织和运行测试的大部分工作。

屏幕截图,描述用于从测试资源管理器工具栏运行测试的图标。

屏幕截图,描述用于从测试资源管理器工具栏运行测试的图标。

运行测试

选择以下选项之一以运行测试:

  • 若要在解决方案中运行所有测试,请选择“运行全部”图标(或选择 Ctrl+R, V)。

  • 若要运行默认组中的所有测试,请选择 运行 图标,然后选择菜单上的组。

  • 若要运行单个测试,请选择一个或多个测试,右键单击窗格中的某个位置,然后选择 运行所选测试(或选择 Ctrl+R、T)。

    如果各个测试没有阻止其按任意顺序运行的依赖项,请在工具栏的设置菜单上启用并行测试执行。 此操作可以减少运行所有测试的时间。

备注

若要配置用于运行单元测试的目标平台(进程体系结构),请参阅 配置单元测试的进程体系结构。

每次构建后运行测试

若要在每个本地生成后运行单元测试,请在“测试资源管理器”工具栏中选择设置图标,然后选择“生成后运行测试”

查看测试结果

运行、写入和重新运行测试时,测试资源管理器会在 失败的测试组中显示结果,通过的测试跳过的测试,以及 未运行测试。 测试资源管理器底部或一侧的详细信息窗格显示测试运行摘要。

查看测试详细信息

若要查看单个测试的详细信息,请选择测试。

测试执行详细信息的屏幕截图。

测试执行详细信息的屏幕截图。

测试详细信息窗格显示:

  • 源文件名称和测试方法的行号。

  • 测试的状态。

  • 测试方法运行所花费的时间。

如果测试失败,详细信息窗格还会显示:

  • 单元测试框架返回的针对测试的消息。

  • 测试失败时的堆栈跟踪。

查看测试方法的源代码

若要在 Visual Studio 编辑器中显示测试方法的源代码,请右键单击该测试,然后选择 打开测试(或选择 F12 键)。

对测试列表进行分组和筛选

在测试资源管理器中,可以将测试分组为预定义类别。 大多数在测试资源管理器中运行的单元测试框架都允许定义自己的类别和类别/值对来对测试进行分组。 还可以根据测试属性匹配字符串来筛选测试列表。

在测试列表中对测试进行分组

使用测试资源管理器可将测试分组到层次结构中。 默认层次结构分组 Project命名空间,然后 。 若要更改测试的组织方式,请选择“ 分组”按钮 测试资源管理器分组按钮,然后选择新的分组标准。

屏幕截图,显示“测试资源管理器”中按类别对测试进行分组的选择。

可以通过按喜欢的顺序选择“分组依据”选项来定义自己的层次结构级别(例如,依次按“状态”和“类”进行分组)

测试资源管理器的屏幕截图,其中一个窗格显示了测试层次结构,另一个窗格显示了“分组依据”菜单,其中选择了“类”和“状态”选项。

使用测试资源管理器可将测试分组到层次结构中。 默认层次结构分组 Project命名空间,然后 。 若要更改测试的组织方式,请选择“分组依据”按钮 测试资源管理器的分组按钮,然后选择新的分组条件

屏幕截图,显示“测试资源管理器”中按类别对测试进行分组的选择。

可以通过按喜欢的顺序选择“分组依据”选项来定义自己的层次结构级别(例如,依次按“状态”和“类”进行分组)

测试资源管理器的屏幕截图,其中一个窗格显示了测试层次结构,另一个窗格显示了“分组依据”菜单,其中选择了“类”和“状态”选项。

测试资源管理器组

描述
持续时间 按执行时间对测试进行分组:快速中等慢速
状态 按执行结果对测试进行分组:失败的测试、跳过的测试、通过的测试和未运行的测试
目标框架 按其项目所面向的框架对测试进行分组。
命名空间 按包含命名空间对测试进行分组。
项目 按包含项目对测试进行分组。
按包含类对测试进行分组。

性状

特征通常是类别名称/值对,但它也可以是单个类别。 可以将特征分配给单元测试框架标识为测试方法的方法。

单元测试框架可以定义特征类别。 可以将值添加到特征类别,以定义自己的类别名称/值对。 单元测试框架定义用于指定特征类别和值的语法。

托管代码的 Microsoft 单元测试框架中的特征

在托管代码的Microsoft单元测试框架中,可以在 TestPropertyAttribute 属性中定义特征名称/值对。 测试框架还包含以下预定义特征:

特征 描述
OwnerAttribute Owner 类别由单元测试框架定义,并要求你提供所有者的字符串值。
PriorityAttribute Priority 类别由单元测试框架定义,并要求你提供优先级的整数值。
TestCategoryAttribute 使用 TestCategory 属性可以指定单元测试的类别。
TestPropertyAttribute 使用 TestProperty 属性可以定义特征类别/值对。

适用于 C++ 的 Microsoft 单元测试框架中的特征

参见 在 Visual Studio中使用用于 C++ 的 Microsoft 单元测试框架。

创建自定义播放列表

可以创建并保存要作为组运行或查看的测试列表。 选择播放列表时,列表中的测试将显示在新的“测试资源管理器”选项卡上。可以将测试添加到多个播放列表。

创建播放列表:

  1. 在测试资源管理器中选择一个或多个测试。
  2. 右键单击窗格上的某个位置,指向“添加到播放列表”,然后选择 “新建播放列表”

显示用于创建播放列表的选择的屏幕截图。

播放列表将在新的“测试资源管理器”选项卡上打开。可以一次使用此播放列表,然后放弃它。 也可以选择播放列表窗口工具栏上的 “保存”按钮,然后选择用于保存播放列表的名称和位置。

显示在单独的“测试资源管理器”选项卡上打开的播放列表的屏幕截图。

打开播放列表:

  1. 在 Visual Studio 工具栏上,选择播放列表图标。
  2. 在菜单上,选择以前保存的播放列表文件。

若要编辑播放列表,请使用以下选项之一:

  • 右键单击任何测试,然后使用菜单命令在播放列表中添加或删除它。

  • 在工具栏上,选择编辑播放列表 按钮。 测试旁边显示的复选框显示播放列表中包含和排除的测试。 根据需要编辑组。 此功能在 Visual Studio 2019 版本 16.7 中启动。

    显示工具栏上的“编辑播放列表”按钮的屏幕截图。

还可以选中或清除层次结构中父组的复选框。 此操作会创建一个动态播放列表,该播放列表将基于该组中的测试实时更新。

例如,如果在类旁边选中一个复选框,则从该类添加的任何测试都将成为此播放列表的一部分。 如果从该类中删除测试,则会将其从播放列表中删除。

可以通过工具栏上的 “保存”按钮保存播放列表,然后打开磁盘上创建的 .playlist XML 文件来了解有关规则的详细信息。 此文件列出了构成播放列表的所有规则和单个测试。

显示播放列表 XML 文件内容的屏幕截图。

如果要为特征创建播放列表,请使用 MSTest 框架的以下格式:

<Playlist Version="2.0">
  <Rule Name="Includes" Match="Any">
    <Property Name="Trait" Value="SchemaUpdateBasic" />
  </Rule>
</Playlist>

对 xUnit 框架使用以下格式。 请确保 TestCategory 名称和 [Value] 值之间有一个空格。

<Playlist Version="2.0">
  <Rule Name="Includes" Match="Any">
    <Rule Match="All">
      <Property Name="Solution" />
        <Rule Match="Any">
            <Property Name="Trait" Value="TestCategory [Value]" />
        </Rule>
    </Rule>
  </Rule>
</Playlist>

可以创建并保存要作为组运行或查看的测试列表。 选择播放列表时,列表中的测试将显示在新的“测试资源管理器”选项卡上。可以将测试添加到多个播放列表。

创建播放列表:

  1. 在测试资源管理器中选择一个或多个测试。
  2. 右键单击窗格上的某个位置,指向“添加到播放列表”,然后选择 “新建播放列表”

显示用于创建播放列表的选择的屏幕截图。

播放列表将在新的“测试资源管理器”选项卡上打开。可以一次使用此播放列表,然后放弃它。 也可以选择播放列表窗口工具栏上的 “保存”按钮,然后选择用于保存播放列表的名称和位置。

显示单独测试资源管理器选项卡上打开的播放列表的屏幕截图。

打开播放列表:

  1. 在 Visual Studio 工具栏上,选择播放列表图标。
  2. 在菜单上,选择以前保存的播放列表文件。

若要编辑播放列表,请使用以下选项之一:

  • 右键单击任何测试,然后使用菜单命令在播放列表中添加或删除它。

  • 在工具栏上,选择“编辑播放列表”按钮。 测试旁边显示的复选框显示播放列表中包含和排除的测试。 根据需要编辑组。 此功能在 Visual Studio 2019 版本 16.7 中启动。

    显示工具栏上的“编辑播放列表”按钮的屏幕截图。

还可以选中或清除层次结构中父组的复选框。 此操作将创建一个动态播放列表,始终根据该组中的测试自动更新。

例如,如果在类旁边选中一个复选框,则从该类添加的任何测试都将成为此播放列表的一部分。 如果从该类中删除测试,则会将其从播放列表中删除。

可以通过工具栏上的 “保存”按钮保存播放列表,然后打开磁盘上创建的 .playlist XML 文件来了解有关规则的详细信息。 此文件列出了构成播放列表的所有规则和单个测试。

显示播放列表 XML 文件内容的屏幕截图。

如果要为特征创建播放列表,请使用 MSTest 框架的以下格式:

<Playlist Version="2.0">
  <Rule Name="Includes" Match="Any">
    <Property Name="Trait" Value="SchemaUpdateBasic" />
  </Rule>
</Playlist>

对 xUnit 框架使用以下格式。 请确保 TestCategory 名称和 [Value] 值之间有一个空格。

<Playlist Version="2.0">
  <Rule Name="Includes" Match="Any">
    <Rule Match="All">
      <Property Name="Solution" />
        <Rule Match="Any">
            <Property Name="Trait" Value="TestCategory [Value]" />
        </Rule>
    </Rule>
  </Rule>
</Playlist>

测试资源管理器列

除了特征、堆栈跟踪、错误消息和完全限定名以外,也可用作测试资源管理器中的列。 默认情况下,大多数列不可见。 您可以自定义哪些列显示。

Visual Studio 测试资源管理器的屏幕截图,其中显示已选中“列”的菜单和已选中“持续时间”、“特征”和“错误消息”的子菜单。

列可以筛选、重新排列和排序:

  • 若要筛选到特定特征,请选择 特征 列顶部的筛选器图标。

    列筛选器的屏幕截图。

  • 若要更改列的顺序,请选择列标题并将其向左或向右拖动。

  • 若要对列进行排序,请选择列标题。 并非所有列都可以排序。 您还可以通过按住 Shift 键并选择另一个列标题,根据次要列进行排序。

    列排序的屏幕截图。

测试资源管理器列

除了特征、堆栈跟踪、错误消息和完全限定名以外,也可用作测试资源管理器中的列。 默认情况下,大多数列不可见。 您可以自定义哪些列显示。

Visual Studio 测试资源管理器的屏幕截图,显示了一个菜单,其中“列”被选中,还有一个子菜单,其中“持续时间”、“特征”和“错误消息”被选中。

列可以筛选、排序和重新排列。

  • 若要筛选到特定特征,请选择 特征 列顶部的筛选器图标。

    列筛选器的屏幕截图。

  • 若要更改列的顺序,请选择列标题并将其向左或向右拖动。

  • 若要对列进行排序,请选择列标题。 并非所有列都可以排序。 您还可以通过按住 Shift 键并选择其他列标题,按次要列进行排序。

    列排序的屏幕截图。

搜索和筛选测试列表

还可以使用测试资源管理器搜索筛选器来限制查看和运行的项目中的测试方法。

在“测试资源管理器” 搜索框中键入字符串并选择 Enter 键时,将筛选测试列表以仅显示其完全限定名称包含字符串的测试。

按不同的条件进行筛选:

  1. 打开搜索框右侧的下拉列表。

  2. 选择新条件。

  3. 输入引号之间的筛选器值。 如果要在字符串而不是包含匹配项上搜索完全匹配项,请使用等号(=)而不是冒号(:))。

测试资源管理器中筛选器测试的屏幕截图。

测试资源管理器中筛选器测试的屏幕截图。

备注

搜索不区分大小写,并将指定的字符串与条件值的任何部分匹配。

限定符 描述
状态 在测试资源管理器类别名称中搜索匹配项:失败的测试跳过的测试通过的测试
特征 同时搜索特征类别及其值的匹配项。 单元测试框架定义用于指定特征类别和值的语法。
完全限定名 搜索测试命名空间、类和方法的完全限定名的匹配项。
项目 在测试项目名称中搜索匹配项。
目标框架 在测试框架中搜索匹配项。
命名空间 在测试命名空间中搜索匹配项。
搜索测试类名的匹配项。

若要排除筛选器结果的子集,请使用以下语法:

FilterName:"Criteria" -FilterName:"SubsetCriteria"

例如,FullName:"MyClass" - FullName:"PerfTest" 返回名称中包含“MyClass”的所有测试,但名称中还包括“PerfTest”的测试除外。

分析单元测试代码覆盖率

可以使用 Visual Studio Enterprise 提供的代码覆盖工具来确定您的单元测试实际测试了多少产品代码。 你可以在选定的测试上或解决方案中的所有测试上运行代码覆盖率。

要在解决方案中为测试方法运行代码覆盖率,请执行以下操作:

  • 在测试资源管理器中右键单击,然后选择“分析所选测试的代码覆盖率”

代码覆盖率结果 窗口显示产品代码块按行、函数、类、命名空间和模块被执行的百分比。

有关详细信息,请参阅使用代码覆盖率确定正在测试的代码数量

测试快捷方式

可以通过以下任一方法从测试资源管理器运行测试:

某些快捷方式是基于上下文的。 它们会根据光标在代码编辑器中的位置来运行、调试分析测试。 如果游标位于测试方法内,则该测试方法将运行。 如果光标位于类级别,则该类中的所有测试都会运行。 命名空间级别的行为相同。

常用命令 键盘快捷方式
TestExplorer.DebugAllTestsInContext Ctrl+R、Ctrl+T
TestExplorer.RunAllTestsInContext Ctrl+R、T
TestExplorer.RunAllTests Ctrl+R、A
TestExplorer.RepeatLastRun Ctrl+R、L

备注

不能在抽象类中运行测试,因为测试仅在抽象类中定义,而不是实例化。 若要在抽象类中运行测试,请创建派生自抽象类的类。

设置音频提示

测试资源管理器可在测试运行完成后播放以下声音之一:

  • 表明测试运行成功且所有测试都通过的声音
  • 一个提示音,表明测试运行已完成,且至少有一个测试失败。

可以在默认的 Windows 11“声音”对话框中设置这些声音。 此功能从 Visual Studio 2019 Update 16.9 预览版 3 开始提供。

  1. 打开默认的 Windows 11“声音”对话框
  2. 转到“声音”选项卡
  3. 找到“Microsoft Visual Studio”类别。 选择“测试运行成功”或“测试运行失败”预设声音,或浏览自己的音频文件

Windows 11 声音对话框的屏幕截图。