自动化测试中Python与C/C++的混合使用

简介:

背景


项目的自动化测试中已经使用了基于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函数


ctypes的功能当然远不止这些,有兴趣的同学可以参考这里http://docs.python.org/library/ctypes.html

使用Python的扩展(Extending)机制


ctypes很方便地可以调用C的动态库,但是对C++编译的动态库,调用起来很困难。这种情况利用Python的Extending机制就可以解决。Python提供了一套完整的框架来使用C/C++编写扩展库,可以很灵活的开发C++扩展模块。这种方法的缺点是工作量比较大,需要为每一个方法编写接口,这里不做详细介绍,可以参考:http://docs.python.org/extending/extending.html#writing-extensions-in-c

那么有什么办法可以高效的调用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_ex_wrap.cxx -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 _swig_ex.so

编译好以后会有一个so和py文件,写一个setup.py把他们安装到python目录就可以和其他模块一样被python调用了:
Import swig_ex
swig_ex.fact(10)

参考文档地址:http://www.swig.org/Doc1.3/SWIGDocumentation.html

原始但有效的方法


除了上面这些方法,在Python中借用C/C++代码最原始有效的方法就是将代码编译成可执行程序,从Python里用Popen方法来调用获取输出。这种方法简单有效,缺点是不够灵活,有比较大的局限性,不过在很多情况下也已经足够了。

pipe = os.popen('./tool –a %s –b %s' % (“hello”, “world”))
re = pipe.read()

其他方法


以上这些方法基本上已经能满足Python调用C/C++的需求了,此外还有一些方法,例如使用Boost.Python,使用Pyrex,这些方法都能提供Python与C/C++的交互。

总结


在Python中引用C/C++模块的方法较多,根据需要从中选择恰当的方法可以减少很多工作量。
在Python中引用C/C++模块弥补了Python脚本测试框架的很多不足,在提高代码复用率的同时,模块的性能也大大提高。

作者:qabloger

 








本文转自百度技术51CTO博客,原文链接:http://blog.51cto.com/baidutech/744400 ,如需转载请自行联系原作者
相关文章
|
2月前
|
安全 Linux 网络安全
Kali 渗透测试:基于结构化异常处理的渗透-使用Python编写渗透模块(一)
Kali 渗透测试:基于结构化异常处理的渗透-使用Python编写渗透模块(一)
|
2月前
|
Python Windows 网络安全
Kali 渗透测试:基于结构化异常处理的渗透-使用Python编写渗透模块(二)
Kali 渗透测试:基于结构化异常处理的渗透-使用Python编写渗透模块(二)
|
21天前
|
Java 测试技术 持续交付
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
本文重点讲解如何搭建App自动化测试框架的思路,而非完整源码。主要内容包括实现目的、框架设计、环境依赖和框架的主要组成部分。适用于初学者,旨在帮助其快速掌握App自动化测试的基本技能。文中详细介绍了从需求分析到技术栈选择,再到具体模块的封装与实现,包括登录、截图、日志、测试报告和邮件服务等。同时提供了运行效果的展示,便于理解和实践。
64 4
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
|
18天前
|
运维 监控 Python
自动化运维:使用Python脚本简化日常任务
【10月更文挑战第36天】在数字化时代,运维工作的效率和准确性成为企业竞争力的关键。本文将介绍如何通过编写Python脚本来自动化日常的运维任务,不仅提高工作效率,还能降低人为错误的风险。从基础的文件操作到进阶的网络管理,我们将一步步展示Python在自动化运维中的应用,并分享实用的代码示例,帮助读者快速掌握自动化运维的核心技能。
33 3
|
24天前
|
运维 监控 应用服务中间件
自动化运维:如何利用Python脚本提升工作效率
【10月更文挑战第30天】在快节奏的IT行业中,自动化运维已成为提升工作效率和减少人为错误的关键技术。本文将介绍如何使用Python编写简单的自动化脚本,以实现日常运维任务的自动化。通过实际案例,我们将展示如何用Python脚本简化服务器管理、批量配置更新以及监控系统性能等任务。文章不仅提供代码示例,还将深入探讨自动化运维背后的理念,帮助读者理解并应用这一技术来优化他们的工作流程。
|
25天前
|
运维 监控 Linux
自动化运维:如何利用Python脚本优化日常任务##
【10月更文挑战第29天】在现代IT运维中,自动化已成为提升效率、减少人为错误的关键技术。本文将介绍如何通过Python脚本来简化和自动化日常的运维任务,从而让运维人员能够专注于更高层次的工作。从备份管理到系统监控,再到日志分析,我们将一步步展示如何编写实用的Python脚本来处理这些任务。 ##
|
1月前
|
JSON 测试技术 持续交付
自动化测试与脚本编写:Python实践指南
自动化测试与脚本编写:Python实践指南
29 1
|
2月前
|
运维 监控 网络安全
自动化运维的魔法:如何用Python简化日常任务
【10月更文挑战第9天】在数字时代的浪潮中,运维人员面临着日益增长的挑战。本文将揭示如何通过Python脚本实现自动化运维,从而提高效率、减少错误,并让运维工作变得更具创造性。我们将探索一些实用的代码示例,这些示例将展示如何自动化处理文件、监控系统性能以及管理服务器配置等常见运维任务。准备好让你的运维工作升级换代了吗?让我们开始吧!
|
22天前
|
Web App开发 测试技术 数据安全/隐私保护
自动化测试的魔法:使用Python进行Web应用测试
【10月更文挑战第32天】本文将带你走进自动化测试的世界,通过Python和Selenium库的力量,展示如何轻松对Web应用进行自动化测试。我们将一起探索编写简单而强大的测试脚本的秘诀,并理解如何利用这些脚本来确保我们的软件质量。无论你是测试新手还是希望提升自动化测试技能的开发者,这篇文章都将为你打开一扇门,让你看到自动化测试不仅可行,而且充满乐趣。
|
2月前
|
C++ Python
探索Python与C/C++混合编程的艺术
探索Python与C/C++混合编程的艺术
41 1