一、概念
函数打桩,就是将一个函数用另一个函数实现(桩代码)进行替换,以达到在原有函数入口的位置执行新的实现。
二、目的
函数打桩的目的一般是隔离、占位和控制。
- 隔离是指将测试任务从产品项目中分离出来,使之能够独立编译、链接,并独立运行。隔离的基本方法就是打桩,将测试任务之外的,并且与测试任务相关的代码,用桩来代替,从而实现分离测试任务。
- 占位就是用桩对一些未实现的函数进行占位,多见于协同开发中,对于其他人完成的函数可以先使用桩函数进行占位。
- 控制是指在测试时,人为设定相关代码的行为,使之符合测试需求。
三、方法
编译时、链接时、运行时。
编译时打桩
用宏定义#define,在预处理时进行字符串替换,将原函数定义成桩函数的形式。同时可以使用条件编译来控制编译选项。
链接时打桩
链接时打桩就是调用的函数库替换。将桩函数定义到新的库文件中,并在原代码基础上增加条件编译选项,屏蔽原有的库,采用桩函数库。
运行时打桩
运行时打桩就是函数地址替换。这种方法要复杂一点,但是不需要对原有的代码进行修改,而是额外增加了打桩和还原的操作,在进行单元测试时也常用。
简单来说,就是读取到原函数指令的地址,并读取桩函数的地址,并使用jmp命令从原函数跳转到桩函数去,以实现打桩。需要实现类似
int install_stub(void *orig_f, void *stub_f)
int uninstall_stub(void *stub_f)
参考优秀博客:
stub | Simest's Blog (sim41.com)
认识单元测试中的打桩_wangwencong的博客-CSDN博客_单元测试 打桩
版权归原作者 alibli 所有, 如有侵权,请联系我们删除。