使用SWIG和Python对C/C++进行单元测试(一)

最近一直在用C/C++做开发,虽然C/C++都有自己的单元测试框架(CUnit,CPPUnit,知道还有其它框架的兄弟告诉我一声,我去看看),但是总觉得写起来麻烦(人懒没办法),于是萌发了寻找更简便方法的念头。

听说Python, Perl, Tcl都可以调用C的动态链接库,但必须把它们做成这些脚本语言的扩展模块,这样一来,复杂度又变高了,工作量也大。

后来花了一个下午的时间在往上找,终于在一个论坛上发现一个叫SWIG的东西,它将C代码做成各种脚本语言的扩展模块(Python,Perl,Tcl等)。SWIG本质上是一个编译器,它可以通过C/C++的头文件或者一个特殊的接口文件来生成一个以_wrap.c为后缀的包装文件,例如你的C模块叫 test.c, 那么SWIG会为你生成一个test_wrap.c文件,然后将这两个文件编译成一个动态链接库,就能使用其它的脚本语言来调用。下面是个简单的例子

 

tt.h

#ifdef _WIN32

 

int __declspec(dllexport)getvalue();

 

#else

 

int getvalue();

 

#endif

 

tt.c

#include "tt.h"

 

int getvalue()

{

    return 100;

}

 

下面使用swig和gcc来生成Python模块

 

环境:mingw32 + msys

swig -python -module tt tt.h

gcc -c tt.c tt_wrap.c -I/usr/local/python25/include

gcc -shared tt.o tt_wrap.o -o tt.dll -L/usr/local/python25/libs -lpython25

 

tt_test_win.py:

from ctypes import *
tt = CDLL("tt.dll")
print tt.getvalue()

 

环境:debian

swig -python -module tt tt.h

gcc -c tt.c tt_wrap.c -I/usr/local/include/python2.5

gcc -shared tt.o tt_wrap.o -o tt.so -L/usr/local/lib/python2.5 -lpython2.5

 

tt_test_linux.py:

from ctypes import *
tt = CDLL("./tt.so")
print tt.getvalue()

 

在以上两个不同的环境下除了一些include和lib的路径不同以及动态连接库的扩展名不同外,代码基本都差不多。这样swig就将从C映射到Python等脚本语言的工作完成了,我接下来所做的就是使用Python来测试我用C所写的程序。我想这样应该可以大大减少我写测试代码的时间了。

 

你可能感兴趣的:(C++,c,python,C#,单元测试)