17370845950

C++如何使用GTest编写单元测试?(入门教程)
用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; },测试代码如下:

#include 

int 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 起)。