如何使用Google Test (gtest) 为c++代码编写单元测试? (基础断言)
技术百科
穿越時空
发布时间:2026-01-13
浏览: 次 gtest 的 ASSERT_* 和 EXPECT_* 有什么区别?
核心区别在失败时的行为:ASSERT_* 是“硬中断”,一旦断言失败,当前测试函数立刻返回,后续语句不执行;EXPECT_* 是“软提示”,失败只记录错误,测试函数继续运行。比如你在验证对象初始化后调用多个成员函数,用 EXPECT_EQ 能一次性看到所有失败点;但若 ptr 为 nullptr 就不该继续解引用,这时该用 ASSERT_NE(ptr, nullptr)。
常见组合习惯:
- 用
ASSERT_*做前置条件检查(如指针非空、文件打开成功) - 用
EXPECT_*做主体逻辑验证(如计算结果、状态值) - 避免在循环体内滥用
ASSERT_*,否则可能漏掉后续迭代的错误
如何写一个最简可运行的 gtest 测试用例?
不需要宏定义或复杂配置,只要包含头文件、写 TEST 宏、链接 libgtest 即可运行。注意:gtest 不依赖 main(),它自己提供,所以你的测试文件里不要写自己的 main。
#includeTEST(MathTest, AddPositiveNumbers) { EXPECT_EQ(2 + 3, 5); EXPECT_GT(10, 7); }
int main(int argc, char **argv) { ::testing::Ini
tGoogleTest(&argc, argv); return RUN_ALL_TESTS(); }
编译命令示例(假设已安装 gtest):
立即学习“C++免费学习笔记(深入)”;
- g++ -std=c++11 test.cpp -lgtest -lgtest_main -pthread
- 确保链接
-lgtest_main,它提供了默认main;如果自己写了main,就只链-lgtest - 缺少
-pthread可能导致 segfault 或静默失败
字符串比较出错时为什么 EXPECT_EQ 报错信息看不懂?
EXPECT_EQ 对 const char* 默认做指针比较,不是内容比较。比如 EXPECT_EQ("hello", "hello") 实际比较两个字符串字面量的地址,结果是 false —— 这不是你想要的。
正确做法:
- 用
EXPECT_STREQ("hello", str.c_str())比较 C 风格字符串 - 用
EXPECT_EQ(std::string("hello"), str)或EXPECT_EQ("hello"s, str)(C++14 字符串字面量)让类型推导走std::string的重载 - 对
std::string成员直接用EXPECT_EQ是安全的,因为有对应重载
错误示例触发的报错类似:Expected: "abc" Which is: 0x55e2a1234000 —— 这就是在告诉你,它把字符串当指针打了地址。
测试私有成员或未导出函数怎么办?
gtest 本身不提供反射或友元注入机制。强行测私有函数会破坏封装,也增加维护成本。实际中优先考虑:
- 通过公有接口间接验证私有逻辑(例如调用
Calculate()后检查返回值和对象状态) - 把关键算法抽成独立的
static或free函数,放在头文件中并加inline,测试时直接调用 - 极少数必须测私有成员的场景,可在类定义末尾加
friend class TestClassName;,并在测试文件中定义同名测试类(注意命名空间匹配)
别为了测试而改生产代码的访问修饰符,更别用 #define private public 这种 hack —— 它会让编译器跳过访问检查,但可能破坏 ABI 或引发 ODR 违规。
# ai
# 是在
# 放在
# 自己的
# 你在
# 打了
# 多个
# 告诉你
# google
# 不需要
# public
# go
# 循环
# 对象
# c++
# String
# class
# 区别
# 指针
# 字符串
# 接口
# 报错
# 为什么
# Static
# private
# define
# 封装
# 成员函数
# 算法
# 头文件
# 命名空间
# char
# 风格字符串
# const
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- 如何在 PHP 单元测试中正确模拟带方法的图像处理
- 如何优化Golang Web性能_Golang H
- Go语言中正确反序列化多个同级XML元素为结构体切
- php增删改查在php8里有什么变化_新特性对cu
- Linux怎么修改用户密码_Linux系统pass
- Python多线程使用规范_线程安全解析【教程】
- 本地php环境出现502错误_nginx或apac
- 如何在 Python 测试中动态配置 @backo
- LINUX下如何配置VLAN虚拟局域网_在LINU
- 如何使用Golang开发基础文件下载功能_Gola
- Windows10如何删除恢复分区_Win10 D
- php订单日志怎么导出excel_php导出订单日
- Windows系统文件被保护机制阻止怎么办_权限不
- 如何使用Golang配置安全开发环境_防止敏感信息
- Windows7如何安装系统镜像_Windows7
- PHP主流架构怎么监控运行状态_工具推荐【操作】
- MAC怎么设置程序窗口永远最前_MAC窗口置顶插件
- mac本地php环境如何开启curl_curl扩展
- 如何减少Golang内存碎片化_Golang内存分
- Win11开机速度慢怎么优化_Win11系统启动加
- Win10电脑C盘红了怎么清理_Windows10
- 如何使用 Python 合并文件夹内多个 Exce
- 如何使用Golang实现云原生应用弹性伸缩_自动应
- Windows10电脑怎么设置文件权限_Win10
- Python音视频处理高级项目教程_FFmpegP
- Ajax提交表单PHP怎么接收_处理Ajax发送的
- Python项目回滚策略_发布安全说明【指导】
- 如何使用Golang实现路由分组管理_Golang
- Linux如何安装JDK11_Linux环境变量配
- php订单日志怎么记录物流_php记录订单物流变更
- php订单日志怎么记录发货_php记录订单发货操作
- Win11任务栏怎么调到左边_Win11开始菜单居
- Windows10系统怎么查看系统版本_Win10
- Win11任务栏怎么放到顶部_Win11修改任务栏
- Win11怎么关闭搜索历史_Win11清除任务栏搜
- Win11快速助手怎么用_Win11远程协助连接教
- Win11怎么更改电脑密码_Windows 11修
- 如何在 Go 中正确初始化结构体中的 map 字段
- Windows10如何更改鼠标图标_Win10鼠标
- Windows10怎样设置家长控制_Windows
- php8.4匿名类怎么用_php8.4匿名类创建与
- Win11声音忽大忽小怎么办 Win11音频增强功
- php能控制zigbee模块吗_php通过串口与c
- c++中的Tag Dispatching是什么_c
- c++中如何进行二进制文件读写_c++ read与
- Windows蓝屏错误0x0000001E怎么修复
- C++友元类使用场景_C++类间协作设计方式讲解
- Golang如何测试HTTP中间件_Golang
- Win11如何关闭游戏模式 Win11禁用Xbox
- php485在macos下怎么配置_php485

tGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
QQ客服