前言

对待测函数中的某些行为打桩可以方便单元测试(UT)/功能测试(FT)的开发,但是桩打得越彻底,其能起到防护作用也会越打折扣;如果粗略地将需要维护的代码定义为边界内的话,那么原则上不鼓励对边界内的函数打桩;在一些大型系统里,由于分工明确导致边界以外的代码量远大于边界内的代码量,而边界外的接口会给边界内UT/FT的开发带来较大成本,因此对边界外的接口打桩就是很常见的操作。

在纯C语言的系统里,对函数打桩的工具比较有限,而且使用上各有优缺点,本文要阐述的只是个人在工作中对函数打桩的总结。

CMocker原理

下图为Mock以前的正式流程,待测函数为process(),而process里调用了外部接口func,func的执行结果对process的流程有影响。

CMocker的原理如下图所示,将外部接口func(),替换成桩函数func_mock(),桩函数里指定一个回调函数(*func_callback)(),该回调函数指定的行为是与测试用例相关的,当某个用例需要改变func()的行为时,就指定回调函数(*func_callback)(),这样,在待测函数process()执行到Mocker以前的func()处时,就只会执行回调(*func_callback)()里的行为,这样就实现了在不同测试用例里指定不同行为的效果。

而对原有的业务代码里外部接口func -> func_mock的替换,实际上是通过头文件中定义宏来实现的隐式替换

#define func func_mock

从外表来看业务代码并未被修改过,这点很重要,原则上待测代码应该与正式运行时的代码相同,才能保证UT/FT防护的有效性。

c语言fuc函数,CMocker相关推荐

  1. 写的函数符号表里没有_你有没有想过,C语言 main 函数到底为啥这么写?

    但凡是学过C语言的人,都知道要先写main函数,然而很多时候我们看到的main函数却各有差异,这究竟是为啥?哪种是对的呢?今天我们就来聊聊main函数. 那么main函数一共有多少个版本呢? 1.ma ...

  2. R语言str_trim函数去除字符串中头部和尾部的空格

    R语言str_trim函数去除字符串中头部和尾部的空格 目录 R语言str_trim函数去除字符串中头部和尾部的空格 #导入包和库 #仿

  3. R语言sqrt函数为数值开平方根实战

    R语言sqrt函数为数值开平方根实战 目录 R语言sqrt函数为数值开平方根实战 #基本语法 #sqrt函数开平方根

  4. R语言数学函数:abs绝对值、sqrt平方根、ceiling向上近似整数、floor向下近似整数、trunc去除小数部分、round近似到指定小数位、signif近似到有效数字、三角函数、指数、对数

    R语言数学函数:abs绝对值.sqrt平方根.ceiling向上近似整数.floor向下近似整数.trunc去除小数部分.round近似到指定小数位.signif近似到有效数字.三角函数.指数.对数 ...

  5. R语言sd函数计算数值标准差实战(Standard Deviation)

    R语言sd函数计算数值标准差实战(Standard Deviation) 目录 R语言sd函数计算数值标准差实战(Standard Deviation) #基本语法 #sd

  6. R语言optimize函数一维优化实战

    R语言optimize函数一维优化实战 目录 R语言optimize函数一维优化实战 #基础语法 #优化用户自定义的函数

  7. R语言rev函数对数据对象(向量、dataframe通过行或者列)反序实战

    R语言rev函数对数据对象(向量.dataframe通过行或者列)反序实战 目录 R语言rev函数对数据对象(向量.dataframe通过行或者列)反序实战

  8. R语言用户自定义函数的语法结构、编写自定义统计值计算函数(使用ifelse结构计算均值和标准差等)、编写自定义日期格式化(format)函数(switch函数使用不同分枝格式化日期数据)、应用自定函数

    R语言用户自定义函数的语法结构.编写自定义统计值计算函数(使用ifelse结构计算均值和标准差等).编写自定义日期格式化(format)函数(switch函数使用不同分枝格式化日期数据).应用自定函数 ...

  9. R语言merge函数全连接dataframe数据(Full (outer) join)、merge函数进行全连接必须将参数all设置为true(all=TRUE)、默认merge函数通过公共列名合并数

    R语言merge函数全连接dataframe数据(Full (outer) join).merge函数进行全连接必须将参数all设置为true(all=TRUE).默认merge函数通过公共列名合并数 ...

最新文章

  1. 剑指offer--JavaScript版
  2. leetcode算法题--扁平化嵌套列表迭代器
  3. mysql建表简单的date数据类型_MySQL建表 TIMESTAMP 类型字段问题
  4. MyBatis中ThreadLocal
  5. host文件注释 ubuntu_Redis and MongoDB 设置密码验证(scrapy)(win)(ubuntu)
  6. 报表在IBM AIX系统下resin部署
  7. 微服务容错时,这些技术你要立刻想到
  8. 陈皓:谈谈职业规划——CSDN对我的采访
  9. Linux入门(2)_给初学者的建议
  10. java中值滤波_Java实现图像中值滤波
  11. mysql表analyze_MySQL ANALYZE Optimize Check Table使用详解
  12. mysql实验体会怎么写_数据库实验心得
  13. Error running ‘Tomcat8.5‘ port out of range-1 (moments ago)
  14. 简单易懂的计算机网络相关名词的解释--集线器篇(持续更新)
  15. 移动硬盘在mac上无法显示 读不出来
  16. 《老路用得上的商学课》21-30学习笔记
  17. Ubuntu16.04安装QQ和微信(亲测有效)
  18. BZOJ 1251 序列终结者 Splay
  19. Swift编写–仿照Twitter客户端
  20. 拉卡拉支付:推出支付产业互联网新大门

热门文章

  1. Golang10进制转16进制的几种方法
  2. 7-8 古老的汉诺塔 (20分)
  3. 宝塔linux面板 h5ai,宝塔面板怎么搭建h5ai文件服务器?宝塔面板Nginx安装h5ai文件服务器...
  4. html水平翻转效果,CSS3样式实现水平和垂直翻转
  5. vue动态路由刷新匹配错误问题以及解决办法
  6. Python能干嘛?
  7. Ubuntu 使用yah3c 配置(全,解决no such file no device )
  8. DMRS在5G NR各种物理信道上的配置
  9. js中三个判断的应用——if else、三元运算符、switch case
  10. 通过开源硬件取得控制权