新闻中心

C++如何进行单元测试?GoogleTest框架在C++项目中的应用【测试教程】

2025-12-13
浏览次数:
返回列表
GoogleTest写C++单元测试核心是三步:写TEST宏定义的测试用例、用EXPECT_EQ/ASSERT_EQ等断言验证、运行二进制并用命令行参数过滤或调试;推荐vcpkg或submodule集成,优先链接GTest::gtest_main而非手写main。

c++如何进行单元测试?googletest框架在c++项目中的应用【测试教程】

用 GoogleTest 写 C++ 单元测试,核心是三步:写测试用例、断言验证行为、运行并看结果。它不强制依赖构建系统,但和 CMake 配合最顺手。

安装与集成 GoogleTest

推荐用 git submodulevcpkg 管理依赖,避免手动编译带来的路径和 ABI 问题。

  • 用 vcpkg:执行 vcpkg install googletest:x64-windows(Windows)或 googletest:x64-linux(Linux),再在 CMake 中 find_package(GTest REQUIRED)
  • 用 submodule:把 GoogleTest 克隆进 third_party/googletest,CMake 中用 add_subdirectory(third_party/googletest),然后链接 GTest::gtest_main
  • 注意:不要直接 #include "gtest/gtest.h" 后自己实现 main(),除非你明确需要自定义初始化逻辑;多数情况直接链接 gtest_main 就自动有了入口函数

编写第一个测试用例

每个测试用例对应一个“测试套件 + 测试名”,用 TEST(TestSuiteName, TestName) 宏定义,里面写断言语句。

  • 基础断言用 ASSERT_EQ(失败立即返回)或 EXPECT_EQ(失败继续执行,适合检查多个条件)
  • 测试函数里不能有返回值,也不能传参数——所有输入数据应在测试体内构造
  • 示例:TEST(MathUtils, AddReturnsCorrectResult) { EXPECT_EQ(5, add(2, 3)); }

组织测试与复用逻辑

当多个测试需要共享初始化/清理逻辑,用测试套件类(TEST_F)比全局 setup/teardown 更安全可靠。

拾贝 拾贝

一键同步微信读书所有笔记和划线,并在新标签页回顾

拾贝 186 查看详情 拾贝
  • 定义一个继承 testing::Test 的类,在 SetUp()TearDown() 中写公共资源的构造与析构
  • 成员变量自动对每个测试独立实例化,避免测试间状态污染
  • 使用时写 TEST_F(MyFixture, CanReadConfig) { EXPECT_TRUE(config_.is_valid()); }

运行与调试技巧

生成的测试可直接执行,支持命令行过滤、重复运行、输出 XML 等,开发时很实用。

  • 只跑某套件:./test_bin --gtest_filter=Network*
  • 重复跑 10 次找随机失败:./test_bin --gtest_repeat=10 --gtest_break_on_failure
  • 生成 JUnit 格式报告供 CI 解析:./test_bin --gtest_output=xml:test-report.xml
  • 在 IDE(如 CLion、VS2025)中可直接点击绿色箭头运行单个 TEST,支持断点调试

基本上就这些。GoogleTest 不复杂但容易忽略初始化方式和断言选择,写熟了就是自然反应。

以上就是C++如何进行单元测试?GoogleTest框架在C++项目中的应用【测试教程】的详细内容,更多请关注其它相关文章!


# 微软  # 赣州网站优化营商环境  # 抖音营销推广运营矩阵视频系统  # 芜湖网站推广优化技巧  # 网站建设以及推广提案书  # Seo怎样出词多  # 宁夏江苏谷歌seo  # 上海网络seo营销推广  # 高邮网站的建设方案  # cookie优化对seo的影响  # 工作朋友圈营销推广  # 三步  # 尼克  # 第三方  # 可直接  # linux  # 多个  # 套件  # 拾贝  # 命令行  # 单元测试  # red  # google  # win  # c++  # ai  # windows  # go  # git 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: Golang如何处理RPC请求负载均衡_Golang RPC请求负载均衡策略与实践  机器学习中对数变换预测结果的反向还原  快手极速版在线观看 官方网页版登录地址  QQ邮箱电脑版登录入口_QQ邮箱官方网站登录平台  拼多多购物车商品数量无法修改如何处理 拼多多购物车操作优化方法  理解Python模块与全局变量的作用域管理  Win11如何使用Windows Sandbox Win11沙盒功能开启与使用教程【详解】  QQ邮箱网页版邮箱入口 QQ邮箱官方登录平台  深入理解rpy2中的类型转换:优化Python对象到R矩阵的映射  动漫岛观看全网网 动漫岛在线正版动漫入口  大麦的“候补”是什么意思 大麦候补购票规则【详解】  漫蛙manwa官网登录界面_漫蛙漫画网页版主站入口  痛风发作了怎么办? 快速止痛和后期饮食调理  MAC怎么安装Homebrew包管理器_MAC为开发者和高级用户安装命令行工具  抖音小游戏合成大西瓜免费秒玩入口链接 抖音小游戏热门合集秒玩网站  CSS子选择器:如何区分并样式化嵌套列表的子层级  NetBeans Ant项目:自动化将资源文件复制到dist目录的教程  AO3镜像入口大全 AO3网页版内容访问全集  C++如何生成随机数_C++ random库使用方法与范围设置  msn官网入口地址手机版 msn官方网站手机最新链接  漫蛙2正版漫画站 漫蛙2网页版快速访问入口  Win10怎么制作U盘启动盘 Win10系统安装U盘制作教程【详解】  Composer的 "check-platform-reqs" 命令有什么用_在部署前检查生产环境是否满足Composer依赖需求  Excel文件在线转换快速入口 Excel在线格式转换网站  品牌机怎么重装系统 联想/戴尔/惠普笔记本恢复出厂系统教程  Golang如何使用buffered channel提高性能_Golang buffered channel优化技巧  c++如何实现单例设计模式_c++线程安全的单例模式写法  Go语言中动态执行代码字符串的策略与实践  在Go语言中利用后缀数组处理多字符串:实现高效文本匹配与自动补全  蛙漫漫画官网在线入口 蛙漫全本漫画免费阅读平台  Win10双系统截图高效法 截屏快捷键速记【技巧】  处理Kafka消费者会话超时:深入理解消息处理语义与幂等性  VS Code远程开发时如何处理文件权限问题  聚水潭ERP登录页面入口 聚水潭ERP官网登录界面  豆包手机助手发布技术预览版:直接嵌入手机系统!努比亚样机发售  126邮箱手机版登录官网2026_126手机邮箱免费入口最新  Win10如何开启蓝牙功能_Windows10找不到蓝牙开关解决方法  Golang如何优化内存分配与垃圾回收_Golang内存管理与GC优化实践  QQ邮箱网页版登录入口 QQ邮箱官方在线使用平台  css元素hover动画延迟生效怎么办_使用animation-delay调整触发时间  Go语言中Map存储的结构体如何调用指针方法:深入解析与实践  Lar*el DB::listen 事件中的查询执行时间单位解析  PHP中SSG-WSG API的AES加密实践:正确使用初始化向量  c++中为什么推荐使用using替代typedef_c++现代化类型别名  Selenium Python中处理点击后新窗口加载冻结问题的策略与实践  Win11输入法不见了怎么办_Windows11恢复语言栏显示方法  LINUX的I/O重定向是什么_深入理解LINUX中 >、>> 与 < 的区别  如何在 Windows 11 中启动游戏手柄设置  微博网页版官方账号登录 微博网页版内容浏览使用指南  汽水音乐车机版横屏版7.1 汽水音乐车机版横屏版下载入口 

搜索