黄建军+李宥谋+刘婧+周欢

摘 要: 通过分析现代工业生产对自动化测试系统的要求,提出一种基于面向对象的编程语言Python构建的自动化测试系统。利用Python语言的高效、灵活和简洁等特点,结合Pyvisa,Pyivi和Web.py等扩展模块提供的强大功能,以及 IVI 和 VISA技术的后台支持,可以快速组建满足用户测试需求且高效的测试系统;其次利用NumPy,Matplotlib和PyQt4扩展模块能够准确地完成对测试数据的各种运算处理以及相关的图形界面显示等操作。结果表明,该系统具有高效性、通用性和扩展性,使用Python开发虚拟仪器与测试系统,代码简洁、层次清晰、周期性短,具有广泛的应用前景。

关键词: 测试系统; Python; Pyvisa; Pyivi; 可互换性

中图分类号: TN911?34; TP393 文献标识码: A 文章编号: 1004?373X(2017)04?0039?05

Design and implementation of automatic testing system based on Python

HUANG Jianjun, LI Youmou, LIU Jing, ZHOU Huan

(School of Computer Science and Technology, Xian University of Posts and Telecommunications, Xian 710061, China)

Abstract: A kind of automatic testing system based on the object?oriented programming language Python is proposed by analyzing the requirement of the auto testing system for modern industrial production. With the background support of VISA and IVI technology, the efficient testing system satisfying the testing demands of users can be built quickly in combination with the efficient, flexible and concise characteristics of Python language, and the powerful functions of Pyvisa, Pyivi and Web.py extensional modules. Besides, the system can complete each operational processing of testing data and relevant GUI display accurately by means of NumPy, Matplotlib and PyQt4 modules. The result indicates that the system has high efficiency, universality and expansibility. The application of Python for developing the virtual instrument and testing system has the characteristics of concise code, clear hierarchy and short cycle. It has a broad application prospect.

Keywords: testing system; Python; Pyvisa; Pyivi; interchangeability

目前,多数虚拟仪器和测控平台的开发都使用LabVIEW图形化编程语言,LabVIEW在界面开发部分占据优势,但是LabVIEW调用Matlab的接口方法比较复杂,将二者很好的结合也有一定的难度,这使得LabVIEW在数据处理方面显现出不足。其次,后期系统扩展对LabVIEW代码进行修改的工作量较大,这对大型的测试系统来说很不利。基于LabVIEW的上述不足,本文提出使用Python脚本语言来编写可互换仪器测试系统。Python拥有丰富的扩展模块以及第三方的支持包,PyQt可以快速开发满足用户需求的GUI界面,NumPy相当于Matlab的Python版本,继承了Matlab的强大数据处理能力。Pyvisa 和Pyivi 是Python对NI?VISA和NI?IVI的封装工具包,对测试系统实现仪器接口的无关性和同类仪器的可互换性提供了很好的支持。Python面向对象结构化的编程可以把程序代码组织成逻辑块重复使用,这一特性也恰恰弥补了LabVIEW在编写测试系统中后期修改程序复杂这一缺陷。

1 系统组成

1.1 系统的硬件结构

测试系统由多个测试子系统组成,系统硬件连接如圖1所示,每个子系统都是一个相对独立的测试单元,由一台控制计算机、一台路由器和由该计算机控制的若干台设备仪器组成。控制计算机和LAN型接口的设备通过路由器连接到同一个局域网中,其他诸如USB,GPIB,RS 232等接口设备通过相应的接口总线与控制计算机相连,这样不同接口类型的设备仪器就直接或间接地接入到控制计算机,并由控制计算机来发现、配置和控制。各个测试子系统通过路由器和数据备份与存储服务器相连,组成整个测试系统的局域网。测试控制管理系统主机通过控制计算机的并口向各个测试子系统发送控制指令,使各个测试子系统在测试的某些阶段能够统一动作[1]。

1.2 系统的软件组成

该系统由以下5个主要模块构成,如图2所示。

仪器发现与驱动管理模块,负责对接入到控制计算机上的硬件设备仪器进行发现以及管理本地安装的IVI驱动,其次对仪器和具体IVI驱动进行相关信息的查询。

仪器测试模块分为VISA和IVI两个测试模块。VISA测试部分负责对驱动不满足IVI标准规范的仪器设备进行控制;IVI测试部分用于对驱动满足IVI标准规范的仪器进行控制。两部分相结合,使系统完成对不同驱动标准的仪器的通用功能的实现。

