在 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 中创建测试项目
在一个或多个 测试项目中定义和运行单元测试。 测试项目创建一个单独的应用,用于调用可执行文件中的代码并报告其行为。 在与要测试的代码相同的解决方案中创建测试项目。
若要向现有解决方案添加新的测试项目,请执行以下操作:
- 右键单击 解决方案资源管理器中的解决方案节点。
- 在上下文菜单中,选择 添加>新建项目。
- 将“语言”设置为“C++”并在搜索框中键入“测试”。 以下屏幕截图显示了安装 C++ 桌面开发 和安装 UWP 开发 工作负载时可用的测试项目:
在 Visual Studio 2019 中创建测试项目
在一个或多个测试项目中定义和运行测试。 在与要测试的代码相同的解决方案中创建项目。
若要向现有解决方案添加新的测试项目,请执行以下操作:
- 右键单击 解决方案资源管理器中的解决方案节点。
- 在上下文菜单中,选择“添加>新建项目”。
- 将“语言”设置为“C++”并在搜索框中键入“测试”。 以下屏幕截图显示了安装 C++ 桌面开发和 UWP 开发 工作负载时可用的测试项目:
在解决方案中创建对其他项目的引用
若要启用对所测试项目中函数的访问,请在测试项目中添加对项目的引用。 在 解决方案资源管理器中,展开测试项目。 右键单击 引用,然后选择 添加>引用。 在“添加引用 对话框中,选择要测试的项目。
将测试与对象或库文件相关联
如果测试代码未导出要测试的函数,请将输出 .obj
或 .lib
文件添加到测试项目的依赖项。 有关详细信息,请参阅将测试与对象或库文件相关联。 不包括具有 main
函数或其他标准入口点的对象文件,例如 wmain
、WinMain
或 DllMain
。 向项目添加新的源文件时,更新测试项目依赖项以包含相应的对象文件。
为头文件添加 #include 指令
在单元测试 .cpp
文件中,为声明要测试的类型和函数的任何头文件添加 #include
指令。 键入 #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宏,使方法可从 测试资源管理器 窗口中发现。
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
类包含许多其他方法,用于将预期结果与实际结果进行比较。
可以将 特征 添加到测试方法中,以指定测试所有者、优先级和其他信息。 然后,可以使用这些值在 测试资源管理器对测试进行排序和分组。 有关详细信息,请参阅 使用测试资源管理器运行单元测试。
运行测试
在 测试 菜单上,选择 测试资源管理器。 下图显示了在运行测试之前的测试项目。
备注
CTest 与 测试浏览器 集成尚未可用。 从 CMake 主菜单运行 CTest 测试。
如果窗口中缺少任何测试,请在解决方案资源管理器 中右键单击其节点并选择“生成” 或 “重新生成”来生成测试项目。
在 测试资源管理器中,选择 运行所有,或选择要运行的特定测试。 右键单击某个测试以查看更多选项,包括在启用断点的调试模式下运行该测试。 运行所有测试后,窗口会显示通过的测试以及失败的测试。
对于失败的测试,该消息显示有助于诊断原因的详细信息。 右键单击失败的测试,调出弹出菜单。 选择“调试”,以单步执行发生故障的函数。
有关使用 测试资源管理器的详细信息,请参阅 使用测试资源管理器运行单元测试。
有关单元测试的详细信息,请参阅 单元测试基础知识。
使用 CodeLens
Visual Studio 2017 及更高版本(专业版和企业版)
CodeLens 让你无需离开代码编辑器即可快速查看单元测试的状态。
使用以下任一方式初始化 C++ 单元测试项目的 CodeLens:
- 编辑和生成测试项目或解决方案。
- 重新生成项目或解决方案。
- 从 测试资源管理器 窗口中运行测试。
初始化 CodeLens 后,可以看到每个单元测试上方的测试状态图标。
选择图标了解详细信息,或运行或调试单元测试: