gtest Unitest 打桩优化

2024-05-08 20:20
文章标签 优化 gtest 打桩 unitest

本文主要是介绍gtest Unitest 打桩优化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

接口(宏)简单介绍

  • SMOCK StubMock类的单例对象

  • V_ADDR 获取类虚拟函数地址

  • O_ADDR 获取重载函数地址(只支持类成员函数)

  • NF_SMOCK 函数打桩

  • F_SMOCK 函数打桩,会去调用NF_SMOCK,调用时默认第一个参数为0

  • SMOCK_CLEAR 清除所有打桩函数

整体的简单介绍

  • StubMock是继承Stub的一个单例类,SMOCK宏是获取单例对象的简便方式,因为是继承Stub并且一些功能限制,因此需要修改Stub源代码:

    • private 修改成protected

    • 将虚构函数中的清除打桩函数操作单独变成一个函数,SMOCK_CLEAR宏将会调用该函数。

  • 因为使用仍然是Stub的打桩,因此整体需要的两个东西不会改变,即被打桩函数的地址和打桩函数的地址,StubMock优化了打桩函数的地址,它提供了更友好的交互方式:

    • lambda表达式

    • gmock的action类

  • 关于为什么使用NF_SMOCK为什么第一次参数需要带一个编号,因为实现问题(不想使用__COUNTER__宏),对于每一种函数类型同一时刻只能有一个被打桩,因此需要添加不同的编号来做到打桩一定成功。

推荐每一个打桩都用不同的编号,否则会给自己精神压力,因为会需要一直查看是否有相同类型的函数被打桩。

使用方式

静态函数打桩

// unistd.h
extern ssize_t read (int __fd, void *__buf, size_t __nbytes) __wur;
// string.h
extern void *memset (void *__s, int __c, size_t __n) __THROW __nonnull ((1));using namespace testing;class CLS {
public:static void s1() {}
};TEST {// use lambdaNF_SMOCK(0, read, [] { return 0; }); // have return typeNF_SMOCK(1, read, [] {}); // no return typeNF_SMOCK(2, ADDR(CLS, s1), [] {})); // class static function// use gmock actionNF_SMOCK(0, read, Return(0)); // have return typeNF_SMOCK(1, read, Return()); // no return typeNF_SMOCK(2, ADDR(CLS, s1), Return()); // class static function// do somethingSMOCK_CLEAR; // clear
}

类成员函数打桩

using namespace testing;class CLS {int cfn(int x) const { return 0; }
}TEST {// use lambdaNF_SMOCK(0, ADDR(CLS, cfn), [] { return 1; }));// use gmock actionNF_SMOCK(0, ADDR(CLS, cfn), Return(1));// do somethingSMOCK_CLEAR; // clear
}

虚函数打桩

using namespace testing;class CLS {virtual int vir_fun() const { return 0;}
}TEST {// use lambdaNF_SMOCK(0, V_ADDR(CLS, cfn), [] { return 1; }));// use gmock actionNF_SMOCK(0, V_ADDR(CLS, cfn), Return(1));// do somethingSMOCK_CLEAR; // clear
}

重载函数打桩

O_ADDR(arg1, arg2, arg3, arg4, arg5)

  • arg1 类名

  • arg2 函数名

  • arg3 返回类型

  • arg4 参数列表

  • arg5 类函数描述符列表(const, …)

class CLS {int fun() const { return 0;}int fun(double) const { return 0;}
};TEST(a, b) {// use lambdaNF_SMOCK(0, O_ADDR(CLS, fun, int, (), (const)), [] { return 1; });NF_SMOCK(1, O_ADDR(CLS, fun, int, (double), (const)), [] { return 2; });// use gmock actionNF_SMOCK(0, O_ADDR(CLS, fun, int, (), (const)), Return(1));NF_SMOCK(1, O_ADDR(CLS, fun, int, (double), (const)), Return(2));// do somethingSMOCK_CLEAR; // clear
}

lambda表达式使用的场景

lambda一般用于逻辑不单一的场景,如:

// unistd.h
extern ssize_t read (int __fd, void *__buf, size_t __nbytes) __wur;TEST {NF_SMOCK(0, read, []{static int cnt = 0;cnt++;if (cnt == 1) return 0;return -1;});// do somethingSMOCK_CLEAR; // clear
}

gmock action

gmock action中最常用是就是Return函数,一般分为两种:

  1. Return(), 不加返回值用于匹配返回类型为void的打桩函数

  2. Return(x), 用于匹配返回类型与x类型相同的打桩函数

代码

橘色的喵/custom_gtest_stub

这篇关于gtest Unitest 打桩优化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/971342

相关文章

Oracle查询优化之高效实现仅查询前10条记录的方法与实践

《Oracle查询优化之高效实现仅查询前10条记录的方法与实践》:本文主要介绍Oracle查询优化之高效实现仅查询前10条记录的相关资料,包括使用ROWNUM、ROW_NUMBER()函数、FET... 目录1. 使用 ROWNUM 查询2. 使用 ROW_NUMBER() 函数3. 使用 FETCH FI

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

MySQL不使用子查询的原因及优化案例

《MySQL不使用子查询的原因及优化案例》对于mysql,不推荐使用子查询,效率太差,执行子查询时,MYSQL需要创建临时表,查询完毕后再删除这些临时表,所以,子查询的速度会受到一定的影响,本文给大家... 目录不推荐使用子查询和JOIN的原因解决方案优化案例案例1:查询所有有库存的商品信息案例2:使用EX

MySQL中my.ini文件的基础配置和优化配置方式

《MySQL中my.ini文件的基础配置和优化配置方式》文章讨论了数据库异步同步的优化思路,包括三个主要方面:幂等性、时序和延迟,作者还分享了MySQL配置文件的优化经验,并鼓励读者提供支持... 目录mysql my.ini文件的配置和优化配置优化思路MySQL配置文件优化总结MySQL my.ini文件

正则表达式高级应用与性能优化记录

《正则表达式高级应用与性能优化记录》本文介绍了正则表达式的高级应用和性能优化技巧,包括文本拆分、合并、XML/HTML解析、数据分析、以及性能优化方法,通过这些技巧,可以更高效地利用正则表达式进行复杂... 目录第6章:正则表达式的高级应用6.1 模式匹配与文本处理6.1.1 文本拆分6.1.2 文本合并6

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

HDFS—存储优化(纠删码)

纠删码原理 HDFS 默认情况下,一个文件有3个副本,这样提高了数据的可靠性,但也带来了2倍的冗余开销。 Hadoop3.x 引入了纠删码,采用计算的方式,可以节省约50%左右的存储空间。 此种方式节约了空间,但是会增加 cpu 的计算。 纠删码策略是给具体一个路径设置。所有往此路径下存储的文件,都会执行此策略。 默认只开启对 RS-6-3-1024k

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

MySQL高性能优化规范

前言:      笔者最近上班途中突然想丰富下自己的数据库优化技能。于是在查阅了多篇文章后,总结出了这篇! 数据库命令规范 所有数据库对象名称必须使用小写字母并用下划线分割 所有数据库对象名称禁止使用mysql保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来) 数据库对象的命名要能做到见名识意,并且最后不要超过32个字符 临时库表必须以tmp_为前缀并以日期为后缀,备份