虚拟仪器模块,集成了某类仪器的通用功能,负责对实体仪器的操作和对测试数据的结果进行处理和显示。测试系统中,虚拟仪器模块可根据需要进行扩充,根据测试对象的不同选调对应的虚拟仪器模块。

数据存储管理模块,负责测试系统在某一项测试中所有测试信息的存储,包括测试项目名称、项目测试人员、测试环境、测试时间,测试地点和测试结果数据。该模块和数据备份与存储服务器采用C/S模式,其中S端(服务器端)运行在数据备份与存储服务器上,C端(客户端)嵌入到虚拟仪器模块中,在测试结束时由测试系统启动与服务器端连接交互并完成数据存储与更新功能。

测试数据显示界面(Web)模块,提供测试界面的本地浏览器访问和远程浏览器访问模式,浏览器完成所有测试数据的实时显示。

2 Python扩展模块的说明

2.1 Pyvisa底层驱动库

Pyvisa 是对已有VISA 库进行的 Python 格式化封装的一个共享库,以 NI?VISA作为其包装的后台支撑,可以支持串口,GPIB,GPIB?VXI,VXI,TCP/IP,以及 USB 接口仪器。Python对VISA库的封装分为顶层(high?level)、中间层(middle?level)和底层(low?level)三层结构,顶层针对VISA资源管理器和资源的操作集合进行面向对象的Python化封装,资源管理器类中实现了对接入测试系统的资源进行自动检测。用户可以使用资源管理器类来打开实例化的资源派生类对象,资源类和派生类用Python 的行为方式访问底层资源的属性和方法;中间层采用Python的绑定方法(Bound Method)对VISA库函数的操作集合进行Python形式的封装,这一层的作用是将VISA共享库的操作函数用Python脚本来实现,这样用户就可以很方便地利用Python脚本调用这些函数,实现对相关仪器的控制;底层定义了每个函数的参数类型和返回值类型,所有函数都是针对VISA库采用静态方法进行定义封装,Pyvisa的具体封装结构如图3所示。

2.2 Pyivi应用程序接口API

Pyivi支持IVI?COM和IVI?C两种类型的驱动,是对测试主机上的所有IVI驱动进行的一层 Python形式的包装,能够满足符合IVI标准规范的仪器互换特性以及IVI引擎所提供的一些功能。Pyivi对两种类型的特定IVI驱动分别使用ctypes和comtypes进行分装,两种形式对IVI标准规范下的仪器的类驱动都进行了封装,应用程序通过调用IVI类驱动实现仪器的互换性。Pyivi通过ctypes类与IVI?C类型驱动进行通信,通过comtypes类与IVI?COM类型驱动进行通信。Pyivi使用工厂模式对两种类型驱动接口进行设计,首先将接口设计为一个抽象工厂类,定义仪器的共有属性。应用程序通过Pyivi调用IVI类驱动时,工厂类会根据应用程序传入的参数来选择IVI?C或者IVI?COM类型的IVI特定驱动进行底层驱动函数的调用。

Pyivi的接口设计如图4所示,图4中仪器类指Pyivi模块所支持的仪器类别,包括示波器类、频谱分析仪类和信号发生器类[2]。

3 系统模块功能实现

3.1 仪器发现与驱动管理模块的设计

程序导入Pyvisa,Pyivi模块,调用Pyvisa模块的资源管理器函数来扫描测试系统各接口上的仪器设备,调用Pyivi模块来查看管理测试主机的驱动,查询确定驱动的具体信息以便后续测试部分的需求,具体实现代码如下:

import pyvisa as visa

import pyivi

rm=visa.ResourceManager()

#打开本地的默认资源管理器,并以引用rm的形式返回

rm_list=rm.list_resources([query=u?*::INSTR])

#列出rm中所扫描到的硬件接口设备

openinstr=rm.open_resource

(resource_name,[access_mode=,open_timeout=0])

#打开rm中的某一个硬件设备,并将会话资源以openinstr引用的形式返回

instrinfo=openinstr.query(′*IDN?′)

#查询打开仪器的详细硬件信息,保存在instrinfo中

instrmanufacturer=openinstr.manufacturer_name

#查詢仪器的厂商信息

