python怎么测试c代码_[转]⾃动化测试中Python与CC++的混
合使⽤
背景
项⽬的⾃动化测试中已经使⽤了基于Python脚本的框架,⾃动化过程中最关键的问题就是如何实现桩模块。运⽤
Python 强⼤的功能,实现任何桩模块都是可能的,但是是否必须完全使⽤ Python 实现模块逻辑,成本是⼀个决定性因素。在桩模块逻辑简单的情况下,使⽤
Python
模拟模块逻辑不但使⾃动化测试的结构清晰,也具有更好的灵活性,但是如果桩模块逻辑复杂,实现起来可能要耗费很⼤的成本,也容易由于桩模块逻辑与实际不符导致测试结果不可信。在这种情况下,如果能够借⽤
RD 开发的某些代码段 / 库,将会对测试⾃动化带来很多效益。
另外,在Python 中调⽤ C/C++ 代码的⽅法也可能应⽤于 C/C++ 库的测试中,这种测试⽅法的可⾏性还有待研究。
以下总结出⼏种在Python 中调⽤ C/C++ 代码的⽅法
使⽤ctypes 模块调⽤ C 动态库
从Python2.5 开始, Python 开始提供 ctypes 模块来提供对 C 语⾔编译的动态库⽂件的调⽤。注意, 这⾥特指C 的动态库 ,⽤C++ 编译的动态库 ctypes 虽然能够加载,但调⽤时的函数名已经由于 C++ 的重载特性被加以修改,难以调⽤。 使⽤ ctypes 调⽤ C 动态库的好处在于不⽤进⾏额外的开发,可以直接使⽤编译好的动态库。 ctypes 提供了完整的 C 类型封装,也⽀持⾃定义类型,⼤⼤减少在调⽤过程中的⼯作量。 ctypes 的使⽤很简单,只需熟悉 python 封装与 C 中的对应关系即可。以下⽤⼀个简单的例⼦来说明:
from ctypes import * #导⼊ctypes模块
libc = cdll.LoadLibrary("libc.so.6") #加载libc动态库
str = c_char_p(' Hello World! ') #使⽤char *在ctypes中的对应封装c_char_p,相当于char* str=”Hello World!”
libc.printf(“yell: %s\n”, str ) #调⽤printf函数
使⽤Python 的扩展( Extending )机制
那么有什么办法可以⾼效的调⽤C++ 动态库呢,答案是 SWIG 。
使⽤SWIG ⽣成扩展模块
上⾯提到了Python 的扩展机制,缺点是⼯作量⽐较⼤,这⾥介绍⼀个⼯具 SWIG 。 SWIG 是⼀种简化脚本语⾔与 C/C++ 接⼝的开发⼯具,通过包装和编译 C 语⾔程序来达到与脚本语⾔通讯⽬的的⼯具。它正是基于 Python 的扩展机制,⾃动⽣成接⼝⽂件,再编译成可以被 Python 调⽤的动态库扩展模块。
使⽤SWIG ⽣成扩展模块分为以下⼏步:
将需要调⽤的代码编译成⽬标⽂件(.o) ;
⽤SWIG 读取编写描述⽂件 (.i) ,⽣成接⼝⽂件 (.cxx) ;
将接⼝⽂件编译为⽬标⽂件(.o) ;
将接⼝⽂件的⽬标⽂件和原代码段的⽬标⽂件⼀起编译成动态库 ;
假设有如下⽂件
swig_ex.cpp
需要转换成扩展库的原始代码,包含⼀个int fact(int) 函数
swig_ex.h
原始代码的头⽂件
swig_ex.i
SWIG描述⽂件
swig_ex.i是⼀个描述⽂件,有 SWIG
⾃⼰的语法,⽐较简单,内容如下:
%module
swig_ex
%{
#define
SWIG_FILE_WITH_INIT
#include
"swig_ex.h"
%}
int fact(int
n);
再写⼀个Makefile 来把这些⽂件编译成动态库 :
all: swig_ex.o
swig_ex_wrap.o _swig_ex.so
swig_ex.o: swig_ex.cpp swig_ex.h
#编译源⽂件
g++ -fPIC
-c swig_ex.cpp
swig_ex_wrap.o: swig_ex.i swig_ex.o
#根据 SWIG 描述⽂件 (.i) ⽣成接⼝⽂件 (.cxx) ,再编译之
swig -c++ -python
swig_ex.i
g++
-O2 -fPIC -c swig_
-
I/home/work/linyi/autoframe/tool/python/include/python2.6/ _swig_ex.so: swig_ex_wrap.o
#将⽬标⽂件打包成动态库
g++
-shared swig_ex.o swig_ex_wrap.o -o _swig_ex.so
.PHONY: clean
clean:
rm -rf swig_ex_wrap.* swig_ex.py
python怎么读取py文件_swig_ex.so
编译好以后会有⼀个so 和 py ⽂件,写⼀个 setup.py 把他们安装到 python ⽬录就可以和其他模块⼀样被 python 调⽤了:
Import
swig_ex
swig_ex.fact(10)
原始但有效的⽅法
除了上⾯这些⽅法,在Python 中借⽤
C/C++ 代码最原始有效的⽅法就是将代码编译成可执⾏程序,从 Python ⾥⽤ Popen
⽅法来调⽤获取输出。这种⽅法简单有效,缺点是不够灵活,有⽐较⼤的局限性,不过在很多情况下也已经⾜够了。
pipe = os.popen('./tool
–a %s –b %s' % (“hello”, “world”))
re =
其他⽅法
以上这些⽅法基本上已经能满⾜Python 调⽤ C/C++ 的需求了,此外还有⼀些⽅法,例如使⽤ Boost.Python ,使⽤ Pyrex ,这些⽅法都能提供 Python 与 C/C++ 的交互。
总结
在Python 中引⽤ C/C++ 模块的⽅法较多,根据需要从中选择恰当的⽅法可以减少很多⼯作量。
在Python 中引⽤ C/C++ 模块弥补了 Python 脚本测试框架的很多不⾜,在提⾼代码复⽤率的同时,模块的性能也⼤⼤提⾼。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。