happyb060218 发表于 2011-5-14 17:17:58

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

来源:csdnblog   
背景: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上不可行,这个跟编译器相关,目前还在探索有没有其他的方法可以实现。
期待各路高手指教。


任重道远~~~
坚持到底~~~
页: [1]
查看完整版本: 单元测试关于桩函数的探索