基于python语言的gui自动化测试脚本技术研究


3330 TP311 基于 Python 语言的 GUI自动化测试脚本技术研究自动化测试技术 吴 立金 简 阳 张 凯 唐 龙 利 韩新宇 中国船舶工业综 合技术 经 济研究院 为解决嵌 入式软件 GUI 测试自 动化控制问题 , 提出 Python 测试脚本 扩 展嵌入的 方 法 , 采 用开 源 库 Boost .Python 将 Python 解析器嵌入 GUI 自 动化测试平台软件中 , 并为 GUI 软 件测试行为扩 展了测试函数 , 建立 了用例要素 与脚本要素的 对应 关系 , 针 对不同 类型的扩 展测试函数提出了 基于关键字索引 和图像建模的脚本函数自 动生 成方法 , 并且从脚步的解 析与调度两方面分析了 Python 测试 脚 本的 驱 动执行原理 , 使嵌 入式软 件 GUI 自 动 化测试 平台 支持 Python 脚本的 创建 并 通 过脚本的 执行实 现 GUI 软 件自 动化 测 试 , 并 且 提 高 了测试控 制的易用性 和灵活性 。 测试脚本 图像用户界 面 自 动 化测试 脚本生 成 Python 语言 • 3330 • 计算机测量与控制 .2015.23 (1 0) Computer Measurement & Control 自动化测试技术 文章编号 :1671-4598(2015}10 -3330 -03 DOI: 10. 16526/j. cnki. 11 - 4762/tp. 2015. 10.024 中图分类号: TP311 文献标 t只码 :A 基于 Python 语言的 GUI 自动化 试脚本技术研究 其豆合,捕 归,很 鼠,,t龙剩,韩新宇 (中国船舶工业综合技术经济研究院.北京 100081) 摘要:为解决嵌入式软件 GU1 测试自动化控制问题,提出 Python 测试脚本扩展嵌入的方法,采用开源库Bo ost. Python 将 Python 解析器嵌入 GUI 自动化测试平台软件中,并为 GUI 软件测试行为扩展了测试函数,建立了用例要素与脚本要素的对应关系,针对不同 类型的扩展测试函数提出了基于关键字索引和图像建模的脚本函数自动生成方法.并且从脚步的解析与调度两方面分析了 Python 测试脚 本的驱动执行原理,使嵌入式软件 GUI 自动化测试平台支持 Python 脚本的创建并通过脚本的执行实现 GUI 软件自动化测试,并且提高 了测试控制的易用性和灵活性。 关键词:测试脚本;图像用户界面;自动化测试;脚本生成; Python 语言 Technology about GUI Test Script ßased on Python Wu Lijin. Jian Yang. Zhang Kai. Tang Longli. Han Xinyu (China Institute of Marine Technology & Economy. Beijing 100081. China) Abstract: For the problem of embedded software GUI automatic test control. this paper studied the extension and embedding technology of Python's test scripts • extended the test function for GUI testing behavior and embedded the Python interpreter on GUI test automation systems using the open source libraries "Boost. Python". Besides. we described the correspondence between the extended test lunctior> and the test behavior and for different types 01 extension test lunction. we proposed automatic generation solution by keyword index and imagε modeling. Finally. we explained how to schedule and execute Python scripts. Based on the above. the GUI test platform can execute GUI test automatically and the test control is easy and flexible. Keywords: test scripts; GUI; automatic test; 时 ript generation; Python 。 引用 用脚本来描述测试用例,并通过测试平台上的脚本解释器 来执行测试用例是一种有效的测试方法[门。测试脚本是由脚本 语言编写的具有正规语法的数据和指令的集合,而脚本语言实 际上就是一种编程语言[幻,例如. Quick Test Professional 的 脚本语言是 VB Script. Mara thon 的脚本语言是 Python. 它们 大多是解释语言,为的是调试起来更方便 [J] 0 Python 是一种 高级编程动态编程语言,简单易用,具有扩展性,且能实现复 杂的功能,适合完成各种高层任务。本文针对嵌入式软件 GUI 自动化测试平台的开发设计川,将 Python 应用于 GUI 测 试领域,从测试脚本扩展嵌入技术、测试脚本生成技术和脚本 驱动执行技术三方面研究基于 Python 语言的 GUI 自动化测试 脚本技术,使嵌入式软件 GUI 自动化测试平台支持 Python 脚 本的创建与执行。 1 测试脚本扩展嵌入技术 1. 1 基于 Boost 的 Python 脚本扩展式嵌入技术 在测试平台中 Python 测试脚本能够灵活的创建与执行需 要以下三部分: 1) 测试脚本编辑:根据测试用例将测试的输 入、输出、判断等操作以脚本形式描述; 2) Python 解释器嵌 入:将 Python 解释器嵌入到嵌入式软件 GUI 自动化测试平台 的程序中,使其具备基本 Python 语言的解释执行能力; 3) 脚 本解释器的扩展。在解析器层次上扩展,根据用户需求,利用 收稿日期 :2015-04-11: 修回日期 :2015-05-l6 0 作者简介:吴立金 (1987-). 男.主要从事为软件测试与软件可靠性 方向的研究 。 平台提供的接口,完成函数名称、返回值类型、参数三方面扩 展,然后将该测试函数归入一种测试行为 L 吨。 Python 解释器嵌入和脚本解释器的扩展要在 GUI 自动化 测试平台软件实现,本文采用基于 800st 的 Python 脚本扩展 式嵌入方式。 800st 是一个久负盛名的 C 十+代码库, 8oost. Python 是 Boost 开发组专门为 C+ 十 /Python 直接的互 操作而开发的类库,除了提供 Python C API 的 C+ 十兼容封 装,也使得整个扩展/嵌入过程更加方便,其有以下特点:1) 对于 Python 基于对象的体系结构,提供了一组封装对象给予 支持.除了基本的 PyObject 对象,还包括了序列容器组。 2) 对于函数和对象封装,提供了一套更为友好的方式。例如,在 函数声明的参数列表中出现可以与 Python 类型直接对应的 char 养、 mt 、 float 等,不需要手动进行与 PyOjbect 祷的转化, 可以识别这些类型。 3) 由于 Python 使用动态类型,对于 Py thon 代码,函数重载没有语法依据,但在 C 十十代码中可能会 需要重载多个函数定义. 800s t. Python 对此也有支持。 8oost. Python 需要预编译才能使用。编译生成 DLL 文 件. Boost. Python 的编译需要使用 p}咄onXX d. lib 、 py­ thonXX d. dll (XX =主版本号+一级子版本号)以及 Py­ thon. h 。基于 Boost 的 Python 脚本扩展式嵌入通过以下步骤 完成: 1)引用8o ost. Python 的头文件< boost/ python. hpp >. 命名空间是 boost:: python 。然后加载 boost _ python. lib 和 boost _ python. dlL 2) 导出 C 十+函数。首先使用 BOOST PYTHON MODULE 宏定义需要导出给 Python 的模块.然后用 boost: : python:: def 语句定义导出的函数、参数列表。第 10 期 吴立金,等:基于 Python 语言的 GUI 自动化测试脚本技术研究 • 3331 • 3) 为 Python 初始化 C++ 模块。使用 BOOST PY THON MODULE (name) 定义了 Python 模块后,该宏会自 动生成一个函数 initname .需要在 Py _ Initialize ()之后调用 这个自动生成的函数,初始化导出到 Python 的模块。例如,导 出模块用的宏 BOOST PYTHON MODULE (yuki) .调 用 Py _ Initialize ()来开启解释器并且生成 mam 模块,然 后初始化该模块调用 inityuki ()。 4) c 十+的平台软件调用 python 脚本。利用 PyRun SimpleString 或 PyRun _ String 执行 Python 脚本指令。另外, C++ 与 Python 交互使用还常用以下函数: Py _ BuildValue 将 C++ 转换成 Python 类型; Pylmport 一 ImportModule 函数加 载 Python 模块; boost:: python:: call method 调用 Python 函数等。 通过以上步骤,将 Python 语言嵌入在 GUI 自动化测试平 台软件中.二者有机结合,使平台软件能够运行支持 GUI 测 试的 Python 脚本。 1.2 测试函数扩展 测试脚本需要模拟对被测件的操作行为和测试逻辑控制行 为,对被测件的操作行为需要扩展出针对 GUI 测试的测试 函数。 1)测试脚本控制函数:测试脚本控制函数是测试脚本执 行的入口,其人口标志是脚本解析器解析出的 Run ()函数关 键字。 Run 函数参数的脚本即为需控制执行的测试脚本。脚本 解析器解析出 Run 函数后,自动调用和解析相应的测试脚本, 解析出测试脚本中的控制关键字,根据控制关键字控制测试脚 本驱动执行。另外,还有控制脚本等待、中断、等待事件等 函数。 2) 鼠标\键盘模拟函数 z 鼠标\键盘模拟函数模拟鼠标 \键盘的操作行为,向被测嵌入式软件发送鼠标\键盘的操作 信息。鼠标键盘按键行为的驱动函数有 5 个: SendKey 函数模 拟键盘的按键激励行为,其参数为键名和按键次数; KeyPress 模拟键盘的按键信息输入行为,其参数为键名和按下或弹起选 择; MouseMoveTo 函数模拟鼠标的移动到某绝对位置的行为, 其参数为 I 坐标、 y 坐标; MouseMove 函数模拟鼠标的相对 移动,相对移动的横坐标和纵坐标; MouseClick 函数模拟鼠 标的点击行为,其参数为点击的左/右键和点击次数; Mouse Down 模拟鼠标的左右键按下或弹起行为,其参数为左/右键 标识和按下与弹起标识。 3) GUI 图像信息处理函数 2GIJI 图像收集函数是在鼠标 键盘操作后,对被测件反应后的图像信息进行收集,以便与预 期输出的图像进行比对判断。 GUI 图像收集函数有 3 个 g Co mparelmage 函数实现图片比对行为.其参数为基准图像名 称及对比区域,通过与实际输出图片比对,返回比对成功或失 败的消息; Findlmage 函数实现图片查找行为,其参数为基准 图像名称及匹配区域,通过在实际输出像中查找是否包含预期 输出图片,返回查找成功或失败的消息; OCR ()函数实现图 文字比对行为,其参数为基准图像名称及识别区域,返回识别 的文字信息。 4) 数值型数据输入输出函数:嵌入式软件通常具有较多 的外围交联设备,在 GUI 测试中,通常包含外围交联设备向 被测嵌入式软件输入数据和从被测嵌入式软件接收数据的行 为.输入和输出接口通常有以太网和串口两种形式。为了模拟 数据的输入和输出行为,底层驱动函数有 4 种: SendToNet ( )、 RecvFromNet ( )、 SendToSerial ( )、 RecvFrom Serial () 0 SendToNet 和 RecvFromNet 函数模拟通过网络接口向被 测件的输入与接收行为.其参数包括网络协议(TCP 、 UDP 、 组播)、数据类型( Basic 、 Block ); SendToSerial 和 Recv FromSerial 函数模拟通过串口向被测件的输入与接收行为,其 参数包括串口协议( RS232 、 RS422 、 RS485 )、数据类型 ( Basic 、 Block) 。 2 Python 测试脚本生成技术 2. 1 测试用例转换 测试用例转换是实现文本测试用例转换为测试脚本的技 术,目的是让计算机自动识别测试用例中数据、行为和控制要 素,以实现嵌入式软件 GUI 测试用例自动执行。为实现测试 用例转换,需要建立测试脚本中相应的要素与 GUI 测试用例 中的数据、行为和控制要素相对应。 1)用例数据变量与脚本变量对应:根据 GUI 测试用例中 所涉及的变量类型,确定测试脚本中相对应的变量类型,必要 时可在脚本解析器中扩展定义新的变量类型。 2) 用例逻辑与脚本中控制逻辑对应 z 测试用例中执行控 制包括顺序、分支、循环等控制条件,根据 Python 语言中自 身的 if 、 while 等控制语句实现。 3) 测试行为与脚本函数对应:根据 GUI 测试用例中控件 操作,将控件事件对应到相应的用户行为,进而对应到脚本相 应的驱动关键字,即与脚本中相应的驱动函数对应。用户行为 是通过脚本关键字输入不同参数进行模拟的。用户行为与脚本 关键字对应关系如表 l 所示 表 l 用户行为与脚本关键字对应关系 用户行为 脚本关键字 孩键点击(字符按键〉 MousePress () 按键点击(删除、回退键〉 SendKey () 组合按键 (Shift+ 上/下/左/;自) SendKey () 组合按键 (Ctrl+X 、} SendKey () 组合按键 (CtrI+ C) SendKey () 鼠标点击 MouseClick () 鼠标单击 MouseClick () 鼠标双击 MouseClick () 鼠标移动 MouseMoveTo (); MouseMove () 鼠标按下拖动 MousePress () &. MouseMove () 用户等待 Wait () 用户观察图像 Comparelmage ();或 Findlmage (); 用户观察文字 OCR () 网口发送与接收数据 SendToNet (); RecvFromNet () .$口发送与接收数据 SendToSerial (); RecvFromSerial () 2.2 测试脚本的自动生成技术 1)基于关键字索引的脚本函数自动生成:在脚本编辑界 面,每当按下"."键,自动出现关键字索引列表,给出相应 的关键字函数,函数后面有相应的注释,根据注释在函数中输 入测试数据参数,是利用脚本关键字的自动输入。 Python 语言语法简单易用,针对典型代码段可采用基于 模板的文字输入,例如将 if 、 while 、 for 等 Python 语言的关键 结构作为模板给予提示,可以通过粘贴方式粘到脚本界面中。第 23 卷计算机测量与控制• 3332 • 扩展驱动 至数据库。 测试脚本 脚'*解析器 2) 基于图像建模的脚本函数自动生成:基于图像建模的 脚本函数自动生成目的是降低人主获取的坐标参数的难度以及 减少脚本编辑的工作量,提高脚本编写的效率。基于图形的脚 本生成主要针对参数是图像坐标的测试函数,包含如下: (1)图像对比函数,图像查找函数以及 OCR 函数的生成。 拖拉鼠标选中需要识别的区域,获取区域位置,根据选择的生 成函数功能会自动映射到脚本的关键词,然后自动转换成图像 识别、文字识别以及鼠标的函数以及相应参数 (2) 鼠标移动与点击类函数,在实时采集的图像中,点击 鼠标自动获取鼠标的位置的像素坐标,自动生成鼠标移动与点 击的函数。 测试脚本驱动执行技术3 脚本驱动执行过程 脚本支持的调度策略包含如下。 1)顺序调度:顺序执行调度只是继续执行下→个测试脚 本。当脚本解析器解析出 Run ()函数(关键字).函数参数 为一个测试脚本 .n 调度脚本上下文没有其它的控制关键字, 则执行顺序调度。 2) 延迟调度:当脚本解析器连续解析出 Wait ()、 Run ()函数(关键字). Wait 函数的参数为一个时间值. Run 函 数的参数值为一个测试脚本,则执行延迟调度。 3) 分支调度 z 当脚本解析器连续解析出 if 、 elif 、 else 、 Run ()函数(关键字), if 、 elif 、 else 判断为真, Run 函数位 于分支体中.且函数参数值为一个测试脚本,则执行分支 调度。 4) 反馈调度 z 当脚本解析器连续解析出 WaitForEvent ()、 Run ()函数(关键字), WaitFor Event 函数参数为一个 事件名称, Run 函数的参数值为一个测试脚本,则执行反馈 调度。 5) 循环调度 2 当脚本解析器连续解析出 for 、 while 、 Run o 函数(关键字), Run 函数位于 for 或 while 的循环体中, 且 Run 函数参数值为一个测试脚本,则执行循环调度。 6) 并行调度: Run 函数参数值为多个测试脚本,则执行 并行调度。具体执行方式是 2 在原有的 Python 脚本解释器基 础上,脚本驱动器利用多线程技术并且添加了测试相关并行执 行控制条件实现。 在测试脚本驱动执行过程中,如果实际输出结果与预期输 出结果不一致时,结束当前测试脚本的驱动,并发送消息至测 试脚本解析器.脚本解析器收到消息后,结束当前脚本的解 析,调度执行下一个测试脚本。 4 (下转第 3337 页) Python 测试脚本的扩展类以及扩展函数部分如下: 1)底层函数驱动类: class CPyG Ultest {public: int m nLineNo: //键盘发送按键扩展函数 图 2 实例应用 3. 1 扩展嵌入脚本的解析原理 脚本解析器中嵌入了 Python 解析器。通过对脚本解析器 的扩展来扩展 Python 脚本功能。驱动函数使用 VC 实现,而 测试脚本采用 Python 实现,本测试系统的脚本解析会调用 Python 脚本解析器, Python 脚本解析器会解析 Python 语言的 关键字和变量,当遇到 Python 语言之外的关键字后, Python 解析器会产生中断,并将执行权交给本测试系统脚本解析器, 本测试系统脚本解析器会查找使用 VC 开发的驱动函数关键 字,当查找到后,解释所得的测试行为由测试函数执行模块根 据其参数配置转换为测试指令发送到测试驱动模块.驱动函数 执行,执行完毕后,脚本解析器向脚本编辑器发送执行结果信 息,脚本编辑器高亮显示下一行,表示执行下一行脚本。本测 试系统脚本解析器将执行权再交给 Python 解析器,同时将驱 动函数返回信息传递给 Python 解析器, Python 解析器继续执 行。这样,本测试系统的脚本解析器与 Python 解析器融为一 体,实现了将 Python 语言编辑与执行界面嵌入到测试系统界 面中,而在后台实现 Python 语言功能的扩展。测试脚本解析 器工作原理如图 1 所示。 测试脚本解析器工作原理 3.2 测试脚本执行调度 测试脚本执行调度是指脚本解析器解析调度脚本.按照调 度脚本中的调度策略,如顺序、循环、延迟调度等.依次执行 相应的测试脚本。脚本驱动执行过程如图 2 所示。启动调度脚 本,并将调度脚本送到脚本解析器;脚本解析器解析调度脚 本,按照调度策略读取依7x读取调度脚本中调度的测试脚本. 解析测试脚本中的关键字,包括 Python 语言自定义的保留字、 变量名、底层驱动函数等,并按脚本的执行顺序实时将变量 名、变量值和底层驱动函数传送到脚本驱动器;脚本驱动器根 据变量名、变量值,为底层驱动函数参数赋值,驱动底层函数 执行。脚本解析器执行底层驱动函数,通过鼠标键盘驱动模拟 鼠标和键盘的操作,通过数值型数据输入输出驱动将模拟数据 发送至被测嵌入式软件接收返回执行结果,通过 GUI 图像信 息处理驱动识别被测件 GUI 状态信息,同时把输出数据保存 PYlhonJ印 本解析精 驱动函敛 3. 中断 5. 返回 2. 脚本解析糯 .掬本 6. 显 图 1 脚本编剧料穰(上接第 3332 页) void TS _ SendKey (const char养 keyName , const char 祷 fun _ key, int nClickTimes) GetLineNo (); g _ pPylnterpreter 一> SendKey (m csMobileName. c = .-, cod,ng:gb2312 '属­ õestt - GUltest ( 审蛋就' ) ...hile 1 T臼 tl.MouseClick (飞eft- 2 ) = ('Righ ,'or-left' ,次~)低标左右键点击及次墨宝 Te到l. ~louse~loveTo ( 100 . 50 ) =(只坐标. y坐稳} Tesu . Co 何、Dð reIn、 aoe C'l S4510币 lel.b啊、 p' . 54 1. ~~2 , 709 , 56 7) W'''1(2000) str ), keyName, m nLinet、Jo , fun key, 图 3 测试脚本函数自动生成 nClickTimes) ; 行对比,然后等待 2 000 ms o //鼠标移动 void TS MouseMoveTo (int x , int y) GetLineNo (); g _ pPylnterpreter 一> Mouse MoveTo (m csMobileName. c str (), x , y , m _ nLine No) ; 2) 脚本控制函数 2 void Run( const std , , string &'filename) {j / Run 函数,用于脚本执行 g_pPylnterpreter 一> RunScript( filename. c_str()) ; } void Wait(int waitTime) ( //Wait 函数,用于脚本等待 g_pPylnterpreter->PyWait(waitTime); } 3) C 语言的测试函数 Python 封装: BOOST PYTHON• MOOULE(PyGUltest) def( "Run" , &'Run); def( "Wait". &.Waitl; deH" HandleDefaultExc" ,&. HandleDefaultExc) ; class_ < CPyGUItest > ("GUItest" , init0); . def ( " SendKey" • &. CPyG Ultest , , TS _ SendKey ) . def ( " Mouse Click" , &'CPyGUltest 门 TS_MouseClick) 4) 测试脚本生成: 以基于图像建模的图像对比函数自动生成为例,在基准图 像中选择要进行图像对比的区域,自动对区域坐标进行建模, 相关函数会出现在测试脚本中,如图 3 所示。 本脚本含义是,先鼠标左键点击两次,然后鼠标移动到像 素左标(1 00 , 50) 处,对左上角 (54 1, 442) 至右下角 (709 , 567) 区域与基准图像 "154510file l. bmp" 对应区域进 5) 脚本驱动执行 z 脚本可以通过直接运行测试脚本运行,也可以通过运行调 度脚本中的 run 函数运行。运行到所编写的关键字函数会进行 高亮显示。 5 小结 基于 Python 语言的测试脚本其灵活性很大程度上取决于 脚本描述的能力以及解释器的解释能力。本文以 Python 测试 脚本与嵌入式软件 GUI 自动化测试平台软件如何有机结合的 为例,研究 Python 语言测试脚本技术,将 Python 解释器嵌入 测试系统中,并将系统的测试驱动模块与 Python 本身的模块 相整合,使得 Python 脚本语言的执行能够驱动测试的运行。 本方法将测试脚本扩展与嵌入建立在解释器层次之上.对于 GUI 软件测试需求直接从解释器本身入手,根据统 一 标准扩 展出相应的测试函数,而这样的函数都能够同系统进行无缝连 接,从而提高了系统的测试能力。本文还研究了测试脚本的自 动生成技术和调度执行技术,提高了嵌入式软件 GUI 自动化 测试平台中脚本的易用性和灵活性。 参考文献: [l J 蒋崇武. ~J 斌,王轶辰,等.基于 Python 的实时嵌入式软件测 试脚本[JJ 计算机工程, 2009.35 (5) , 64-67. [2J 姚实颖,肖沙里,谭 霞,等.软件测试自动化中建立可维护脚本 的技术[J].计算机工程. 2003 , 29 (11) . [3J 桑会兰 自动化软件测试脚本管理工具研究和实现 [0]. 上海: 上海交通大学- [4J 吴立金,唐龙利,特新宇,等.嵌入式软件 GUI 自动化测试平台 研究[J]. ì.t 算机测量与控制. 2015. 23 (4) , 8. [5 ]刘志方,等-一种支持 Python 扩展的测试方法[ P]. 中 国 CN101551778B.
还剩3页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf