在 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 上提供了几个第三方适配器。 有关详细信息,请参阅安装第三方单元测试框架

Visual Studio 2017 及更高版本(Professional 和 Enterprise)

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++ 测试项目

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

若要允许访问被测项目中的函数,请在测试项目中添加对项目的引用。 右键单击解决方案资源管理器中的“测试项目”节点 ,调出弹出菜单。 选择“添加”>“引用” 。 在“添加引用”对话框中,选择要测试的项目。

添加引用

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

为头文件添加 #include 指令

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

解决方案资源管理器的屏幕截图,其中显示了一个正在通过 IntelliSense 添加的 #include 指令,突出显示了要包含的头文件。

若要避免必须在源文件的每个 include 语句中键入完整路径,请在“项目”>“属性”>“C/C++”>“常规”>“附加包含目录”中添加所需的文件夹。

编写测试方法

注意

此部分演示适用于 C/C++ 的 Microsoft 单元测试框架的语法。 记录在此处:Microsoft.VisualStudio.TestTools.CppUnitTestFramework API reference。 有关 Google Test 文档,请参阅 Google Test 入门。 有关 Boost.Test,请参阅 Boost Test 库:单元测试框架

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

测试资源管理器窗口的屏幕截图,其中显示 unittest1.cpp 代码文件,该文件包含一个存根类和使用 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. 在“测试” 菜单中,依次选择“窗口” >“测试资源管理器” 。 下图显示其测试尚未运行的测试项目。

    运行测试之前的测试资源管理器

    注意

    CTest 与“测试资源管理器” 的集成尚不可用。 从 CMake 主菜单运行 CTest 测试。

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

  3. 在测试资源管理器中,选择“全部运行”,或选择要运行的特定测试 。 右键单击测试以获得其他选项,包括在启用断点的情况下在调试模式中运行它。 所有测试运行后,窗口将显示已通过的测试和失败的测试。

    运行测试之后的测试资源管理器

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

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

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

使用 CodeLens

Visual Studio 2017 及更高版本(Professional 和 Enterprise 版)

通过 CodeLens,无需退出代码编辑器即可快速查看单元测试的状态。

可以通过以下任一方式为 C++ 单元测试项目初始化 CodeLens:

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

在它初始化后,你便可在各个单元测试上方看到测试状态图标。

C++ CodeLens 图标

选择图标可以查看详细信息,也可以运行或调试单元测试:

C++ CodeLens 运行和调试