单元测试工具 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

不同比例尺地质数据共享

包含20w、25w、100w、250w比例尺地质数据共享。

sinat_38828898的博客 2319

TMC5160电机驱动芯片实战:从模式选择到参数配置全解析

本文深入解析TMC5160电机驱动芯片的实战应用,涵盖三种核心工作模式的选择策略与参数配置。详细介绍了全功能运动控制、外部脉冲驱动及独立驱动模式的应用场景与配置要点,并提供了电流控制、静音优化、SPI通信及高级功能(如StallGuard2)的调优指南,帮助开发者充分发挥其高精度、低噪音性能。

weixin_29179311的博客 323

最终篇——SWAT模型的建立

同理,Soil Data也是同样的方法导入,在Soil Database Options的选项中,选择UserSiol,用同样的方法导入土壤类型,进行重分类。打开窗口后,只定义HRU Thresholdes,其余两个不用设置,设定各数据单元的计算率,这里的10%的意思是计算精度,即分成级HRU计算单元太小,小于平均计算单元的10%,我们就不对这HRU单元进行计算(也就是说太破碎的计算单元不进行计算),若选择0%意味着全部进行计算,需要耗费大量的内存和时间,对计算机要求较高,不建议。

m0_72556434的博客 5622

手把手教你用Qt和QScada框架,从零搭建一个简易的工业组态监控界面

本文详细介绍了如何使用Qt和QScada框架从零搭建工业组态监控界面,涵盖环境配置、界面设计、动态数据绑定及高级功能实现。通过实战案例演示,帮助开发者快速掌握SCADA系统开发技巧,提升工业自动化项目的开发效率。

weixin_32932149的博客 340

Linux中断子系统分析之(四):驱动程序申请中断

中断子系统中有一个重要的设计机制,那就是Top-half和Bottom-half,将紧急的工作放置在Top-half中来处理,而将耗时的工作放置在Bottom-half中来处理。 如果中断不分上下半部处理,那么意味着只有等上一个中断完成处理后才会打开中断,下一个中断才能得到响应。当某个中断处理处理时间较长时,很有可能就会造成其他中断丢失而无法响应,影响系统性能。 中断分成上下半部处理可以提高中断的响应能力,在上半部处理完成后便将中断打开,这样就可以响应其他中断了,等到中断退出的时候再进行下半部的处理。为了进

m0_46525308的博客 1227

拆解爆火AI图文日报!用扣子(Coze)工作流,10分钟实现自动化新闻早报

当用户提供一则新闻内容时,仔细分析新闻中的关键信息。提取新闻事件的核心要点,包括事件主体、发生时间、地点、主要情节等。用简洁的语言对新闻进行总结,控制在[X]字以内(可根据实际需求设定字数限制)。若用户提供多条新闻,对比各新闻之间的异同点。从事件类型、影响范围、发展趋势等方面进行分析。综合总结多条新闻的整体情况,以有条理的方式呈现给用户。

一身都是月 2426

解决com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 60027, active 20, maxActive 20错误

全网详细解决com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 60027, active 20, maxActive 20, creating 0, createErrorCount 24的错误

念兮为美 417

拆解全球18大“支付清算”体系:CLS、中国、美国、欧洲、日本、mBridge...

拆解全球18大“支付清算”体系:CLS、中国、美国、欧洲、日本、mBridge...

银行信息系统应用架构详解 885

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Statistics and Machine Learning Toolbox

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

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

上一篇: 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、付费专栏及课程。

余额充值