Google Test 与 Google Mock:C++ 测试与模拟的完美结合

基于gtest、mockcpp写C++LLT测试入门级教程 一、googletest 下载地址:https://github.com/google/googletest 编译googletest: 在根目录下执行 cmake . make 编译出的libgtest.a后面用 注意:有可能编译会失败,是gtest需要C++11以上 可以在顶级的CMakeList.txt里加入 set(CMAKE_CXX_STANDARD 11) 二、mockcpp 下载地址:https://code.google.com/archive/p/mockcpp/downloads 编译 阅读详情
AI摘要

本文深入解析Google Test和Google Mock在C++项目中的应用。介绍了两者核心功能、用法及联合使用方式,还详细阐述多种集成方法,包括源码级、CMake FetchContent等。同时给出实践注意事项,如代码结构设计、测试可维护性等,助开发者提升代码质量。

Google Test 与 Google Mock:C++ 测试与模拟的完美结合

摘要

本文深入解析 Google Test(GTest)和 Google Mock(GMock)的核心功能与使用方法,探讨两者在 C++ 项目中的联合应用及集成策略。通过详细的功能介绍、代码示例以及实践注意事项,帮助开发者高效利用这两款工具提升代码质量与可维护性。

一、Google Test(GTest)核心功能与用法

测试框架基础

Google Test 是一款基于 xUnit 架构的 C++ 测试框架,支持自动发现和运行测试用例,简化单元测试流程。

  1. 测试用例结构
    使用 TEST 或 TEST_F 宏定义测试用例,支持测试套件(Test Fixture)复用初始化逻辑。

    TEST(CalculatorTest, Add) {
        EXPECT_EQ(3, Add(1, 2));  // 验证加法结果
    }
    
  2. 断言机制
    提供两类断言:

    • EXPECT_*:非致命断言,失败后继续运行后续测试。
    • ASSERT_*:致命断言,失败时终止当前测试。
      断言覆盖数值比较、异常检测、条件验证等场景。

集成方法

  1. 源码级集成
    将 GTest 源码嵌入项目,通过 CMake 的 add_subdirectory 编译,避免系统级安装依赖。

  2. 预编译库链接
    若已安装系统级库,使用 find_package(GTest REQUIRED) 和 target_link_libraries 链接。

使用场景

  • 单元测试:验证函数或类的独立功能逻辑。
  • 集成测试:测试模块间接口交互,确保组合逻辑符合预期。

二、Google Mock(GMock)核心功能与用法

模拟对象(Mock)创建

通过 MOCK_METHOD 宏声明需模拟的虚函数,生成模拟类。

class MockDatabase : public Database {
public:
    MOCK_METHOD(bool, Connect, (const string& url), (override));
};

行为控制与验证

使用 EXPECT_CALL 设置模拟方法的调用次数、参数匹配规则及返回值。

TEST(DatabaseTest, ConnectionTest) {
    MockDatabase db;
    EXPECT_CALL(db, Connect("localhost")).WillOnce(Return(true));
    ASSERT_TRUE(db.Connect("localhost"));
}

集成方法

  1. 依赖注入
    通过构造函数或 Setter 注入模拟对象,替代真实依赖(如网络、数据库)。

  2. CMake 配置
    与 GTest 类似,通过 find_package 或源码集成,需同时链接 gmock 库。

使用场景

  • 隔离外部依赖:模拟外部服务以消除测试环境不稳定性。
  • 复杂交互验证:验证模块间调用顺序、参数传递等交互逻辑。

三、GTest 与 GMock 联合使用

测试框架整合

  1. 统一主函数
    通过 RUN_ALL_TESTS() 执行所有测试用例,GMock 的模拟对象可直接在 GTest 用例中使用。

  2. 生命周期管理
    利用 SetUp() 和 TearDown() 管理模拟对象的初始化和资源释放。

典型应用模式

  1. 依赖解耦测试:通过 GMock 模拟依赖项,结合 GTest 验证核心逻辑的正确性。
  2. 边界条件测试:模拟异常输入或依赖故障,验证系统的容错能力。

四、集成方法详解

