您的位置:首页 > 其它

单元测试关于桩函数的探索

2011-10-22 01:41 781 查看
背景:c语言编写的目标文件,在做单元测试的时候,在目标c文件(如target.c)中想测试一个函数A,而A调用了B,B目前无法实现,所以需要打桩来代替B.

在不改变target.c的前提下(不修改程序的代码),在另外的c文件中(test.c)写桩函数,怎样让A函数执行的时候调用桩函数,而不是原来的B函数呢?

查阅了网上的资料

方法1:采用宏定义,在编译的时候先采用gcc -D编译target.c

在编译连接target.o 和test.c

gcc -DB=stub_B -c target.c

gcc target.o test.c –o test

./test

Error:multiple definition of `stub_B'

原因:gcc –DB=stub_B 相当于#define B stub_B

将target.c中的B都替换成stub_B,而target.c中就有了stub_B的定义,就出现了重定义

这种重定义的方法,适用于底层函数的定义和目标文件不再同一个文件中

方法2:采用google的cmockery框架

这个的安装和使用网上有很多的资料。

使用下来的结果和方法1相同。

可能是本人使用有误,在此不确定这个可不可行。

纠结了好多天,寻思着怎么才能实现上述的功能。

本人采用了gcc和g++编译器,在本地函数和动态库中的函数同名的时候,会调用本地函数的特性,先将target.c生成动态库,然后编译test.c的时候链接此库,实现了所要的功能。可以结合cppunit进行单元测试了。

//target.c

//目标文件

#include"target.h"

#include <stdio.h>

int Inside_function()

{

return 0;

}

// Outside_function()为待测函数,这个是没有入口参数的,但是有内部输入Inside_functionf(),这个函数是底层函数,大多数的时候可能是比较复杂的,或者说是难以是实现的,或者说是

//和硬件相关的,这个时候需要打桩来代替

void Outside_function()

{

int a=Inside_functionf();

printf("a=%d/r/n",a);

}

//target.h

int Inside_function();

void Outside_function();

//test.c

//测试代码

//Inside_function()是桩函数,和target.c中的底层函数同名

#include"target.h"

int Inside_function()

{

return 100;

}

int main()

{

int a=Outside_function();

return 0;

}

将target.c生成动态库 libtarget.so

然后加载进去一起编译test.c

g++ -c -o target.obj target.c

g++ -shared -o libtarget.so target.obj

g++ libtarget.so test.c -o test

./test

结果是a=100

说明了调用了本地的函数。

这个方法是本人拙见,在window上不可行,这个跟编译器相关,目前还在探索有没有其他的方法可以实现。

期待各路高手指教。

任重道远~~~

坚持到底~~~

http://blog.csdn.net/happyb060218/article/details/6420013
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: