0

0

C++怎么进行单元测试_C++测试框架教程【质量】

冰火之心

冰火之心

发布时间:2026-02-20 16:09:56

|

122人浏览过

|

来源于php中文网

原创

用预编译googletest 1.14.0,配置头文件与静态库路径,编写含initgoogletest和run_all_tests的main,编译加-std=c++17;assert_eq用于前置条件失败即终止,expect_eq用于多独立断言;避免hack私有成员,优先测试接口行为;注意ci中gtest_filter转义、death_test_style适配及-g调试信息。

c++怎么进行单元测试_c++测试框架教程【质量】

GoogleTest 写第一个测试,5 分钟跑起来

别从零搭环境——GoogleTest 是 C++ 事实标准,Windows/macOS/Linux 都能直接编译,不用动系统级配置。重点不是“学框架”,而是让第一行断言通过。

  • 下载预编译的 googletest-release-1.14.0(别用 main 分支,CI 不稳定)
  • googletest/include 加进编译器 -I 路径,libgtest.agtest.lib 加进链接路径
  • 写个 main.cpp:只包含 #include <gtest></gtest>int main(int argc, char **argv) { ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); }
  • 编译时加 -std=c++17GoogleTest 1.14 要求最低 C++14,但某些断言在 C++17 下行为更一致)

常见错误:undefined reference to testing::UnitTest::GetInstance() —— 多半是没链接 libgtest,或用了静态库却忘了加 -static-libstdc++(Windows MinGW 场景)。

ASSERT_EQEXPECT_EQ 到底该用哪个

它们不是“严格/宽松”之分,而是“是否继续执行当前测试函数”的开关。选错会导致后续逻辑被跳过,掩盖真正问题。

  • ASSERT_EQ:失败就立刻 return,适合检查前置条件(比如指针非空、容器 size > 0)
  • EXPECT_EQ:失败只记日志,继续往下跑,适合验证多个独立输出(比如结构体里 a/b/c 三个字段)
  • 别在循环里无脑用 ASSERT_EQ:一次失败就停,你根本看不到后面几轮的结果
  • 错误现象:Test case 'FooTest.Bar' did not check any assertions —— 意味着你写了 ASSERT 但没走到那行(比如提前 return 或异常抛出)

测试私有成员或未导出函数,别 hack

C++ 没有“测试专用访问权限”。强行 friend 或宏定义 #define private public 看似快,实则让测试和实现细节强耦合,重构时全崩。

阿里云AI平台
阿里云AI平台

阿里云AI平台

下载

立即学习C++免费学习笔记(深入)”;

  • 优先测接口行为:比如类 Parserparse() 返回值、抛出异常类型、修改了传入的 std::vector<token>&</token>
  • 真要覆盖内部逻辑?把关键算法抽成独立 inline 函数,头文件里声明,测试直接调用
  • Windows DLL 场景下,如果函数没加 __declspec(dllexport),测试工程根本链接不到 —— 别试图用 GetProcAddress,那是运行时黑盒,不是单元测试
  • 性能影响:过度暴露内部状态会抑制内联,GoogleTest 的断言宏本身有轻微开销,但远小于错误设计带来的维护成本

CI 里跑不起来?先看 gtest_filtergtest_death_test_style

本地能过、CI 报 Segmentation fault (core dumped),八成是死亡测试(ASSERT_DEATH)没配对,或者过滤规则写错了。

  • --gtest_filter=MyTest.*:星号必须转义为 \*(bash)或 *(Windows cmd),否则 shell 先展开成文件名
  • 死亡测试默认用 fork,但 Alpine Linux(Docker 默认镜像)不支持 —— 改用 --gtest_death_test_style=threadsafe
  • MacOS 上 ASSERT_DEATH 可能卡住:因为 fork 后子进程继承了主线程锁状态,加 --gtest_break_on_failure 容易暴露死锁点
  • 兼容性坑:GoogleTest 1.13+ 默认启用 threadsafe,但旧项目升级后没改 CI 参数,就会莫名失败

最常被忽略的是:测试二进制文件本身没加 -g 编译,GoogleTest 的堆栈回溯为空,你只能看到 [ FAILED ] MyTest.CrashTest (0 ms) —— 连哪行崩的都不知道。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
typedef和define区别
typedef和define区别

typedef和define区别在类型检查、作用范围、可读性、错误处理和内存占用等。本专题为大家提供typedef和define相关的文章、下载、课程内容,供大家免费下载体验。

117

2023.09.26

define的用法
define的用法

define用法:1、定义常量;2、定义函数宏:3、定义条件编译;4、定义多行宏。更多关于define的用法的内容,大家可以阅读本专题下的文章。

359

2023.10.11

登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

6403

2023.09.14

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

836

2023.09.14

token怎么获取
token怎么获取

获取token值的方法:1、小程序调用“wx.login()”获取 临时登录凭证code,并回传到开发者服务器;2、开发者服务器以code换取,用户唯一标识openid和会话密钥“session_key”。想了解更详细的内容,可以阅读本专题下面的文章。

1086

2023.12.21

token什么意思
token什么意思

token是一种用于表示用户权限、记录交易信息、支付虚拟货币的数字货币。可以用来在特定的网络上进行交易,用来购买或出售特定的虚拟货币,也可以用来支付特定的服务费用。想了解更多token什么意思的相关内容可以访问本专题下面的文章。

1645

2024.03.01

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

344

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

199

2025.07.04

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

776

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 9.8万人学习

C 教程
C 教程

共75课时 | 4.9万人学习

C++教程
C++教程

共115课时 | 18.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号