1. 源码级集成

  • 下载源码并编译:通过 Git 克隆 GTest 和 GMock 仓库,生成静态库文件。
    git clone https://github.com/google/googletest.git
    cd googletest
    mkdir build && cd build
    cmake .. -DBUILD_SHARED_LIBS=OFF  # 生成静态库
    make
    
  • 项目配置:在 CMake 中指定头文件路径和静态库文件。
    include_directories(googletest/include)
    add_executable(MyTest test.cpp)
    target_link_libraries(MyTest googletest/build/lib/libgtest.a pthread)
    

2. 使用 CMake FetchContent(推荐)

  • 自动下载与编译:利用 CMake 的 FetchContent 模块动态拉取源码并集成。
    include(FetchContent)
    FetchContent_Declare(
      googletest
      GIT_REPOSITORY https://github.com/google/googletest.git
      GIT_TAG release-1.12.1
    )
    FetchContent_MakeAvailable(googletest)
    
  • 链接测试目标:定义测试可执行文件并关联依赖。
    add_executable(MyTest test.cpp)
    target_link_libraries(MyTest PRIVATE gtest_main gmock)
    

3. 预编译库集成(系统级安装)

  • 安装系统级库:将编译后的库文件安装到标准路径。
    cd googletest/build
    sudo make install  # 安装到 /usr/local/
    
  • CMake 配置:使用 find_package 定位已安装的库。
    find_package(GTest REQUIRED)
    find_package(GMock REQUIRED)
    add_executable(MyTest test.cpp)
    target_link_libraries(MyTest GTest::GTest GTest::Main GMock::GMock)
    

4. 集成场景对比

方法适用场景优点缺点
源码级集成需要定制编译选项或调试源码完全控制依赖版本和编译参数项目体积增大,维护成本较高
CMake FetchContent快速集成且无需预装依赖自动化依赖管理,版本灵活首次编译需下载源码,时间较长
预编译库团队统一环境或 CI/CD 流水线编译速度快,环境统一依赖系统路径,跨平台兼容性差

五、实践注意事项

代码结构设计

采用接口抽象(如虚基类)以便 GMock 生成模拟类,避免对具体实现的强依赖。

测试可维护性

避免过度模拟,仅针对关键依赖项使用 GMock,减少测试与实现的耦合。

编译与链接

确保编译选项(如 C++ 标准版本)与 GTest/GMock 兼容,避免符号冲突。

线程安全支持

必须添加 -lpthread 或 pthread 链接选项,否则可能引发运行时崩溃。

主函数控制

若需自定义 main 函数,需移除 gtest_main 链接项并手动初始化框架:

int main(int argc, char **argv) {
  testing::InitGoogleTest(&argc, argv);
  testing::InitGoogleMock(&argc, argv);  // GMock 初始化
  return RUN_ALL_TESTS();
}

跨平台兼容性

Windows 环境下需替换 -lpthread 为系统线程库,并确保 CMake 生成器匹配编译器版本。

总结

Google Test 和 Google Mock 是 C++ 项目中不可或缺的测试工具。通过合理使用两者的功能与集成方法,开发者可以高效地进行单元测试与交互验证,显著提升代码质量与可维护性。无论是小型项目还是大型系统,这两款工具都能提供强大的支持,帮助团队构建更可靠的软件产品。

Google Mock(GMock):C++单元测试的高效模拟框架详解 Google Mock(GMock)是C++单元测试中的核心工具,能够高效隔离外部依赖并验证复杂交互逻辑。本文详细介绍了GMock的核心功能、典型使用场景、高级用法及注意事项,帮助开发者掌握如何利用GMock构建灵活、可靠的单元测试框架。通过模拟对象创建、行为控制、调用验证等功能,GMock能够显著提升测试的精细度和场景覆盖能力,适用于复杂依赖链测试、异常边界测试及性能敏感测试等场景。 阅读详情

相关推荐

【C/C++】单元测试实战:Stub与Mock框架解析

单元测试框架

YZJincsdn的博客 2405

GoogleTest之创建Mock

mock是用来模拟对象隔离边界的一种测试方法,以便在开发阶段不需要依赖第三方或其他依赖项可以进行独立的测试。

u010378559的博客 3671

C++单元测试框架选型指南:Google Test、Catch2、doctest与Boost.Test深度对比

