0

0

c++如何进行单元测试_c++ gtest框架使用【指南】

冰火之心

冰火之心

发布时间:2026-02-07 15:55:23

|

661人浏览过

|

来源于php中文网

原创

快速跑通首个GTest测试只需三步:安装v1.14.0+版本、正确配置头文件与链接-lgtest -lgtest_main -pthread、编写含TEST宏和RUN_ALL_TESTS()的最简代码;常见链接错误需检查是否遗漏gtest_main或库文件。

c++如何进行单元测试_c++ gtest框架使用【指南】

怎么快速跑通第一个 GTest 测试用例

直接能跑起来,是验证环境是否配好的最有效方式。别先纠结宏、断言类型或测试套件结构,先让 TEST 编译通过并执行成功。

  • 确保已安装 GTest(推荐用 v1.14.0+),头文件路径包含 gtest/gtest.h,链接时加上 -lgtest -lgtest_main -pthread
  • 最简测试代码只需三行:包含头文件、写一个 TEST 宏、调用 RUN_ALL_TESTS()
  • 常见卡点是链接失败——undefined reference to `main' 表示没连 gtest_mainundefined reference to `testing::Test::Test()' 说明只连了头文件没连库
#include 
TEST(FirstTest, BasicAssertion) {
  EXPECT_EQ(2 + 2, 4);
}
int main(int argc, char **argv) {
  ::testing::InitGoogleTest(&argc, argv);
  return RUN_ALL_TESTS();
}

EXPECT_EQ 和 ASSERT_EQ 到底该选哪个

它们不是“可互换的断言变体”,而是控制流分支点:一个继续执行,一个立刻返回。选错会导致后续逻辑误判或崩溃。

  • EXPECT_EQ:失败时打印错误但不中断当前函数,适合检查多个独立条件(比如验证对象多个字段)
  • ASSERT_EQ:失败时直接 return 当前测试函数,适合前置条件检查(如指针非空、容器非空)
  • 混用场景举例:先用 ASSERT_FALSE(vec.empty()) 确保有数据,再用 EXPECT_EQ(vec[0], 42) 检查值——避免访问越界

如何测试私有成员或未导出函数

GTest 本身不提供“打破封装”的能力,强行测私有会破坏设计边界。真正可行的路径只有两条:改接口 or 改测试视角。

闪电说
闪电说

AI语音输入法

下载
  • 不推荐 friend class + GTest 的测试类——这会让生产代码为测试污染,且无法跨编译单元生效
  • 更合理的方式是:把私有逻辑拆成独立函数(如 static 或匿名命名空间内函数),在测试中直接调用;或通过公有接口间接覆盖(例如调用 process() 后检查输出/状态)
  • 若必须测私有行为(如算法中间状态),考虑将类拆为 interface + impl,对 impl 单元测试——这时私有成员自然变成 impl 类的公有成员

为什么测试运行时提示 “Death Test” 失败或超时

死亡测试(ASSERT_DEATH 等)本质是 fork 子进程执行被测代码,并监控其是否按预期 crash。它对运行环境敏感,不是所有平台都默认可用。

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

  • Linux 下需启用 -DGTEST_HAS_DEATH_TEST=1 编译,并确保未禁用 fork()(如容器中无权限、seccomp 策略拦截)
  • Windows 默认不支持,除非用 gtest_force_shared_crt 链接 CRT 并启用 /MD,否则会报 death test not supported
  • 调试时禁用死亡测试:加命令行参数 --gtest_death_test_style=threadsafe 或临时替换为 EXPECT_DEBUG_DEATH(仅 debug build)
GTest 的复杂度不在语法,而在如何让它和你的构建系统、CI 流程、以及代码演进节奏咬合。最容易被忽略的是测试二进制的部署方式——静态链接 gtest 库比动态链接更可控,尤其当 CI 节点环境不一致时。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1296

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

276

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2200

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

34

2026.01.19

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

536

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

17

2025.12.06

go中interface用法
go中interface用法

本专题整合了go语言中int相关内容,阅读专题下面的文章了解更多详细内容。

77

2025.09.10

undefined是什么
undefined是什么

undefined是代表一个值或变量不存在或未定义的状态。它可以作为默认值来判断一个变量是否已经被赋值,也可以用于设置默认参数值。尽管在不同的编程语言中,undefined可能具有不同的含义和用法,但理解undefined的概念可以帮助我们更好地理解和编写程序。本专题为大家提供undefined相关的各种文章、以及下载和课程。

5507

2023.07.31

Golang处理数据库错误教程合集
Golang处理数据库错误教程合集

本专题整合了Golang数据库错误处理方法、技巧、管理策略相关内容,阅读专题下面的文章了解更多详细内容。

2

2026.02.06

热门下载

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

精品课程

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

共48课时 | 8.6万人学习

Git 教程
Git 教程

共21课时 | 3.4万人学习

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

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