-
GoogleTest(简称gtest)是由Google开源的一个用于C++单元测试(Unit Test)的测试框架,主要用于验证代码中各个函数、类或模块的行为是否符合预期。它提供了丰富的测试功能,包括测试用例组织、断言检查、测试夹具(Test Fixture)、参数化测试、测试结果统计等。开发者可以通过编写TEST()或TEST_F()测试函数,并使用EXPECT_*、ASSERT_*等断言宏判断程序输出是否正确。GoogleTest支持跨平台运行,能够与CMake、持续集成(CI)工具等结合,广泛应用于大型C++项目的自动化测试,提高代码质量和维护效率。
-
Linux获取GoogleTest的步骤:1执行命令sudo apt install libgtest-dev google-mock获取gtest和gmock的源码,源码一般会被放置在/usr/src/googletest/目录下;2编译源码:在/usr/src/googletest/目录下依次执行sudo mkdir build、cd build、sudo cmake ..、sudo make,如下图:

然后会在/usr/src/googletest/build/lib下会生成libgmock.a、libgmock_main.a、libgtest.a、libgtest_main.a四个静态库文件,到此编译成功,就可以使用gtest了。 -
GoogleTest源码下载并编译后,主要会生成几个重要文件,其中gtest.h和gmock.h是测试代码使用的头文件,用于提供测试框架和模拟对象测试相关的接口声明。开发者通过#include<gtest/gtest.h>可以使用TEST()、EXPECT_EQ()等单元测试功能,通过#include<gmock/gmock.h>可以使用MOCK_METHOD()、EXPECT_CALL()等模拟对象功能。libgtest.a是GoogleTest核心功能的静态库,包含测试框架的具体实现,负责提供testing::Test、InitGoogleTest()、断言处理等功能;libgtest_main.a是在libgtest.a基础上增加默认main()函数的静态库,当用户不希望自己编写测试程序入口时,可以链接该库自动完成测试初始化和执行。libgmock.a是GoogleMock的核心静态库,他依赖libgtest.a,libgmock.a提供模拟对象、行为设置、调用期望检查等功能,用于对具有外部依赖的模块进行隔离测试;libgmock_main.a则是在libgmock.a基础上增加默认main()函数的静态库,方便用户直接运行包含GoogleMock测试的程序。
-
GoogleTest中的测试组织结构可以从:单元测试(Unit Test)→测试套件(Test Suite)→测试案例(Test Case/Test)→断言(Assertion)几个层次来理解。单元测试是测试的整体概念,用于验证程序中的某个最小功能单元是否正确;测试套件用于组织一组具有相同测试目标的测试案例;测试案例是测试套件中的一个具体测试任务;断言是测试案例内部用于判断结果是否正确的检查语句。如下图:

-
GoogleTest中的断言分为EXPECT系列(非致命断言,Non-fatal Assertion)和ASSERT系列(致命断言,Fatal Assertion)两类,区别在于:EXPECT系列如果断言失败,测试案例会继续执行后续代码;ASSERT系列如果断言失败,立即终止当前测试案例的执行,其后的代码不会运行。在此基础上,又根据测试对象不同提供了布尔、数值、字符串、浮点数和异常等多种断言,用于验证程序运行结果是否符合预期。如下图:

-
GoogleTest中的简单测试(Simple Test)是最基本的测试方式,主要用于测试独立函数、简单功能或类中的单个接口。它不需要创建测试类,也不需要继承testing::Test,每个测试案例都是相互独立的。简单测试通过TEST()宏定义:

下图是一个代码示例:
-
当测试对象比较复杂,多个测试案例需要共享相同的测试环境、测试数据或资源初始化过程时,GoogleTest提供了测试夹具(Test Fixture)机制。测试夹具本质上是一个继承自testing::Test的测试类,用于统一管理测试过程中需要的对象和资源。与简单测试不同,测试夹具可以通过SetUp()和TearDown()函数完成测试前的初始化和测试后的清理工作。每个TEST_F测试案例执行时,GoogleTest都会创建一个新的测试夹具对象,主要过程为:创建测试夹具对象->调用SetUp()->执行TEST_F中的测试代码->调用TearDown()->销毁测试夹具对象。下图是一个例子:


