尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
GoogleTest自定义断言宏教程:像ASSERT_EQ一样创建你自己的C++测试宏
GoogleTest自定义断言宏教程像ASSERT_EQ一样创建你自己的C测试宏【免费下载链接】googletestGoogleTest - Google Testing and Mocking Framework项目地址: https://gitcode.com/GitHub_Trending/go/googletestGoogleTestGoogle Testing and Mocking Framework是 Google 开源的 C 测试框架内置了 ASSERT_EQ、EXPECT_TRUE 等常用断言宏。当内置断言无法满足业务场景时你可以亲手创建自己的 C 测试宏。本文将用 3 种由易到难的方法带你掌握 GoogleTest 自定义断言宏的完整写法让测试输出更清晰、更贴近你的项目语言。一、何时需要写自定义断言宏新手通常从 docs/primer.md 入门学会 TEST、ASSERT_EQ 就够了。但当你遇到以下场景自定义断言宏就是刚需业务语义复杂比如验证两个时间点是否在同一交易日内用EXPECT_TRUE(a b)失败后只输出false看不出问题在哪断言逻辑要复用同一个校验配置格式的逻辑在几十个测试里重复失败信息要可读官方文档 docs/advanced.md 明确指出GoogleTest 的内置断言不可能覆盖所有场景需要扩展。好消息是GoogleTest 的断言机制完全开放从零宏代码到手写 ASSERT_*都有官方支持的路径。二、方法 1返回 AssertionResult最省事的入门姿势核心类是 googletest/include/gtest/gtest-assertion-result.h头文件注释里就有现成示例// 返回 AssertionResult 而不是 bool失败时能说清楚为什么 testing::AssertionResult IsEven(int n) { if ((n % 2) 0) return testing::AssertionSuccess(); return testing::AssertionFailure() n is odd; } // 测试里直接用无需任何新宏 EXPECT_TRUE(IsEven(Fib(5)));断言失败时输出不再是干巴巴的Actual: false而是Value of: IsEven(Fib(5)) Actual: false (5 is odd) Expected: true适合谁只想要更好的失败信息、不想碰宏的开发者。一行代码量收益立竿见影。三、方法 2谓词断言 EXPECT_PRED_FORMAT官方推荐的中间路线如果你的判断需要多个参数且想完全控制失败文案可以用谓词断言。官方参考文档见 docs/reference/assertions.md 的 Predicate Assertions 一节。// 谓词格式化函数先收表达式原文再收参数值 testing::AssertionResult AssertMutuallyPrime(const char* m_expr, const char* n_expr, int m, int n) { if (MutuallyPrime(m, n)) return testing::AssertionSuccess(); return testing::AssertionFailure() m_expr and n_expr ( m and n ) are not mutually prime; } // 使用 EXPECT_PRED_FORMAT2(AssertMutuallyPrime, a, b); // 通过 EXPECT_PRED_FORMAT2(AssertMutuallyPrime, b, c); // 失败并输出可读信息失败输出示例b and c (4 and 10) are not mutually prime, as they have a common divisor 2这套宏的实现在 googletest/include/gtest/gtest_pred_impl.h配套单测 googletest/test/gtest_pred_impl_unittest.cc 里展示了大量用法是学习断言写法的最佳活教材。局限每个函数参数个数对应不同的宏EXPECT_PRED_FORMAT2、FORMAT3…且ASSERT_与EXPECT_要分别调用语法稍显啰嗦。想要一个名字走天下看方法 3。四、方法 3手写 ASSERT_/EXPECT_ 宏真正像 ASSERT_EQ 一样GoogleTest 所有内置断言EXPECT_EQ、EXPECT_THROW、FAIL等底层都建立在两个内部宏上定义在 googletest/include/gtest/internal/gtest-internal.h#define GTEST_FATAL_FAILURE_(message) \ return GTEST_MESSAGE_(message, ::testing::TestPartResult::kFatalFailure) #define GTEST_NONFATAL_FAILURE_(message) \ GTEST_MESSAGE_(message, ::testing::TestPartResult::kNonFatalFailure)GTEST_FATAL_FAILURE_失败后return 当前函数致命失败GTEST_NONFATAL_FAILURE_失败后继续执行非致命失败。利用它们按下面模板即可造出自己的ASSERT_/EXPECT_兄弟宏以断言 Fib(n) 等于 expected为例放在你的测试工具头文件中// 1. 真正的判断逻辑只写一次 #define GTEST_TEST_FIB_(n, expected, on_failure) \ if (const int gtest_actual Fib(n); \ gtest_actual ! (expected)) \ on_failure Expected: Fib( (n) \ ) (expected) \ \n Actual: gtest_actual // 2. 致命版本失败立即结束当前函数 #define ASSERT_FIB(n, expected) \ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ if (::testing::internal::AlwaysTrue()) \ GTEST_TEST_FIB_(n, expected, GTEST_FATAL_FAILURE_) \ else \ GTEST_AMBIGUOUS_ELSE_BLOCKER_ // 3. 非致命版本失败继续跑后面的断言 #define EXPECT_FIB(n, expected) \ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ if (::testing::internal::AlwaysTrue()) \ GTEST_TEST_FIB_(n, expected, GTEST_NONFATAL_FAILURE_) \ else \ GTEST_AMBIGUOUS_ELSE_BLOCKER_测试里就能这样用了TEST(FibTest, Basic) { ASSERT_FIB(10, 55); // 失败则直接结束本测试 EXPECT_FIB(11, 89); // 失败不影响后续语句 }模板里每个零件的作用零件作用on_failure参数把致命/非致命的差别留给外层宏核心逻辑不重复GTEST_AMBIGUOUS_ELSE_BLOCKER_阻止编译器的悬空 else警告GoogleTest 官方惯用手法AlwaysTrue()保证if一定为真让宏能干净地嵌入任意控制流gtest_actual等带前缀的变量名避免宏展开后与外部变量重名冲突五、新手必知的 4 个坑ASSERT_ 宏会偷走returnGTEST_FATAL_FAILURE_展开后自带return所以自定义的ASSERT_*宏只能用在返回void的函数里如 TEST 测试体。这与内置 FAIL() 宏的限制完全一致自定义宏不会自动打印参数内置ASSERT_EQ的Value of / Actual / Expected输出来自框架内部机制你的宏必须像上面的例子一样手动把值进失败消息否则排错信息会非常干EXPECT_ 与 ASSERT_ 成对提供参考 googletest/include/gtest/gtest.h 中EXPECT_PRED1/ASSERT_PRED1等成对定义的方式见 gtest_pred_impl.h保持 API 风格统一别人用起来零学习成本别在宏里用if/else裸结构一定套上GTEST_AMBIGUOUS_ELSE_BLOCKER_或额外的大括号这是 GoogleTest 源码中所有断言宏的通用写法。六、项目核心资料速查资料路径新手入门指南docs/primer.md进阶主题含断言扩展思路docs/advanced.md全部内置断言参考docs/reference/assertions.mdAssertionResult 类与示例googletest/include/gtest/gtest-assertion-result.h失败处理内部宏googletest/include/gtest/internal/gtest-internal.h谓词断言宏实现googletest/include/gtest/gtest_pred_impl.h谓词断言单测用法大全googletest/test/gtest_pred_impl_unittest.cc如需在本机体验完整框架可克隆仓库git clone https://gitcode.com/GitHub_Trending/go/googletest然后用 CMake见 docs/quickstart-cmake.md或 Bazel见 docs/quickstart-bazel.md构建。写在最后三种方法按成本排序AssertionResult函数0 个宏→EXPECT_PRED_FORMAT官方现成宏→ 手写ASSERT_/EXPECT_宏完全自定义 API。建议新手从第一种起步当同一断言在 3 个以上测试中重复出现时再升级到第三种。掌握本文模板后你就能像 Google 团队扩展 ASSERT_EQ 一样为任何业务概念打造专属的 C 测试宏了 【免费下载链接】googletestGoogleTest - Google Testing and Mocking Framework项目地址: https://gitcode.com/GitHub_Trending/go/googletest创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

