单元测试工具 GTest 介绍+快速入门

单元测试gtest的安装与使用方法【结合官网的sample】 gtest单元测试是Google的一套用于编写C++测试的框架,可以运行在很多平台上(包括Linux、Mac OS X、Windows、Cygwin等等)。基于xUnit架构。支持很多好用的特性,包括自动识别测试、丰富的断言、断言自定义、死亡测试、非终止的失败、生成XML报告等等,本文对gtest的安装以及基本使用方法进行细致说明,希望对您有所帮助。 阅读详情
AI摘要

本文介绍了C++单元测试框架GTest的基本用法,包括测试用例、断言机制、测试固件及链接时打桩技术,并对比了Ceedling工具的差异。重点讲解了测试文件的镜像目录结构、命名规范和CMake构建配置,最后分析了打桩失败的原因及解决方案。

一、GTest介绍

1.1 测试用例(Test Case)和 测试(Test):

  • TEST(): 宏,用于定义一个独立的测试。

  • 测试套件名(Test Suite Name): 逻辑上的一组相关测试的集合(例如,LinkedListTest, MathUtilsTest)。

  • 测试名(Test Name): 单个测试的具体名称(例如,InsertAtHead, AdditionOverflows)。

  • 语法: TEST(TestSuiteName, TestName) { ... test body ... }

1.2 断言(Assertions):

  • ASSERT_*: 如果断言失败,当前函数会立即返回(ASSERT_EQ 失败后,后面的语句不会执行)。

    • ASSERT_TRUE(condition): 验证条件为真。

    • ASSERT_EQ(val1, val2): 验证两个值相等。

    • ASSERT_STREQ(str1, str2): 验证两个 C 字符串相等。

    • ASSERT_NE, ASSERT_LT, ASSERT_GE 等。

  • EXPECT_*: 如果断言失败,测试会继续运行,并最终报告所有失败。这通常更受欢迎,因为它能一次运行显示所有问题。

    • EXPECT_TRUE(condition)

    • EXPECT_EQ(val1, val2)

    • EXPECT_STREQ(str1, str2)

    • 等等。

1.3 测试固件(Test Fixtures):

用于多个测试之间共享相同的配置和资源。对于测试需要初始化/清理的 C 结构体非常有用。

  • 创建一个继承自 ::testing::Test 的类。

  • 在类中定义你需要共享的变量(例如,一个 struct MyStruct*)。

  • 重写 SetUp() 方法(类似构造函数)进行初始化。

  • 重写 TearDown() 方法(类似析构函数)进行清理。

  • 使用 TEST_F() 宏来编写测试,它可以访问 fixture 中的成员。

1.4 打桩方法:链接时打桩(最常用、最推荐)

  • 不将真实的实现文件编译并链接到测试可执行文件中。

  • 在你的测试文件(test_database.cpp)中,重新定义(rewrite) 你需要打桩的函数。

  • 可能遇到的问题:函数重定义,解决方法:链接装饰器(推荐):在打桩函数前加前缀__wrap_,在测试文件对应的CMakeLists.txt文件中添加:

target_link_options(target PRIVATE 
    # "LINKER:--allow-multiple-definition"
    "LINKER:--wrap=打桩函数名称"
)
  • 打桩函数模板(可选,用于需要精确返回值,通过队列实现):
    template <typename T>
    class IgnoreAndReturn_Mock {
    public:
        std::queue<T> returnValues;
        int callCount;
        
        // 重置mock状态
        void reset() {
            while (!returnValues.empty()) returnValues.pop();
            callCount = 0;
        }
        
        // 设置返回值序列
        void setReturnSequence(const std::vector<T>& values) {
            reset();
            for (const T& val : values) {
                returnValues.push(val);
            }
        }
    };

    打桩模板类使用方法:

    //创建打桩模板类对象
    IgnoreAndReturn_Mock<bool> test_Mock;
    //桩函数
    extern "C" bool __wrap_test() {
        if (test_Mock.returnValues.empty()) {
            ADD_FAILURE() << "error,returnValues is empty";
        }
        test_Mock.callCount++;
        int result = test_Mock.returnValues.front();
        test_Mock.returnValues.pop();
        return result;  
    }
    //使用过程,在测试用例中调用被测函数前,先对桩模板对象进行重置和设置期望返回值序列
    test_Mock.reset();
    test_Mock.setReturnSequence({False,False,False,False,False,False});

