最简路径是:写一个.cpp文件,包含#include ,用test(套件名, 用例名)定义测试,编译时链接gtest_main库(如-lgtest_main -pthread),它自带main()入口并自动调用initgoogletest和run_all_tests,避免undefined reference to 'main'。

直接上手写测试,不用先搭环境、不用改构建系统——TEST宏一写就能跑,但前提是链接对了gtest_main,否则会报undefined reference to 'main'。
怎么让一个TEST()函数真正跑起来
最简路径是:写一个.cpp文件,包含#include <gtest></gtest>,用TEST(套件名, 用例名)定义测试,然后编译时链接gtest_main库。它自带main()入口,省去手写初始化逻辑。
- 别用
find_package(GTest)再自己写main()——容易漏掉::testing::InitGoogleTest()调用,导致断言不输出失败详情 - 用
FetchContent_Declare拉源码是最稳的,避免系统包版本太老(比如 Ubuntu 22.04 自带的libgtest-dev是 v1.11,而最新稳定版是 v1.14.0) - 如果只测单个文件,临时编译命令可以是:
g++ -std=c++17 test.cpp -lgtest_main -pthread -o test && ./test;注意必须加-pthread,否则EXPECT_DEATH等依赖线程的断言会卡死
EXPECT_EQ和ASSERT_EQ到底该选哪个
区别不在“期望”还是“断言”,而在**执行流控制**:前者失败只记日志、继续跑本测试函数里后续语句;后者直接return,跳过后面所有逻辑。
在 Linux 上使用 rclone + gog OAuth 配置 Google Drive 挂载。适用于将 Google Drive 挂载为本地文件系统、设置开机自动挂载或进行其他相关配置。
- 适合用
ASSERT_EQ的场景:auto ptr = create_resource(); ASSERT_NE(ptr, nullptr); use(ptr);——资源创建失败,后面根本没法测 - 适合用
EXPECT_EQ的场景:EXPECT_EQ(calc.add(2,3), 5); EXPECT_EQ(calc.add(-1,1), 0); EXPECT_EQ(calc.add(0,0), 0);——一次看全所有输入组合是否达标 - 浮点比较别硬套
EXPECT_EQ,用EXPECT_FLOAT_EQ(a, b)或EXPECT_NEAR(a, b, 1e-5),否则0.1 + 0.2 != 0.3这种经典问题会让你怀疑人生
测试类(TEST_F)什么时候必须用
当你发现多个TEST里反复出现相同对象构造/销毁、文件打开/关闭、内存分配/释放时,就该切到TEST_F了——它自动为每个测试用例提供独立的实例,并保证SetUp()和TearDown()成对执行。
-
TEST_F类里的成员变量(如std::vector<int> data_</int>)在每个测试用例开始前都重新构造,不会被上一个用例污染 - 共享资源(比如全局缓存指针、数据库连接池)得用
static void SetUpTestCase(),它在整个测试套件生命周期内只执行一次 - 别在
SetUp()里做耗时操作(如读大文件),否则每个测试都会拖慢;真要复用,考虑用static局部变量+双重检查锁,或者提前在SetUpTestCase里准备
为什么测试总在CI里挂,本地却好好的
常见原因不是代码问题,而是测试没隔离干净:文件路径写死、环境变量依赖、时间相关断言、静态变量残留。
- 用
mktemp或std::filesystem::temp_directory_path()生成临时路径,别写"./test_data" - 避免
std::time(nullptr)直接比大小,改用EXPECT_LT(std::chrono::system_clock::now(), deadline)这类可控制的时钟 - 死亡测试
EXPECT_DEATH默认用fork(),在容器或某些CI环境里可能被禁用,需加--gtest_death_test_style=threadsafe参数启动 - 如果用了
static变量或单例,测试结束后没重置,下一个测试就会拿到脏状态——TEST_F的TearDown()里记得清理
最难调试的永远是那些“只在别人机器上失败”的测试,核心就一条:每个TEST或TEST_F必须像无状态函数一样运行,不依赖外部时间、路径、进程环境或上一个用例的遗留数据。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










