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

From: http://hi.baidu.com/sacmelody/blog/item/cf3ee7088d2112f036d12289.html

背景

  项目的自动化测试中已经使用了基于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 生成扩展模块分为以下几步:

  1. 将需要调用的代码编译成目标文件(.o) ;
  2. 用SWIG 读取编写描述文件 (.i) ,生成接口文件 (.cxx) ;
  3. 将接口文件编译为目标文件(.o) ;
  4. 将接口文件的目标文件和原代码段的目标文件一起编译成动态库 ;

假设有如下文件

  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 脚本测试框架的很多不足,在提高代码复用率的同时,模块的性能也大大提高。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/406714.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在IT的路上,我在成长

在IT的路上,我在成长。很荣幸地加入了博客园这个大家庭。 岁月的航船在不断航行,在成长的脚印我要深深留下,回首已往经历,发现自己成长的路上,将来也会有很多美好的回忆,以及丰硕的果实。转载于:https://ww…

React开发(149):ant design控制是否必填

<Form.Item label"原因">{getFieldDecorator(signInResson,form.getFieldsValue().signStatus QS_TESHU ||form.getFieldsValue().signStatus JS_TESHU? {initialValue: ,rules: [{ required: true, message: 请填写原因 }],}: { rules: [{ message: 请填写…

你如何摆平秋季问题皮肤

随着秋天的到来&#xff0c;不少MM的面部、身体的皮肤都出现了这样那样大大小小的问题。小编带着 网友们关注的“一箩筐”的问题&#xff0c;特别走访了成都市第二人民医院皮肤科路永红主任医师。让她从专业医师的角度来为大家上一堂课&#xff0c;专门讲解秋季问题皮肤如何预 …

display:none和visibility:hidden两者的区别

使用css让元素不可见的方法有很多种&#xff0c;裁剪、定位到屏幕外边、透明度变换等都是可以的。但是最常用两种方式就是设置元素样式为display: none或者visibility: hidden。很多公司的面试官也常常会问面试者这两者之间的区别。 display与元素的隐藏 如果给一个元素设置了…

python应用领域介绍

From: http://zhidao.baidu.com/question/62447250 Python作为一种功能强大且通用的编程语言而广受好评&#xff0c;它具有非常清晰的语法特点&#xff0c;适用于多种操作系统&#xff0c;目前在国际上非常流行&#xff0c;正在得到越来越多的应用。下面就让我们一起来看看它的…

汇编常见伪指令

汇编常见伪指令 转自: http://blog.chinaunix.net/uid-20547722-id-1647296.html 一、与宏有关的伪指令在宏定义时&#xff0c;为了满足某种特殊需要&#xff0c;汇编语言还提供了几个伪指令。 9.3.1 局部标号伪指令LOCAL 在宏定义体中&#xff0c;如果存在标号&#xff0c;则…

运维秘籍:防止数据丢失“六脉神剑”

服务器数据存储安全是保障服务器正常运行的重要的环节&#xff0c;同时也是企业网络信息化建设的核心。每一家企业的管理层人员都非常重视存储在服务器的重要数据&#xff0c;包括&#xff1a;各类管理中所产生的机密办公文件、经营中所积累的客户资料、研发中所涉及的重要文件…

CSS中设置border属性为0与none的区别

在我们设置CSS的时候&#xff0c;对标签元素不设置边框属性或者取消边框属性一般设置为&#xff1a;border:none;或border:0;两种方法均可。 border:none;与border:0;的区别体现有两点&#xff1a;一是理论上的性能差异&#xff1b;二是浏览器兼容性的差异。 1.性能差异 【b…

windows下Python+Editplus windows Python开发环境

From: http://www.jb51.net/softjc/34898.html 点评&#xff1a;Python的安装程序以及源代码可以从其官方网站http://www.python.org/获取。以Windows XP、Python 3.1.3为例&#xff0c;在Windows下安装Python的过程如下。&#xff08;1&#xff09;从Python官方网站 http://…

Lightbox JS v2.0

概要&#xff1a;Lightbox JS 是一个简单而又谦恭的用来把图片覆盖在当前页面上的脚本. 它能被快速安装并且运作于所有流行的浏览器.最新更新 Version 2.0图片集: 分组相关的图片并且能轻松的导航它们 视觉特效: 奇特的自适应调整 向后兼容: yes! 点击这里查看实例演示如何使用…

求和

Problem Description 求Sn222222…22…222&#xff08;有n个2&#xff09;的值。 例如&#xff1a;222222222222222&#xff08;n5&#xff09;&#xff0c;n由键盘输入。 Input n Output 和 Sample Input 5 Sample Output 24690 #include <iostream> using namespace s…

PHP Fatal error: Uncaught think\\exception\\ErrorException: error_log相关解决方法

解决方法&#xff1a;切换到tp5目录然后使用chmod -R 777 tp5来解决&#xff0c;当然不太建议这样做&#xff0c;这不符合我们在线上的操作方式。一种比较推荐的做法是执行chmod -R daemon:daemon tp5来进行处理&#xff0c;这是因为在Mac上默认的Apache用户为daemon&#xff0…

React开发(150):判断方法有避免报错

this.props.onHandleDelete&&this.props.onHandleDelete();

《算法》C++代码 前言

现在大二正在上《数据结构》课&#xff0c;课内的书上代码实现很喜欢无脑用类、变量名字很长&#xff0c;而且常常实现太繁琐&#xff0c;并且代码有些无法运行&#xff0c;这些对于老手无所谓&#xff0c;但初学者看起来却会很不舒服。因此写点自己的代码&#xff0c;大家可以…

Linux下的分区工具

Linux下的分区工具 来源:http://www.cnblogs.com/rootq/articles/1487201.html[rootlocalhost gxlinux]# df -Th#查看已经挂载上的文件分区大小以及格式(当然你的系统必须有空闲的空间不用了)文件系统 类型 容量 已用 可用 已用% 挂载点/dev/sda1 ext3 2.9G 2…

Linux常用命令大全(非常全!!!)

linux系列之常用运维命令整理笔录 Linux常用命令大全&#xff08;非常全&#xff01;&#xff01;&#xff01;&#xff09; 最近都在和Linux打交道&#xff0c;感觉还不错。我觉得Linux相比windows比较麻烦的就是很多东西都要用命令来控制&#xff0c;当然&#xff0c;这也是…

旋转动画用控件RotateView

旋转动画用控件RotateView 最终效果&#xff1a; 源码&#xff1a; RotateView.h 与 RotateView.m // // RotateView.h // RotateAnimationView // // Created by YouXianMing on 14/12/8. // Copyright (c) 2014年 YouXianMing. All rights reserved. //#import <UIKit…

UPS分类:直流UPS和交流UPS

以下资料来源于IT168术语详解&#xff1a;http://detail.it168.com/UPS从结构上一般分为直流UPS(DC-UPS)和交流UPS(AC-UPS)两大类。(1)直流UPS直流不间断电源由两个基本单元组成。分别是整流器、蓄电池。其原理结构方框图如下&#xff1a;其工作过程是&#xff1a;当市电正常时…