instrmodelname=openinstr.model_name

#查询该仪器的具体型号

ivisoftmods=pyivi.software_modules

#列出本地安装的所有IVI特定驱动

tktdsmod=ivisoftmods[′tktds1k2k′]

#访问指定的 tktds1k2k 驱动

supinstrtype=tktdsmod.specialized_instrument_type()

#查询该驱动所支持的仪器类型

drivertype=tktdsmod.flavours()

#查询该驱动所属类型(IVI?C 或者IVI?COM)

supmodnames=tktdsmod.supported_instrument_models()

#该驱动所支持的仪器型号

通过上述代码,可以确定测试仪器的具体硬件信息和测试主机上的驱动类型以及驱动所支持的仪器类型。

3.2 仪器测试模块设计

仪器测试模块,VISA测试部分负责完成普通的测试功能,适用于驱动不满足IVI标准规范的设备;IVI测试部分适用于驱动符合IVI标准规范的设备,它既可以完成VISA部分的通用功能的测试,同时还能够满足仪器设备互换性的要求。以获取泰克TDS2410B示波器波形数值为例进行简要的代码说明如下:

VISA测试部分:

instr=rm.open_resource("USB0::0x0699::0x0368::c010850::INSTR")

vals=instr.query_binary_values(′curv?′,datatype=′d′, is_big_

endian=True)

其中,rm为资源管理器的引用,利用open_resource()方法建立与设备的连接,“USB0::0x0699::0x0368::c010850::INSTR”参数为本测试中连接示波器的实际硬件地址,将打开的连接仪器以会话句柄instr的形式返回。VISA测试的波形获取采用query_binary_values()方法,参数含义分别为:获取波形的SCPI仪器指令、返回的波形数据类型为double型以及数据存储采用大端格式。

IVI测试部分代码如下:

iviscope=pyivi.ivi_instrument

("USB0::0x0699::0x0368::c010850::INSTR","TDS2410B",

simulate=False,flavour=′IVI?C′) //IVI实际测量

iviscope=pyivi.ivi_instrument

("dummy address","TDS2410B",simulate=True,flavour=

′IVI?C′) //IVI仿真测量

iviscpvals=iviscope.fetch_waveform()

调用Pyivi 模块的ivi_instrument()方法建立测试系统与IVI设备的连接,支持仿真和实际测量两种方式,第一个参数为实体仪器的硬件地址,若采取仿真模式则该参数应为字符串“dummy address”;第二个参数为实体仪器的具体型号,本測试中选择泰克的TDS2410B型示波器;第三个参数对仿真和实际测量两种方式进行选择,为False则代表实际测量,Ture则为仿真模式;第四个参数对IVI?C和IVI?COM两种类型驱动进行选择,由于多数的IVI型仪器厂商都会提供IVI?C类型驱动,为了实现设备的通用性,这里选择IVI?C型驱动。

建立好的仪器连接以会话引用iviscope返回,基于该引用实现对连接仪器的控制。获取波形数据直接调用仪器会话的fetch_waveform()方法。硬件地址和仪器型号两个参数本文可以通过仪器发现与驱动管理模块获得,Pyivi会根据传入的IVI仪器型号,自动在后台IVI驱动中查询匹配该仪器型号的特定的IVI驱动,完成IVI类驱动到IVI特定驱动再到具体仪器的映射,实现了仪器设备的可互换性。

3.3 虚拟仪器模块的开发

虚拟仪器模块的开发采用PyQt4和NumPy扩展模块,PyQt4负责界面的开发,NumPy负责对采集的数据进行满足需求的处理。整体虚拟仪器模块的开发采用界面层和逻辑控制层分开设计的方式,这样数据的采集与处理与最终的结果显示分开进行,利用QObject类中的connect()方法将界面按钮事件的信号和逻辑控制块对应的槽函数(事件处理函数)绑定即可。利用PyQt进行界面开发的步骤如下:

(1) 利用QtDesigner创建GUI;

(2) 根据需要添加各种部件,并在部件的属性编辑器中修改部件的相应属性,保存该ui文件;

(3) 通过Pyuic4工具将ui文件转换成Python脚本文件,命令为:Pyuic4?o xxx.py xxx.ui;

(4) 通过调用生成GUI的类来运行该程序;

(5) 对GUI的各个控件编辑对应的触发信号和槽函数,利用connect()进行绑定。