单元测试是保障软件质量、实践测试驱动开发(TDD)的核心环节,它通过隔离验证代码单元的行为,确保其正确性与健壮性。在C++生态中,由于缺乏统一标准,框架选型成为开发者面临的首要挑战。不同的框架在设计哲学、易用性、性能与集成度上各有侧重,直接影响着测试实践的可持续性与开发效率。本文聚焦于Google Test、Catch2、doctest和Boost.Test这四大主流框架,从设计哲学、断言能力、测试固件、构建集成、社区生态等多个维度进行深度横评,并结合编译速度、Mock框架搭配等工程实践,为不同规模与场景的

weixin_33851604的博客 993

GTEST/GMOCK介绍与实战

gtest全称是google test是一个C++测试框架gmock是和gtest一起用的mock框架gtest使用教程:gtest工程代码下的googletest/docs/index.mdgtest进阶教程:googletest/docs/advanced.md所有例子说明:googletest/docs/samples.md。

喜欢打篮球的普通人 2306

探索 Google Test: 从基础断言到高级 Mock 技巧

本文系统地介绍了 Google Test 框架的使用, 从基础断言方法到高级测试技巧, 包括异常测试, 退出测试和 Mock 行为模拟. 通过具体的代码示例, 展示了如何测试整型, 字符串, 浮点数等不同数据类型, 以及如何在复杂场景下模拟接口类行为.

一些C++相关的技术笔记或者教程. 702

Google Test与Google Mock源码解析及实战应用

简介:Google Test(gtest)是Google推出的开源C++单元测试框架,配合Google Mock(gmock)可实现强大的测试驱动开发。本资源包含gtest-1.7.0和gmock-1.7.0源码,涵盖测试套件、断言机制、模拟对象、参数化测试等核心功能。通过该框架,开发者可编写结构清晰、可维护性强的测试用例,支持跨平台编译与运行,广泛应用于TDD流程中,有效提升代码质量与可靠性。

weixin_35750747的博客 929

【单元测试】Google Test(GTest)和Google Mock(GMock)--编辑中

目录 google test简介 入门例子 进阶 Gtest简介 GoogleTest 是 Google 的 C++ 测试和模拟框架,是库,提供了一些API接口,用于测试你的程序。 我们编写测试文件,里面调用GoogleTest的API 测试我们的函数。然后编译的时候把GoogleTest的库链接进来即可。 入门例子 编译环境中安装Gtest,既编译Gtest的源码编出Gtest的库gtest,放到链接目录下(供后面测试代码链接它和调用它的API) $ git clone ht.

我的笔记本 1万+

MIT Bevfusion环境安装 Docker方式,nuscenes数据处理

Bevfusion环境安装,数据生成报错解决module 'numpy' has no attribute 'long';most likely due to a circular import。bevfusion docker环境

Jack_Man_N的博客 1144

GoogleTest中gMock的使用

GoogleTest中gMock的使用

网络资源是无限的 6309

迈创cameralink采集卡安装操作说明

迈创cameralink采集卡安装操作说明MIL软件安装MIL软件下载获取MIL软件安装MIL软件安装常见问题 MIL软件安装 MIL软件下载获取 MIL软件安装 解压MIL安装包,点击MilSetup.exe开始安装,如下图所示; 备注:64位系统MIL软件可以同时安装32位和64位客户端,本文档默认安装64位客户端,64位系统安装32位MIL方法后续再展开讲(不建议这样用,很麻烦) 点击Launch Installation开始安装,64位系统,默认只安装64位MIL客户端 根据采集卡驱动,选择M

qq_23107577的博客 9353

别再手动备份了!用Python脚本批量导出华为/华三交换机配置(附完整代码)

本文详细介绍了如何使用Python脚本实现华为/华三交换机配置的自动化备份,大幅提升网络运维效率。通过paramiko库建立SSH连接,结合pandas处理设备清单,实现配置的批量导出与规范化存储,解决传统手动备份耗时易错的问题。

weixin_28737603的博客 449

TEN-framework 中的 Google Mock 入门指南:基于 gmock 的 C++ 接口模拟与交互测试实战