用 egui 的 TableBuilder 堆叠多级表头:一份数据表格搭建指南

用 egui 的 TableBuilder 堆叠多级表头:一份数据表格搭建指南

用 egui 的 TableBuilder 堆叠多级表头:一份数据表格搭建指南 【免费下载链接】egui egui: an easy-to-use immediate mode GUI in Rust that runs on both web and native 项目地址: https://gitcode.com/GitHub_Trending/eg/egui egui 是一个用 Rust 写的即…

📅 2026/10/26 16:14:05
k6 脚本一次写对:从零跑通性能压测

k6 脚本一次写对:从零跑通性能压测

k6 脚本一次写对:从零跑通性能压测 【免费下载链接】k6 A modern load testing tool, using Go and JavaScript 项目地址: https://gitcode.com/GitHub_Trending/k6/k6 压测跑到第 5 分钟,终端被 500 错误刷了满屏,结果里你设的错误率…

📅 2026/10/1 1:57:40
C/C++实现大气风剖面与湍流参数数值建模

C/C++实现大气风剖面与湍流参数数值建模

简介:本资源面向流体动力学仿真初学者与Fluent用户,聚焦风剖面建模、湍动能(k)与湍流耗散率(ε)的理论计算与程序实现,解决工程中风荷载分析、大气边界层模拟及湍流参数定制化设置等实际问题。压…