3.4 测试数据显示界面设计

测试数据显示界面采用Web.py扩展模块进行网络搭建,在测试主机上搭建HTTP服务器,测试系统软件采用B/S结构,这样既可以通过本地浏览器访问数据显示界面也可以通过远端主机访问测试主机请求显示界面[3],具体的网络服务器代码如下:

urls = (′/′,′index′,′/system_test′,′Test′)

#定义网页的索引响应函数

class index:

def GET(self):

return "欢迎登录测试平台!"

...

return test_datas()

def test_datas(): #统计测试数据

...

reutrn datas #返回测试数据

Class Test(object):

def GET(self):

return "测试数据显示界面!"

def data_handle(self, datas): #对测试数据进行处理

...

return test_result #返回数据的处理结果

def display(self, test_result): #显示测试结果

...

if __name__ == "__main__":

app = web.application(urls, global())

app.run()

4 系统测试

搭建测试系统所需软件环境,采用DSO?X 4052A 和Tektronix TDS2014B两台不同型号的示波器对测试系统的IVI测试部分、VISA测试部分、IVI仪器仿真功能和仪器的可互换性进行测试,其中,Tektronix TDS2014B为IVI型示波器,系统整体测试流程图如图5所示。

测试中,对接入测试系统中的Tektronix TDS2014B示波器进行实时波形获取,波形选择锯齿波,实体仪器和虚拟示波器软面板波形如图6所示。IVI互换性测试,将示波器换作DSO?X 4052A 型号,波形选择三角波,示波器软面板获取的实际波形如图7所示。

系统IVI仿真测试中,选取Tektronix TDS2014B示波器,在IVI测量部分选择仪器仿真,示波器软面板波形如图8所示。

5 结 论

本测试系统将各个测试子系统通过交换机连接到同一局域网中,测试子系统中控制主机与各个测试仪器设备也处于一个局域網中,系统对外兼容GPIB,LAN,RS 232和USB等接口类型的仪器,同时支持符合IVI标准的仪器的互换操作,做到同一应用程序可以对同类不同型号的仪器设备进行控制。系统具有很强的可扩充性,VISA支持的仪器类都可以在此系统上进行测试控制,用户只需要根据测试需求开发相应仪器设备类的软面板即可,无需更改系统软件架构。其次,测试系统与数据库结合,有助于大量测试数据长时间存储管理,给今后对测试设备的某项特性进行数据挖掘提供数据支持。

参考文献

[1] 田耕,阮林波,渠红光.基于VISA技术的自动测试软件研制[J].核电子学与探测技术,2009(6):1397?1400.

[2] 黄娟,李文臻.基于VISA及IVI技术的仪器仪表自动测试系统软件设计[J].电子质量,2012(5):12?15.

[3] 周锎,赵楠,李欣.一种基于Python脚本语言的自动化测试系统[J].南开大学学报(自然科学版),2014(5):65?70.

[4] 李宥谋,赵梦屹,王萌.基于IVI引擎技术的虚拟仪器互换管理系统[J].西安邮电大学学报,2015(2):93?97.

[5] 汪君鹏,李宥谋.基于Lua脚本技术的网络化测控系统设计[J].西安邮电大学学报,2013(1):90?94.

[6] 冀博,李宥谋,郭猛.网络设备自动发现技术的研究与实现[J].西安邮电学院学报,2012(6):33?36.

[7] 李辉,吴伟.一种基于MCS51的低成本LabVIEW实验教学系统[J].现代电子技术,2013,36(4):124?128.

