在 Visual Studio 中编写 C/C++单元测试

可以使用 测试资源管理器 窗口编写和运行C++单元测试。 它的工作方式与其他语言的相同。 有关使用 测试资源管理器的详细信息,请参阅 使用测试资源管理器运行单元测试。

备注

C++不支持某些功能,例如 Live Unit Testing、编码的 UI 测试和 IntelliTest。

Visual Studio 包括以下C++测试框架,无需额外下载:

  • 适用于 C++ 的 Microsoft 单元测试框架
  • Google Test
  • Boost.Test
  • CTest

可以使用已安装的框架,或为要在 Visual Studio 中使用的任何框架编写自己的测试适配器。 测试适配器将单元测试与 测试资源管理器 窗口集成。 Visual Studio Marketplace上提供了多个非Microsoft适配器。 有关详细信息,请参阅 安装单元测试框架。

  • Visual Studio 2017 及更高版本(专业和企业版)

    C++单元测试项目支持 CodeLens。

  • Visual Studio 2017 及更高版本(所有版本)

    • Google Test 适配器作为“使用 C++ 的桌面开发”工作负载的默认组件包含在内。 它具有可添加到解决方案的项目模板。 右键单击 解决方案资源管理器 中的解决方案节点,然后选择快捷菜单上 添加>新建项目 以添加项目模板。 它还具有多个配置选项,可以通过 工具>选项进行配置。 有关详细信息,请参阅 如何:在 Visual Studio 中使用 Google Test。

    • Boost.Test 作为“使用 C++ 的桌面开发”工作负载的默认组件包含在内。 它与 测试资源管理器集成,但当前没有项目模板。 必须手动配置它。 有关详细信息,请参阅 如何:在 Visual Studio中使用 Boost.Test。

    • CTest 支持包含在 C++ CMake 工具 组件中,该组件是具有C++工作负荷的 桌面开发的一部分。 有关详细信息,请参阅 如何:在 Visual Studio中使用 CTest。

  • Visual Studio 的早期版本

    可以在 Visual Studio Marketplace 上下载 Google Test 适配器和 Boost.Test 适配器扩展。 在 测试适配器中找到适用于 Boost.Test 的设备,并在 测试适配器中找到适用于 Google Test的设备。

提示

还可以使用 Copilot /tests 斜杠命令从代码生成单元测试。 例如,可以键入 /tests using Boost framework 来生成 Boost.Test 测试。 有关详细信息,请参阅在 Copilot Chat 中使用斜杠命令。

基本测试工作流

以下部分演示了开始C++单元测试的基本步骤。 基本配置与 Microsoft 和 Google Test 框架类似。 Boost.Test 要求手动创建测试项目。

在 Visual Studio 中创建测试项目

在一个或多个 测试项目中定义和运行单元测试。 测试项目创建一个单独的应用,用于调用可执行文件中的代码并报告其行为。 在与要测试的代码相同的解决方案中创建测试项目。

若要向现有解决方案添加新的测试项目,请执行以下操作:

  1. 右键单击 解决方案资源管理器中的解决方案节点。
  2. 在上下文菜单中,选择 添加>新建项目。
  3. 将“语言”设置为“C++”并在搜索框中键入“测试”。 以下屏幕截图显示了安装 C++ 桌面开发 和安装 UWP 开发 工作负载时可用的测试项目:

屏幕截图显示的是在 Visual Studio 2022 中选择 C++ 的“添加新项目”窗口。

在解决方案中创建对其他项目的引用

若要启用对所测试项目中函数的访问,请在测试项目中添加对项目的引用。 在 解决方案资源管理器中,展开测试项目。 右键单击 引用,然后选择 添加>引用。 在“添加引用 对话框中,选择要测试的项目。

屏幕截图显示了 Visual Studio 2022 中的“添加引用”对话框。

如果测试代码未导出要测试的函数,请将输出 .obj 或 .lib 文件添加到测试项目的依赖项。 有关详细信息,请参阅将测试与对象或库文件相关联。 不包括具有 main 函数或其他标准入口点的对象文件,例如 wmain、WinMain或 DllMain。 向项目添加新的源文件时,更新测试项目依赖项以包含相应的对象文件。

为头文件添加 #include 指令

在单元测试 .cpp 文件中,为声明要测试的类型和函数的任何头文件添加 #include 指令。 键入 #include ",随后 IntelliSense 会激活,以帮助进行选择。 对更多标题重复此操作。

屏幕截图显示 Visual Studio 的解决方案资源管理器,其中 IntelliSense 突出显示了 #include 语句中的头文件。