📅 2026/9/9 20:06:35
MORE NEWS

更多资讯

📰

链游2.0:构建可持续的区块链游戏经济模型与技术架构

1. 链游行业现状与困境剖析链游(区块链游戏)作为GameFi领域的重要分支,近年来经历了从狂热到冷静的市场周期。2021年Axie Infinity的爆发让市场看到了"Play to Earn"模式的潜力,但随后大量仿盘项目的崩盘也暴露了行业深…

📰

从print大法到线上问题排查:caveman调试法为什么至今仍是有效底牌

那天晚上快12点,监控群里连着弹了三条报警,内容是线上某个接口的P99延迟从300毫秒直接飙到3秒,可用性掉了一个点。我登上生产环境看了半天,没有分布式追踪、没有链路ID、日志也只有零星几条,整个服务就像一口黑井。折腾…

📰

AI Agent任务完成微信通知实现方案

1. 为什么AI Agent需要任务完成通知?当我们在开发AI Agent自动化流程时,最常遇到的痛点就是:不知道任务什么时候跑完。想象一下,你部署了一个耗时较长的数据分析Agent,或者一个定期爬取数据的Agent,总不能一…

📰

基于CANN架构的智能视频分析系统设计与优化

1. 项目概述在AI技术快速落地的今天,智能视频分析已成为计算机视觉领域最具商业价值的应用方向之一。而CANN(Compute Architecture for Neural Networks)作为专为神经网络计算设计的异构计算架构,正在为这一领域提供强大的底层支持…

📰

营销技能体系拆解:从执行到操盘手的能力清单

做营销这些年我踩过最大的坑,就是以为营销 skills 就是会写文案、会投广告、会做活动。直到我带团队、带项目,看着一个又一个方案从立项到扑街,才慢慢想明白一件事:营销这个行当,表面上拼的是创意和资源,实…

📰

hyperframes参考架构实战:从GPU利用率到分布式训练优化

最近圈里好几个群都在聊 hyperframes,有人拿它跟传统 AI 训练方案比,有人拿它跟云上容器化方案比,还有人直接问“这东西到底是不是又一个套壳框架”。我因为工作原因,正好带团队做过一轮相关的性能验证和落地评估,从硬…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