基于python的界面自动化测试-基于Python语言的自动化测试系统的设计与实现相关推荐

  1. 基于python的界面自动化测试-基于Python语言的自动化测试实战第二章(上)

    原标题:基于Python语言的自动化测试实战第二章(上) 测试环境搭建 2.1 Windows 下的环境搭建 如果想要学习一门编程语言,对于新手来说只需到其官方网站上去下载最新版本安装即可,但对于想要 ...

  2. python前端界面实现交互,python的交互模式是什么

    如何进入python交互界面 Python交互模式有两种:图形化的交互模式或者命令行的交互模式.打开步骤:首先点击开始菜单. 然后在搜索栏中输入Python,即可看到图形化的交互模式(IDLE(Pyt ...

  3. python语言程序设计2019版第二章课后答案-python语言程序设计基础(嵩天)第二章课后习题...

    **第二学期第一周学习总结 一. 本周学习内容总结 一维数组,了解了一维数组的定义(定义一个数组,需要明确数组变量名,数组元素的类型和数组大小,即数组中元素的数量) 一维数组定义的一般形式为:类型名, ...

  4. python可视化界面开发实例-python界面编程,python可视化窗口编程

    看了你的问题,几个回答似乎都不完全对.给你补充一下吧. 你的问题与flask基本上没有关系.flask是一个简单的微型编程框架,很优美,也很简单好用.不过它仅仅实现了基于HTTP协议的服务端交互部分. ...

  5. python语言程序设计2019版第二章课后答案-python语言程序设计基础课后答案第二章...

    python语言程序设计基础课后答案第二章 以下合法的用户自定义标识符是____________. 导入模块或者模块中的元素要使用关键字________ . 下列哪个函数是用来控制画笔的尺寸的____ ...

  6. python语言程序设计2019版第二章课后答案-《Python语言程序设计》 —2.7 课后习题...

    2.7 课后习题 1.   是指在程序运行过程中值可以发生改变的量. 2.   已知s="Python语言程序设计",则print(s[2:4])的输出结果为 ,print(s[- ...

  7. python数据结构题目_《数据结构与算法Python语言描述》习题第二章第三题(python版)...

    ADT Rational: #定义有理数的抽象数据类型 Rational(self, int num, int den) #构造有理数num/den +(self, Rational r2) #求出本 ...

  8. python嵩天课后思考题_Python语言程序设计基础(第二版)嵩天等课后习题答案

    第一次博文 Time:2018年04月28日 星期六 11:37 二次补充 2018年05月02日 第一章 程序设计基本方法 P29 # 1.1字符串的拼接 str1 = input("请输 ...

  9. python虚拟机直接加载字节码运行程序_第二章 python如何运行程序

    一.python解释器介绍 Python解释器是一种让程序运行起来的程序.实际上,解释器是代码与机器的计算机硬件之间的软件逻辑层. 当Python包安装在机器上后,它包含了一些最小化的组件:一个解释器 ...

  10. 数据库笔记整理--基于《数据库系统概论》第五版王珊一书|第二章--关系数据库知识整理和课后习题答案

    该系列的博客都是基于<数据库系统概论>第五版王珊一书 前提: 因为最近要升学的原因,再加上重温数据库部分内容,所以整理一份比较详细且重点的笔记.适合有考研升学需求的人收藏 -------- ...

最新文章

  1. Regtech半月观察(9月上)
  2. docsify and awesome
  3. Scala样例类及密封类
  4. c语言程序设计考试改革,C语言程序设计课程考试改革实施方案.pdf
  5. Python学习笔记(二)——高级特性
  6. 从DevOps到Cloud Native,应用上云姿势全解锁
  7. linux之vim常见配置
  8. Linux中重定向的实验总结,Linux中重定向命令行的总结
  9. C++ STL sort 函数的用法(自定义排序函数)
  10. 蓝牙耳机测试软件apk_蓝牙5.0手机如何测试检测分辨?这款免费APP帮大忙
  11. c语言行列坐标是先行后j,C语言课后习题参考答案
  12. PS 矩形工具的使用
  13. python网络数据采集2(译者:哈雷)
  14. UVALive - 3713 Astronauts(2-SAT)
  15. 安装U8后服务器开机加载信息慢,用友U8 安装ADSL后,连接服务器非常慢
  16. CF1694B Paranoid String 构造/子串计数
  17. iPad 必备软件 | 帮你实现百度云倍速
  18. Cadence16.6 > OrCAD Capture CIS >原理图统一改器件属性
  19. python+selenium h5新浪微博自动点赞
  20. CVPR 2021 论文大盘点-人脸造假检测篇

热门文章

  1. elasticsearch 2.2+ index.codec: best_compression启用压缩
  2. [python]两种编程思维--面向过程和面向对象
  3. Python操作Excel(将父子级表头生成树状结构)
  4. 上周热点回顾(10.10-10.16)
  5. mysql脚本mysql_safe解释、mysql.sock文件、mysql_install_db
  6. js 控制展开折叠 div html dom
  7. python中文乱码例子
  8. php学习之------[运算符相关概念]
  9. FMS3系列学习网上教程
  10. 关于 spring-aop理解