用GTest写C++单元测试核心三步:安装GTest(推荐源码编译)、编写测试用例(用TEST宏和EXPECT_/ASSERT_断言)、CMake编译运行(链接GTest::gtest_main)。

用 GTest 写 C++ 单元测试,核心就三步:安装 GTest、写测试用例、编译运行。不需要复杂配置,Linux/macOS 下用 CMake 最稳,Windows 用 Visual Studio 也能快速上手。
安装 GTest(推荐源码编译)
GTest 官方不提供系统包管理器的稳定二进制,直接拉源码编译最可控:
- 克隆仓库:
git clone https://github.com/google/googletest.git - 进入目录并创建构建文件夹:
cd googletest && mkdir build && cd build - 生成 Makefile 或 VS 工程:
cmake .. -DCMAKE_BUILD_TYPE=Release - 编译安装:
cmake --build . --target install(默认装到/usr/local,需 sudo;也可加-DCMAKE_INSTALL_PREFIX=/your/path指定路径)
完成后,头文件在 include/gtest,库文件是 lib/libgtest.a(静态)或 lib/libgtest.so(动态)。
写一个最简测试文件
假设你有个待测函数 int Add(int a, int b) { return a + b; },测试代码如下:
立即学习“C++免费学习笔记(深入)”;
#includeint Add(int a, int b) { return a + b; }
// 测试用例必须放在 TEST 宏里,格式:TEST(测试套名, 测试名) TEST(AddTest, PositiveNumbers) { EXPECT_EQ(Add(2, 3), 5); // 推荐:失败继续执行 EXPECT_EQ(Add(0, 0), 0); }
TEST(AddTest, NegativeNumbers) { ASSERT_EQ(Add(-1, -1), -2); // 断言失败则终止当前测试函数 }
注意:EXPECT_* 是检查点,多个可共存;ASSERT_* 用于前置条件,失败立刻跳出。
用 CMake 编译运行测试
在项目根目录写 CMakeLists.txt:
cmake_minimum_required(VERSION 3.10) project(MyTest)查找 GTest(确保已安装到系统路径,或用 find_package(GTest REQUIRED CONFIG))
find_package(GTest REQUIRED) find_package(Threads REQUIRED)
add_executable(my_test test.cpp) target_link_libraries(my_test GTest::gtest GTest::gtest_main Threads::Threads)
gtest_main 提供了默认 main(),不用自己写
- 运行:
mkdir build && cd build && cmake .. && make && ./my_test - 输出类似:
[ RUN ] AddTest.PositiveNumbers
[ OK ] AddTest.PositiveNumbers (0 ms)
[ RUN ] AddTest.NegativeNumbers
[ OK ] AddTest.NegativeNumbers (0 ms) - 加
--gtest_filter=AddTest.*可只跑某个测试套;--gtest_help查看全部选项
常见小技巧
- 测试类复用:用
TEST_F配合class XXXTest : public ::testing::Test,在SetUp()/TearDown()里做初始化/清理 - 参数化测试:对同一逻辑测多组输入,用
INSTANTIATE_TEST_SUITE_P+TEST_P - 避免全局状态污染:每个 TEST 独立运行,不要依赖前一个测试的变量或文件
- 断言失败时自动打印值:比如
EXPECT_EQ(a, b)出错会显示Expected: a
Which is: 10
To be equal to: b
Which is: 12
不复杂但容易忽略:确保链接 GTest::gtest_main,否则要自己实现 main();编译时加上 -std=c++17(GTest 1.12+ 要求 C++14 起)。










