mock
mock测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法。
函数
CPU运行时实际主要是和寄存器打交道。运行函数时就是把对应代码区的指令搬到寄存器中,基于此我们可以在函数开头处替换掉部分指令,让CPU跳转到另外的执行地址以实现mock。
实现
替换指令只需要mov rax; jmp rax;
先把跳转地址放到rax寄存器,再跳转到对应地址。这里也可以把替换掉的指令保存一下,这样就也可以做到恢复原函数。
因为指令位于只读区,替换时还要改变内存属性。
优势
运行时替换,代码侵入性小,可以在单独的单元测试文件中实现。
可以mock没有源码的函数,比如c库中对系统调用的一些封装函数write等。
可以在mock函数中调用原函数
mock的优势,可以使单元测试的覆盖率接近100%。
劣势
因为实现过程用到了mprotect和memcpy,所以不能mock使用到的函数,但是可以通过单独实现所使用函数来避免这个问题
与架构相关,实现方式的指令与架构绑定。主要考虑了x86,x86_64,arm架构。
mock.c
1 |
|
mock.h
1 |
|
demo.c
1 | #include <stdio.h> |
运行结果
1 | fun |