googleTest写c++单元测试核心是三步:写TEST宏定义的测试用例、用EXPECT_EQ/ASSERT_EQ等断言验证、运行二进制并用命令行参数过滤或调试;推荐vcpkg或submodule集成,优先链接GTest::gtest_main而非手写main。

用 googleTest 写 C++ 单元测试,核心是三步:写测试用例、断言验证行为、运行并看结果。它不强制依赖构建系统,但和 CMake 配合最顺手。
安装与集成 GoogleTest
推荐用 git submodule 或 vcpkg 管理依赖,避免手动编译带来的路径和 ABI 问题。
- 用 vcpkg:执行
vcpkg install googletest:x64-windows(windows)或googletest:x64-linux(Linux),再在 CMake 中find_package(GTest REQUIred) - 用 submodule:把 GoogleTest 克隆进
third_party/googletest,CMake 中用add_subdirectory(third_party/googletest),然后链接GTest::gtest_main - 注意:不要直接 #include “gtest/gtest.h” 后自己实现 main(),除非你明确需要自定义初始化逻辑;多数情况直接链接
gtest_main就自动有了入口函数
编写第一个测试用例
每个测试用例对应一个“测试套件 + 测试名”,用 TEST(TestSuiteName, TestName) 宏定义,里面写断言语句。
- 基础断言用
ASSERT_EQ(失败立即返回)或EXPECT_EQ(失败继续执行,适合检查多个条件) - 测试函数里不能有返回值,也不能传参数——所有输入数据应在测试体内构造
- 示例:TEST(MathUtils, AddReturnsCorrectResult) { EXPECT_EQ(5, add(2, 3)); }
组织测试与复用逻辑
当多个测试需要共享初始化/清理逻辑,用测试套件类(TEST_F)比全局 setup/teardown 更安全可靠。
立即学习“C++免费学习笔记(深入)”;
- 定义一个继承
testing::Test的类,在SetUp()和TearDown()中写公共资源的构造与析构 - 成员变量自动对每个测试独立实例化,避免测试间状态污染
- 使用时写
TEST_F(MyFixture, CanReadConfig) { EXPECT_TRUE(config_.is_valid()); }
运行与调试技巧
生成的测试可直接执行,支持命令行过滤、重复运行、输出 xml 等,开发时很实用。
- 只跑某套件:
./test_bin --gtest_filter=Network* - 重复跑 10 次找随机失败:
./test_bin --gtest_repeat=10 --gtest_break_on_failure - 生成 junit 格式报告供 CI 解析:
./test_bin --gtest_output=xml:test-report.xml - 在 ide(如 CLion、VS2022)中可直接点击绿色箭头运行单个 TEST,支持断点调试
基本上就这些。GoogleTest 不复杂但容易忽略初始化方式和断言选择,写熟了就是自然反应。