1.5 对比Ceedling测试工具

核心区别:一体化框架 vs. 组合式组件

  • Ceedling:是一个一体化的、高度集成的测试框架和构建系统。它本身不是测试框架,而是一个用Ruby构建的“元工具”(metatool)。它集成了:

    • Unity:一个极简的、纯C的单元测试框架(提供断言、测试运行)。

    • CMock:一个强大的自动打桩(Mock)工具。

    • CException:可选,用于异常处理。
      Ceedling为你安排好了一切:目录结构、构建过程(调用底层的GCC等编译器)、运行测试、生成报告。你只需要遵循它的规则。

  • Gtest:是Google开发的一个功能强大的C++单元测试框架。它专注于一件事:提供丰富的断言、测试固件、组织测试用例。它不处理C语言的打桩(你需要自己手动或借助其他工具),也不强制规定你的项目结构或构建系统(通常与CMake/Makefile结合使用)。

总体而言,Ceedling更容易上手,更方便打桩,但仅仅支持纯C语言项目,GTest基于CMake工具,灵活性更高,但打桩比较麻烦,支持C/C++。

如果想了解Ceedling的使用方法,可以参考:

gtest测试框架 本文主要介绍gtest原理以及使用 阅读详情

相关推荐

一文读懂测试单元gtest

gtest 是 Google 开发的 C++ 单元测试框架,提供了丰富的断言、测试夹具和测试运行器等功能,帮助开发者编写高效、可维护的测试代码。好的测试单元应具备独立性、结构化组织、跨平台兼容性、丰富的失败信息、低维护成本和高执行效率等特点。gtest 通过自动注册机制、参数化测试和并行执行等特性,减少了测试代码的重复性,提升了测试效率。安装 gtest 可以通过克隆 GitHub 仓库并使用 CMake 进行编译和安装。gtest 的断言分为非致命断言(EXPECT_)和致命断言(ASSERT_),支持布

m0_73359068的博客 2368

c++单元测试之gtest测试框架快速上手

单元测试 模块级测试,与系统测试、集成测试等不同,它是对软件模块细分后的单元进行的细粒度测试,应该在开发过程中进行。 单元测试( Unit Test ,模块测试)是开发者编写的一小段代码,用于检验被测代码的一个很小的、很明确的功能是否正确,通过编写单元测试可以在编码阶段发现程序编码错误,甚至是程序设计错误。 单元测试有很多好处: 增加开发人员的信心 修改代码后进行快速的回归测试 提高开发质...

guotianqing的博客 1万+

gtest 快速上手:简单的单元测试

gtest(Google Test)是由 Google 开发的开源 C++ 单元测试框架,旨在帮助开发者编写和运行单元测试以提高代码质量和可维护性。gtest 提供了丰富的断言功能,支持布尔型、整型、浮点型、字符串以及自定义类的判断。

周更,欢迎关注! 1077

掌握gtest单元测试框架:C++中的测试实践

在现代软件开发中,单元测试是确保代码质量的关键环节。gtest,全称Google Test,是由Google开发的跨平台C++单元测试框架,被广泛用于开发高质量的测试用例。gtest提供了一套丰富的测试工具和宏,帮助开发者快速构建、组织和执行测试用例。它支持多种测试方法,包括功能测试、边界测试和异常测试等。此外,gtest具有出色的灵活性和可扩展性,允许开发者根据需要编写自定义的测试用例,以适应复杂的项目需求。gtest通过定义TEST。

weixin_35950531的博客 1202

COMSOL解的继承

COMSOL解的继承1. 应用场景2. 实现方法2.1. 添加研究步骤2.2. 引用研究 根据参考文献整理而来,原文见: http://blog.sina.com.cn/s/blog_4a0a8b5d010126w5.html https://www.zhihu.com/question/371867999/answer/1309194094 个人学习笔记,如有疏漏,欢迎补充 1. 应用场景 在COMSOL模拟中,一次求解之后往往遇到以下几种情况需要用到解的继承: 1)瞬态求解的继续运算。例如初始设定求解1