本指南以仓库内 [third_party/googlemock/docs/ForDummies.md](https://link.gitcode.com/i/a8314de6b256499042b2e830d7931fbe) 为主体骨架,系统讲解 Google C++ Mocking Framework(Google Mock)的核心概念、Mock 类编写、期望(Expectation)设置与测试

gitblog_00109的博客 418

使用verilog实现基于FPGA的TDC设计

verilog实现TDC 高精度时间数字转换器概述(TDC) 简介: TDC被用于测量时间间隔,应用在物理研究、飞行时间测量领域等。 本设计使用verilog实现并在xilinx和altera的FPGA上均可实现! 设计中使用到下述几个模块,包括FIFO,COUNT等,在xilinx下也使用到了一些原语等。下面有实现的代码和仿真截图等。 顶层模块设计如下: module top( input wire start, input wire stop, input wire clk, output wire T

QQ_778132974的博客 6253

Google Mock 集成指南:WeexCore 测试体系中的 C++ Mock 框架详解

Google Mock 是 Google 出品的 C++ 模拟(Mock)框架,用于编写和使用 C++ mock 类,帮助开发者改进系统设计并编写更高质量的测试。在 Weex 开源仓库中,Google Mock 与 Google Test 一起以第三方源码形式随 WeexCore 原生内核(`weex_core/`)的测试工程引入,为 `weex_core` 的 C++ 层(如 wson、布局引擎

gitblog_00015的博客 415

059、肤色还原专项调优:记忆色、颜色偏好建模与主观评价标准

文章摘要:肤色还原调优的技术挑战与实践经验 本文系统探讨了手机影像中肤色还原的技术难点与解决方案。通过实际案例揭示了肤色还原的本质是记忆色与颜色偏好的博弈,而非单纯的技术指标达标。文章详细分析了记忆色的三大特性(高饱和、地域差异、场景依赖)和颜色偏好的数学建模方法,提出了基于YCbCr/Lab空间的参数化模型和代价函数设计。在评价体系方面,强调主观评价的重要性,并分享了专家评审、用户调研、场景覆盖的三级验证方法。最后总结了实战中的关键经验,包括肤色检测优化、过渡处理、动态范围管理及视频/拍照差异策略。文章指

sundong_81的博客 250

多智能体系统在AI物流优化中的实际应用案例

订单波峰波谷难应对(如双11订单量暴增300%);动态干扰难处理(如突发交通拥堵、客户临时改地址);全局优化难实现(单辆车最优≠整体最优)。本文聚焦“多智能体系统(MAS)”这一AI技术,讲解其如何通过“群体智能”破解物流调度难题,并结合实际案例展示落地效果。本文从“生活故事→核心概念→技术原理→实战案例→未来趋势”逐步展开,用“快递员团队协作送外卖”类比MAS运作,结合Python代码模拟任务分配,最后通过某物流企业的真实项目验证效果。

AIGC应用创新大全的博客 1632

告别测试困境:C++单元测试框架与Mock技术全指南

你是否还在为C++项目的单元测试而烦恼?是否因依赖复杂难以隔离而放弃测试?本文将带你系统掌握主流C++测试框架与Mock技术,让测试效率提升300%。读完本文,你将能够:选择适合项目的测试框架、编写可维护的测试用例、使用Mock技术隔离外部依赖、构建完整的测试体系。 ## 测试框架选型指南 C++生态中有多种成熟的测试框架,各具特色。以下是工业界最常用的几种框架对比: ### 轻量级首选:d...

gitblog_01194的博客 1228

planning模块(6)-参考线的平滑(二次规划)

上一篇已经介绍了采样点生成锚点数据的过程,并且将所有采样点生成的锚点数据设置到了平滑器中.接下来继续介绍使用二次规划平滑参考线的算法过程.从锚点数据中提取坐标存入raw_point2d,提取横向边界存入anchorpoints_lateralbound,将起点和终点的横向边界设置为0,防止车在起点和终点位置偏离车道中心线.

让复杂的问题变得更容易理解 787

深入Google Test与Google Mock源码:从原理到实战的单元测试进阶指南

单元测试是保障软件质量、提升开发效率的核心工程实践。其原理在于通过隔离代码单元,验证其行为是否符合预期,从而在早期发现缺陷,降低维护成本。在C++生态中,Google Test和Google Mock作为业界标杆测试框架,其技术价值在于提供了强大的断言、模拟和测试组织能力,能有效应对复杂模块的测试需求。通过深入源码理解其“测试即对象”和“期望即契约”的设计哲学,开发者可以掌握自定义断言、模拟复杂交互、定制测试报告等高级技巧,最终将源码层面的理解转化为解决实际测试难题的能力,例如调试诡异的测试失败或集成到CI

weixin_30599769的博客 409

uni-app 实现高德 / 百度 / 腾讯地图多端导航跳转(H5最全方案)

本文介绍了一套生产级可复用的多地图导航Hook封装方案。针对开发中常见的经纬度顺序混乱、中文乱码、参数不统一等问题,提供了统一解决方案。方案支持高德、百度、腾讯三大地图平台,封装了各平台的URI参数处理逻辑,包括坐标顺序转换、名称编码、导航模式适配等核心功能。通过组合式API设计,开发者只需调用统一入口即可实现多地图导航跳转,同时保留单独调用各平台的能力。文中还总结了6大常见坑点,并推荐默认使用高德地图作为最稳定的导航方案。该方案适用于车辆定位、物流配送等多种业务场景,可封装为可复用的Hooks组件。

专注于前端开发与实战技巧,记录从零到一的学习与项目经验。分享 Vue3 / JavaScript / TypeScript / Flutter /Uniapp等前端技术,以及 性能优化、工程化、最佳实践。 537

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C++单元测试实践:GoogleTest与Google Mock从入门到工程落地

单元测试是保障代码质量与重构安全性的核心手段,尤其对于缺乏内置反射机制的C++,一套可靠的测试框架至关重要。测试的本质是将函数或类的输入输出固化为行为契约,使每次改动都能被快速验证,从而抵御回归风险。GoogleTest作为企业级C++测试框架的代表,提供了丰富的断言、测试夹具复用、参数化数据驱动及死亡测试等机制,配合Google Mock可模拟数据库、网络等外部依赖,让被测代码在隔离环境中稳定运行。通过CMake与CTest的集成,测试用例可自动发现并纳入CI流水线,实现提交即验证。本文以零基础视角展开,

weixin_30947043的博客 276

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

google单元测试用例编写

1、测试概述 测试并不只是测试工程师的责任,对于开发工程师,为了保证发布给测试环节的代码具有足够好的质量( Quality ),为所编写的功能代码编写适量的单元测试是十分必要的。 2、测试之间的关系 白盒测试:全面了解程序内部逻辑结构,对所有逻辑路径进行测试。 单元测试:对软件基本组成单元进行的测试,这里的单元是软件设计的最小单位,单元测试属于白盒测试范畴。 打桩:在做单元测试或者集成测试时,如果某个程序单元的某条语句需要调用的一个外部函数还没有完成的话,可以简单让它返回几个支持测...

找个特立不独行的名的博客 1640

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【Google mock(g_mock)学习记录】

Google mock 学习记录

weixin_43966547的博客 2304

C++测试框架实战指南:Google Test与Catch2核心对比与应用

单元测试是软件工程中保障代码质量的核心实践,通过隔离最小可测试单元并自动化验证其行为,能够有效提升代码的健壮性与可维护性。其原理在于构建快速反馈机制,通过断言验证预期输出,并利用测试替身(如Mock对象)模拟外部依赖。这一技术价值在于支持持续集成与安全重构,是工程化开发范式的关键。在C++生态中,Google Test以其强大的Mock库(Google Mock)和成熟的参数化测试功能著称,尤其适合大型项目与复杂场景;而Catch2则凭借其极简的Header-only部署和独特的BDD风格语法,为追求开发效

weixin_34296641的博客 388

【C++ 硬核】摆脱开发板:用 Google Test + Mock 构建嵌入式 TDD (测试驱动开发) 体系

/ 定义 Flash 的抽象行为,不包含任何 STM32 代码public:public:2. 编写业务逻辑 (只依赖接口)// 引用接口,而非具体类public:// 依赖注入:在构造时传入具体的实现// 写入地址 0,模拟 4 字节数据if (!success) {// 如果写入失败,尝试擦除public:// MOCK_METHOD(返回值, 函数名, (参数...), (修饰符));public:嵌入式开发不应该等同于“硬件调试”。通过引入和。

Max_uuc的博客 1001
上一篇: 大型项目单元测试与代码覆盖率分析全流程指南(基于gtest、lcov及genhtml)
下一篇: Google Mock(GMock):C++单元测试的高效模拟框架详解
未来创世纪
博客等级 码龄18年 960粉丝 209原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值