TEST宏的测试名不能含下划线,否则运行时找不到测试;必须使用大驼峰命名(如CalculatorTest、AddTwoNumbers),且均为合法C++标识符。

TEST宏写法不对,测试根本不会被发现
Google Test靠TEST宏注册测试用例,名字里不能含下划线,否则编译通过但运行时找不到测试。比如TEST(Calculator_Test, Add_2_3)是错的,会被解析成套件名Calculator、用例名Test,完全失焦。
- 正确写法:用驼峰或纯字母,如
TEST(CalculatorTest, AddTwoNumbers) - 套件名和用例名都必须是合法C++标识符,不能以数字开头
- 如果用
TEST_F,类名也得符合命名规则,且该类必须公有继承自testing::Test
链接gtest_main还是自己写main()?
多数项目直接链接gtest_main就够了——它已封装好testing::InitGoogleTest()和RUN_ALL_TESTS()。自己写main()只在需要定制初始化逻辑(比如设置信号处理器、读取配置)时才必要。
- CMake里写
target_link_libraries(MyTests GTest::gtest_main),别漏掉_main - 若手动g++编译,加
-lgtest_main -lgtest -pthread,顺序不能颠倒 - 自己写
main()时,必须调用testing::InitGoogleTest(&argc, argv),否则RUN_ALL_TESTS()可能崩溃
EXPECT_EQ vs ASSERT_EQ选哪个?
区别不在“是否报错”,而在“是否继续执行”。比如验证指针非空后还要解引用,就得用ASSERT_NE(ptr, nullptr),否则后续操作会段错误。
-
EXPECT_*:失败只记录错误,当前测试函数继续跑完 -
ASSERT_*:失败立刻return,跳过该测试函数剩余语句 - 对前置条件(如内存分配成功、文件打开成功)用
ASSERT;对业务逻辑结果用EXPECT
CMake集成时find_package(GTest)总失败
系统级安装的libgtest-dev(Ubuntu)或gtest-devel(CentOS)只提供源码,不生成库文件,find_package自然找不到。这不是路径问题,是根本没编译。
立即学习“C++免费学习笔记(深入)”;
- 最稳方案:用
FetchContent拉源码自动构建,避免系统包版本混乱 - 若坚持系统包,需手动编译:
cd /usr/src/gtest && cmake . && make && sudo cp libgtest*.a /usr/lib/ - 检查
GTest_DIR是否指向正确的CMake config路径,比如/usr/lib/x86_64-linux-gnu/cmake/GTest
TEST宏没被识别、链接时漏掉gtest_main、或者断言类型用反导致测试看似通过实则跳过关键校验。这些点不显眼,但一出问题就浪费半小时查环境。


















