C++如何使用Google Test框架进行单元测试?(GTest入门)

13次阅读

Google Test 入门关键是快速跑通首个测试用例。需下载源码、用 CMake 编译生成 libgtest.a 和 libgtest_main.a;编写含 TEST 宏的测试文件;链接库并添加 -pthread 编译运行;成功输出 2 个测试通过结果。

C++ 如何使用 Google Test 框架进行单元测试?(GTest 入门)

Google Test(GTest)是 C ++ 最主流的单元测试框架,轻量、跨平台、与主流构建系统兼容好。入门关键不是写复杂断言,而是快速跑通第一个测试用例——从编译链接到执行验证,一步都不能跳。

1. 下载与编译 GTest

GTest 官方推荐以源码方式集成(避免 ABI 兼容问题)。从 GitHub 仓库 克隆或下载最新 release 源码:

  • 解压 后进入 googletest 目录,建议用 CMake 构建(支持 Windows/Linux/macOS)
  • 新建 build/ 子目录,运行:
    cmake -DCMAKE_BUILD_TYPE=Release .. && cmake --build .
  • 构建完成后,你会得到 libgtest.a(静态库)和 libgtest_main.a(含默认 main 函数)

2. 编写第一个测试文件

创建 hello_test.cpp,内容如下:

#include <gtest/gtest.h>  // 被测函数(可放在单独头文件中)int add(int a, int b) {return a + b;}  // 测试用例:TEST(测试套名, 测试名) TEST(AddTest, PositiveNumbers) {EXPECT_EQ(add(2, 3), 5);   EXPECT_EQ(add(0, 0), 0); }  TEST(AddTest, NegativeNumbers) {EXPECT_EQ(add(-1, -1), -2); }

注意:
TEST 宏自动生成测试函数和注册逻辑,无需手动写 main()
EXPECT_* 是非致命断言(失败继续执行),ASSERT_* 是致命断言(失败立即退出当前测试)

3. 编译并运行测试

假设 GTest 头文件在 ./googletest/include,静态库在 ./googletest/build/lib

立即学习C++ 免费学习笔记(深入)”;

  • Linux/macOS 示例命令:
    g++ -I./googletest/include hello_test.cpp -L./googletest/build/lib -lgtest -lgtest_main -pthread -o hello_test && ./hello_test
  • Windows(MSVC)需链接 gtest.libgtest_main.lib,并启用多线程运行时(/MT 或 /MD)
  • 成功运行会输出类似:
    [==========] Running 2 tests from 1 test suite.
    [RUN] AddTest.PositiveNumbers
    [OK] AddTest.PositiveNumbers (0 ms)
    [RUN] AddTest.NegativeNumbers
    [OK] AddTest.NegativeNumbers (0 ms)

4. 常用断言与进阶提示

基础断言覆盖大多数场景:

  • EXPECT_EQ(val1, val2):比较相等(内置类型或重载了 operator== 的类)
  • EXPECT_TRUE(condition) / EXPECT_FALSE(condition)
  • EXPECT_STREQ(str1, str2):C 风格字符串内容比较
  • EXPECT_THROW(statement, exception_type):验证是否抛出指定异常

小技巧:
– 使用 TEST_F 配合测试夹具(fixture)管理共享资源(如临时文件、对象实例)
– 添加 --gtest_filter=AddTest.* 运行指定测试子集
– 加 --gtest_list_tests 查看所有已注册测试用例名

基本上就这些。不复杂但容易忽略的是链接 -pthread(Linux/macOS 必须)和正确包含头文件路径。跑通第一个 EXPECT_EQ 后,剩下的就是按需组织测试逻辑了。

星耀云
版权声明:本站原创文章,由 星耀云 2025-12-21发表,共计1624字。
转载说明:转载本网站任何内容,请按照转载方式正确书写本站原文地址。本站提供的一切软件、教程和内容信息仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。
text=ZqhQzanResources