下图是测试结果:
-
GoogleTest还提供了全局测试环境(Global Test Environment)功能,可以在所有测试运行之前和之后,统一进行资源初始化与清理,比如管理数据库连接、日志系统或全局配置。要使用这个功能首先需要创建一个继承自::testing::Environment的类,在其SetUp()函数中编写初始化代码,在TearDown()中编写清理代码,然后在在main()函数中,使用testing::AddGlobalTestEnvironment()注册这个环境对象。GoogleTest会接管这个指针的管理,我们不需要手动释放它。当RUN_ALL_TESTS()被调用时,会先执行所有已注册环境的SetUp(),然后执行所有测试用例,最后执行所有环境的TearDown()。下图是一个代码示例:

执行结果如下图:
-
RUN_ALL_TESTS()会运行所有测试,但Google Test提供了几种灵活的方法来控制具体执行哪些用例,其中最核心的方式是通过--gtest_filter命令行参数进行过滤。过滤字符串的规则为::表示正向模式列表(只有匹配这些模式的测试会被选中),-表示负向模式列表(匹配了负向模式的测试会被排除),模式中可以使用通配符,*匹配任意字符串,?匹配单个字符。假设我们的测试程序名为test_program,以下是一些常见用法:

还可以直接在代码中设置过滤规则,如下图:
-
GoogleTest提供了一套事件机制(Event Mechanism),允许用户在测试执行过程中的关键阶段插入自定义处理逻辑,例如记录日志、统计测试时间、生成测试报告、资源初始化与释放、内存泄漏检测等。GoogleTest的事件机制本质上是通过事件监听器(Test Event Listener)实现的。用户可以继承testing::TestEventListener,重写其中的回调函数,在测试框架执行到对应阶段时自动调用。主要事件函数如下:

下面是代码示例:
下图是执行结果:
-
GoogleMock通过创建一个模拟对象,让测试代码可以控制依赖对象的行为,并验证目标代码是否正确调用了这些接口。gMock使用一般分为三个步骤:定义接口->创建Mock类->测试中设置期望行为。在gMock中,EXPECT_CALL()用于设置Mock对象的预期行为,常配合.Times()、.WillOnce()、.WillRepeatedly()等修饰函数使用。总结如下:

下面是一个例子:
在g++ ./gmock.cpp -lgtest -lgmock -lgmock_main -pthread -o gmock命令编译源文件时,会找不到头文件gmock/gmock.h,这是因为之前只是编译了源码,并没有执行sudo make install安装到系统,可以通过添加几个软链接文件来解决:
gmock程序运行结果如下图:
-
TEST_P是GoogleTest提供的参数化测试(Parameterized Test)机制,用于使用同一套测试逻辑测试多组不同输入数据。普通TEST()每个测试案例的数据固定,而TEST_P()可以把测试数据参数化,通过不同参数自动生成多个测试案例。示例如下:

运行结果如下图:
GoogTest测试框架
世事如云有卷舒2026-08-10 10:34
相关推荐
hy.z_7772 小时前
【C++】9. Vector我能坚持多久2 小时前
优选算法——专题一双指针(上):附四道例题详解Tim_102 小时前
【C++】023、移动语义&深拷贝ShineWinsu2 小时前
对于C++中unordered_map的详细介绍东东最爱敲键盘3 小时前
day3.c++函数与预处理 stringdjjjx.3 小时前
【 C++ 】stack、queue、优先级队列、仿函数、容器适配器lingran__3 小时前
C++ 高阶数据结构:AVL 树万字详解|原理、四种旋转、key‑value 实现、调试校验、set/map/红黑树 底层前置知识爱和冰阔落3 小时前
【Linux】两个毫无关系的进程怎么通信?命名管道 FIFO 从原理到 Server/Client 实战码匠许师傅11 小时前
【C++ 面试真题】C++ 的 const 和 constexpr 有什么区别?