在 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 2022 中创建测试项目

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

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

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

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

在 Visual Studio 2019 中创建测试项目

在一个或多个测试项目中定义和运行测试。 在与要测试的代码相同的解决方案中创建项目。

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

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

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

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

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

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

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

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

为头文件添加 #include 指令

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

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

屏幕截图显示了 Visual Studio 2019 中的解决方案资源管理器,并显示了一个 #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 2022 中的TEST_CLASS和TEST_METHOD宏的存根类和方法。

屏幕截图显示了使用 Visual Studio 2019 中的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 2022 中运行测试之前的测试资源管理器。

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

    备注

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

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

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

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

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

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

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

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

使用 CodeLens

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

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

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

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

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

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

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

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

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

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