屏幕截图显示了 Visual Studio 2022 中的解决方案资源管理器,并显示了一个 #include 语句,其中 IntelliSense 突出显示了一个头文件。

提示

为了避免在源文件中的每个 include 语句中键入完整路径,请在 Project>Properties>C/C++ 中添加所需的文件夹,>常规>其他包含目录。

编写测试方法

备注

本部分介绍适用于 C/C++ 的 Microsoft 单元测试框架的语法。 有关详细信息,请参阅 Microsoft.VisualStudio.TestTools.CppUnitTestFramework API 参考。

有关 Google Test 文档,请参阅 Google Test 入门。 有关 Boost.Test,请参阅 Boost Test 库:单元测试框架。

测试项目中的 .cpp 文件为您定义了一个存根类和方法。 它们演示了如何编写测试代码的示例。 签名使用TEST_CLASS和TEST_METHOD宏,使方法可从 测试资源管理器 窗口中发现。

屏幕截图显示了使用 Visual Studio 中的TEST_CLASS和TEST_METHOD宏的存根类和方法。

屏幕截图显示了使用 Visual Studio 2022 中的TEST_CLASS和TEST_METHOD宏的存根类和方法。

TEST_CLASS和TEST_METHOD是Microsoft本机测试框架的一部分。 测试资源管理器 以类似的方式发现其他受支持框架中的测试方法。

TEST_METHOD 返回 void。 若要生成测试结果,请使用 Assert 类中的静态方法针对预期结果测试实际结果。 在下面的示例中,假定 MyClass 具有采用 std::string的构造函数。 此示例演示如何测试构造函数是否按照预期方式初始化类:

TEST_METHOD(TestClassInit)
{
    std::string name = "Bill";
    MyClass mc(name);
    Assert::AreEqual(name, mc.GetName());
}

在前面的示例中,Assert::AreEqual 调用的结果确定测试是通过还是失败。 Assert 类包含许多其他方法,用于将预期结果与实际结果进行比较。

可以将 特征 添加到测试方法中,以指定测试所有者、优先级和其他信息。 然后,可以使用这些值在 测试资源管理器对测试进行排序和分组。 有关详细信息,请参阅 使用测试资源管理器运行单元测试。

运行测试

  1. 在 测试 菜单上,选择 测试资源管理器。 下图显示了在运行测试之前的测试项目。

    屏幕截图显示了在 Visual Studio 中运行测试之前的测试资源管理器。

    屏幕截图显示了在 Visual Studio 2022 中运行测试之前的测试资源管理器。

    备注

    CTest 与 测试浏览器 集成尚未可用。 从 CMake 主菜单运行 CTest 测试。

  2. 如果窗口中缺少任何测试,请在解决方案资源管理器 中右键单击其节点并选择“生成” 或 “重新生成”来生成测试项目。

  3. 在 测试资源管理器中,选择 运行所有,或选择要运行的特定测试。 右键单击某个测试以查看更多选项,包括在启用断点的调试模式下运行该测试。 运行所有测试后,窗口会显示通过的测试以及失败的测试。

    屏幕截图显示了在 Visual Studio 中运行测试后的测试资源管理器。

    屏幕截图显示 Visual Studio 2022 中运行测试后的测试资源管理器。

对于失败的测试,该消息显示有助于诊断原因的详细信息。 右键单击失败的测试,调出弹出菜单。 选择“调试”,以单步执行发生故障的函数。

有关使用 测试资源管理器的详细信息,请参阅 使用测试资源管理器运行单元测试。

有关单元测试的详细信息,请参阅 单元测试基础知识。

使用 CodeLens

Visual Studio 2017 及更高版本(专业版和企业版)

CodeLens 让你无需离开代码编辑器即可快速查看单元测试的状态。

使用以下任一方式初始化 C++ 单元测试项目的 CodeLens:

  • 编辑和生成测试项目或解决方案。
  • 重新生成项目或解决方案。
  • 从 测试资源管理器 窗口中运行测试。

初始化 CodeLens 后,可以看到每个单元测试上方的测试状态图标。

屏幕截图显示了 Visual Studio 中的 C++ CodeLens 图标。

屏幕截图显示了 Visual Studio 2022 中的 C++ CodeLens 图标。

选择图标了解详细信息,或运行或调试单元测试:

屏幕截图显示了在 Visual Studio 中选择 C++ CodeLens 图标后的详细信息。

屏幕截图显示了在 Visual Studio 2022 中选择 C++ CodeLens 图标查看详细信息后的界面。