jessica0307的博客 1万+

WinCC ActiveX控件“许可证缺失”故障排查:从注册表修复到系统兼容性全解析

本文深入解析WinCC ActiveX控件报错“未找到许可证信息”的根本原因与解决方案。核心在于系统注册表中控件的设计时许可证密钥丢失或损坏。文章提供了从手动修复注册表、排查64位系统兼容性,到预防性环境部署的全流程专业指南,帮助工程师彻底解决这一常见故障。

oil88的博客 646

一文读懂YOLO V5 与 YOLO V4

一文读懂YOLO V5 与 YOLO V4 YOLO之父Joseph Redmon在今年年初宣布退出计算机视觉的研究的时候,很多人都以为目标检测神器YOLO系列就此终结。然而在4月23日,继任者YOLO V4却悄无声息地来了。Alexey Bochkovskiy发表了一篇名为YOLOV4: Optimal Speed and Accuracy of Object Detection的文章。YOLO V4是YOLO系列一个重大的更新,其在COCO数据集上的平均精度(AP)和帧率精度(FPS)分别提高了10%

williamhyin的博客 8796

MySQL安装配置教程(超级详细)

一、 下载MySQL Mysql官网下载地址:MySQL :: Download MySQL Installer (Archived Versions) 1. 选择要安装的版本,本篇文章选择的是5.7.31版本,点击Download下载 正在上传…重新上传取消 二、 安装MySQL 1. 选择设置类型双击运行mysql-installer-community-5.7.31.0.msi 这里选择是自定义安装,所以直接选择“Custom”,点击“Next” “Developer Default”是

m0_67322837的博客 5万+

光谱特征选择之模拟退火算法SA

光谱特征选择之模拟退火算法SA。

weixin_42621095的博客 901

【WorkBuddy从入门到精通实战教程】第 4 章 快速完成第一个 WorkBuddy 任务

摘要:WorkBuddy任务创建指南详细说明了从新建任务到结果验收的全流程。操作步骤包括:选择工作目录、设置模式(Craft/Ask/Plan)、指定AI模型、输入任务说明(需包含目标/输入/动作/约束/输出/验收6要素),可选配Skill等高级设置。文中提供三个入门示例:A)文件整理需保持原文件并生成分类方案;B)会议纪要要求结构化输出且所有内容有原文依据;C)Word转PPT需遵循品牌规范并控制页数。特别强调首次操作应在演练目录测试,处理真实数据前需确认授权范围,输出文件需检查涉密信息并按规范共享。(1

企鹅码农的专属播客,分享10多年的实战案例和经验解读,包含YOLO、RT-DETR、AI等各个工作领域。 1376

Aip1640、TM1640驱动程序

本文介绍了AIP1640/TM1640驱动芯片的编程实现,主要包括硬件接口定义和通信协议函数。通过宏定义配置时钟(CLK)和数据线(DIO)的GPIO控制,实现了I2C协议的启动、停止、字节发送等基本操作。核心函数AIP1640_Disp_Drive()完成显示驱动流程:先发送0x40命令设置地址自增模式,再发送0xC0起始地址和16字节显示数据,最后设置亮度参数。文中还包含5微秒延时函数、显示数据缓冲区定义,以及LED和数码管(SMG)的位映射注释说明。该代码适用于控制LED数码管显示,支持亮度调节功能。

zqx的博客 1403

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的零售柜商品检测软件(Python+PySide6界面+训练代码)

随着新零售概念的兴起,无人零售柜、智能零售店等新型零售模式快速发展。传统零售柜依赖于人工盘点和补货,效率低下且成本高昂。本文提出了一种基于YOLO系列目标检测算法的零售柜商品检测系统,实现了对零售柜内商品的自动识别、计数和库存管理。系统采用PySide6开发用户界面,集成了YOLOv5、YOLOv6、YOLOv7和YOLOv8等多种先进的深度学习模型,提供了完整的训练和推理流程。本文将详细介绍系统设计、算法实现、数据集构建和实际应用效果,并提供完整的代码实现。

YOLO 333

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

上一篇: MCU与SoC
下一篇: 详解最小二乘法:数学推理+举例说明
10710
博客等级 码龄6年 1168粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

10710

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值