自动化测试结构论

发表于:2010-9-13 14:01

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:未知    来源:51Testing软件测试网采编

  所有的自动化测试工具都由一套非常稳定的、成熟的、预设概念的测试思想作为支撑,无论QuickTestPro、SilkTest或者 TestComplete皆是如此。为何本文标题使用了“结构”一词,而非大家经常朗朗上口的“框架”?我认为,“框架”包容的概念过多,而本文又不打算针对某套自动化测试工具进行整体层面的分析和解构,所以使用了相对描述范围比较小的“结构”一词,用它足矣。

  自动化测试的一个经典特征就是应用对象识别容器,用对象识别容器内捕获的对象实现一系列的模拟人工测试动作,其优点是巨大的,缺陷同样明显存在。对象识别容器内置的识别算法、映射算法、排序和出栈算法都让自动化测试工具在执行复杂的、多变的测试案例时,表现出非常耗时和力不从心。另外,对象识别容器并不知晓它所捕获的对象是临时的还是持久的,所以这直接导致了自动化测试过程难以被跟踪和可重复利用。为此,几乎所有实施了自动化测试的企业,都相应为此付出了极其昂贵的后续维护成本。

  回顾国内测试10年,自动化测试应用的大范围推广是必然的,没有一个行业会停滞不前,总有更好更快的技术来提升整个行业的技术水准。在本文中,我会从一个自开发项目(TestMice)展开,描述一些迅捷的、轻量的自动化测试工具结构,例如对象描述,脚本构建,描述性编程,测试数据驱动,场景恢复,插件和编译运行。我不会评价的任何测试工具的好与坏,我只会说明他们为什么要这么做,为什么有的时候鱼和熊掌不能兼得。

  1、对象描述

  在自动化测试中,对象泛指一切可能被捕获和虚拟的东西,可以说一个按钮就是一个对象,一组文字也是一个对象,一个程序进程也是一个对象,包含在 Html里面的某个Activex控件也是等等。自动化测试工具的核心件就是对象识别容器,其他看到的脚本、组合时序、数据和程序外调都是围绕这个核心来开发的。总体而言,针对Win32的对象识别难度要高于对Html对象的识别,主要原因就是早期Win32的体系设计和微软大量未放开的结构和API声明,所以本文使用Win32对象展开一个综述。

  这里使用Windows最常使用两个附件“计算器”和“扫雷”来展开对象说明。

  “计算器”程序使用了大量的标准Win32控件,所以针对其的对象识别还是比较简单的。那么对象识别容器如何捕获“计算器”程序的所有对象,这里面涉及到一个很著名的Windows名词“句柄”,句柄是个很泛意的单词,它是怎么产生的,这又要涉及到Windows系统的一系列机制和相关API函数的调用。我这里简单描述一下,因为我发现国内大部分的测试人员并不知晓Windows创建一个窗体是多么的“复杂”,补充一下相关知识还是非常有必要的。一个窗体(window)诞生首先要向Windows系统进行注册(针对Windows的程序设计是一种标准对象导向的程序设计,业内简称OOP),注册函数为RegisterClass(API),注册完成后由CreateWindow(API)进行窗体(window)构建,如果这个函数执行成功那么就会返回一个32位的整数,简称窗体句柄hwnd。其实在自动化测试工具中经常看到的就是这个hwnd,窗体句柄值的大小多少倒是无关紧要,不过它关联着窗体对象,所有需要进行窗体(window)的操作都必须通过它。这个时候屏幕上还不能马上显示窗体(window),接着使用 ShowWindow(API)和UpdateWindow(API)这两个函数后,这个窗体(window)才会最终显示在我们的计算机屏幕上。剩下的就是构建窗体消息循环,在消息回调函数中声明消息处理方式等等,所以Windows也会被称为消息驱动的操作系统。句柄概念在Windows系统中应用频繁,除了HINSTANCE(实例句柄)、HWND(窗口句柄)、HDC(设备句柄),还有HICON(图标句柄)、HCURSOR(光标句柄)、 HBRUSH(刷子句柄)等等,正是因为句柄的存在,所以对象识别容器才能如此“轻松”的捕获这些对象,在Windows系统里所有的东西都是窗体,Button也是,List也是,TextBox等皆是,窗体具容器最后导至整个Win32变得如此“多姿多彩”了。这里我使用自己编写的一个程序列出整个“计算器”程序的对象列表,大家也可以使用Windows Spy++来获取:

  整个“计算器”程序上所有的对象都被捕获其中,这里产生了父对象和子对象的树形结构,描述方式为:窗体句柄+ Window Text + Class Name,基本上这三个“属性”任意组合都可快速定位到一个对象。为何自动化测试工具中提供如此之多的属性选项,原理就是:属性提供的越多,对象识别容器筛选对象的精度就越高,负面的是额外消耗的资源也会增加,这都取决于对象搜索机制的具体实现(SilkTest在这方面速度相对比较快)。在 QuickTestPro中,另外采用了“映射”机制,即用户所看到的界面识别属性并非是对象识别容器内真正的对象属性,其实用户也无需知道那些难以理解的Window常量、句柄和对应结构描述。用户所能看到的实际上是由测试工具在真实对象上构建的虚拟属性地图,这样的好处是可以附加额外的搜索方式交给用户选择,例如QuickTestPro提供的“对象属性正则表达式”、“对象Index或者Location”定位等,我本人对这种设计方式非常赞同,TestMice项目中同样也实现了这种设计,工具应该提供最大的技术支持,让用户的灵活度充分得到体现。另外所谓的“对象重定义”技术也是采用了上述原理,将非标准对象在UI层面显示为标准Windows对象,本质都是换汤不换药,既然用户看了舒心,那么我认为此项技术还是颇有商业应用前景的。

  扫雷程序的对象识别相对比较难,因为其本身只有一个Window窗体句柄,扫雷窗口的构建和针对扫雷的动作的都是开发者操纵DC和挂钩消息来实现的,这里就需要自动化测试工具提供一种更为灵活的测试方式,即虚拟化对象。虚拟化对象的实现机制并不是很困难,一般来说就是用户操作光标在需要进行虚拟化的区域画出一个不可视矩阵,随即测试工具在指定区域内实现钩子机制,模拟发送Windows鼠标和键盘的各种消息操作,这可以让原来无法进行对象捕获的区域也实现正常的用户模拟操作。这些技术非常普遍的存在于一些黑客工具中,现在甚至有人重写鼠标和键盘的虚拟设备驱动程序,以达到更高层面的操作需求。在 QuickTestPro中提供了一个独立的功能来实现虚拟化操作,在SilkTest中提供了一组函数来实现虚拟化的操作,相比较SilkTest在这块的实力更强也更加灵活。另,虚拟对象在用户构建后是挂载在所属窗体对象下的,同理,Html的虚拟化对象是挂载在对应的Page对象中,理论上虚拟化对象无构建限制个数,但是过多的虚拟化对象会影响测试工具的实际执行效率。

  在对象的世界里,额外并存在着固定测试对象和实时测试对象(也称运行时态对象)的概念,有的固定测试对象在实际软件运行时会发生变更,或者有些对象在静态捕获的时候根本不存在,它只存在于程序运行时态,那么这些现象都会对对象识别容器产生了巨大的挑战。所有的测试工具中都隐含了一些拆分对象属性,以最大的灵活度来匹配、捕获和重构对象,而不管它是否属于上述概念的哪一种,这些都被称为识别的核心执行机制而被保护起来,相关的技术文献并不多。在 TestMice中,我们也是用了一种特殊的机制来增强运行时态对象的鉴别,并且会提供额外的函数或者UI调整模式让用户自由选择,尽量做到所见即所得,达到自动变形的目的,防止对正常测试过程的干扰。可以说在Win32领域,各类测试工具都差不多,没有什么特别突出的,好在这个Win32时代离普通用户是越来越远了。

  另外需要声明的是,在Win32或者Html的值获取中,经常有人问我自动化工具是如何实现的,其实只有二种模式而已,第一种即调用对象本身支持的属性通过相应函数获取,例如获取TextBox的getText(API)等,第二种就是自构建OCR识别程序进行矢量字转换,后者需要投入大量的时间和金钱,最终效果也不见得有多好。当然也可以购买现成的OCR产品,以支持库的方式写入到测试工具中,这些不管是什么测试工具都是支持的。

  2、脚本构建

  个人认为,在所有的自动化测试工具中,脚本的表现形式是决定用户是否选用该工具的关键之一,很多测试工具都输在用户对其脚本的第一视觉映象中,其表现形式如下:

Start Main()
SetWindow ( “Caption=Scical”, “”)
PushButton.Click(”ObjectIndex=3″) //4
PushButton.Click(”ObjectIndex=32″) //+
PushButton.Click(”ObjectIndex=8″) //5
PushButton.Click(”ObjectIndex=27″) //=
Result = Compare (CompareProperties, “Object.Text”, “9. “) //比对结果
End Main

31/3123>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号