虽然进入Web 2.0时代,Web应用非常普及,但客户端软件因为其功能强、速度快、操作灵活,仍然具有很大的优势,特别是图像处理、视频剪辑、三维动画制作等许多工作,还离不开客户端软件。
AutoIt是一款具有BASIC语言风格的客户端软件自动化测试工具,它可以识别各种Windows控件并进行操作和验证,从而实现Windows客户端软件的自动化测试任务。AutoIt的主要特性有:
1) 模拟击键动作(支持大多数的键盘布局) ;
2) 模拟鼠标移动和点击动作,包括单击、双击和拖曳动作;
3) 对窗口进行移动、调整大小和其他操作;
4) 直接与窗口的“控件”交互(设置/获取控件的相关属性);
5) 配合剪贴板进行剪切、粘贴文本操作;
6) 对注册表进行操作;
7) 执行Windows及DOS下的可执行文件;
8) 将脚本直接转换成独立的exe可执行文件。
AutoIT有一个孪生兄弟叫AutoHotKey (http://www.autohotkey.com/),和AutoIT的功能非常相似。源于AutoIT 2.0,并对AutoIT2做了改进,例如对热键支持更好、语法更简单和更容易学习。另外,AutoHotKey源代码是完全开放的,有兴趣的可以自己下载下来研究。但是,AutoIT3.0有了很大的改进,有着更广泛的用户群,比2.0功能强大了许多(如COM、GUI兼容,正则表达式等),易用性改善明显,扩展性更好。
安装
从官方网站(www.autoitscript.com)下载其安装包(如autoit-v3-setup.exe),启动它,就开始安装,并根据提示进行操作。在安装中,要选择脚本操作的模式,如图所示,有两种模式,一般选“Edit the script”。
Run the script, 则双击au3脚本时会直接运行脚本。
Edit the script,则双击au3脚本时会打开脚本编辑器。
然后再选择安装路径(Destination Folder), 可以使用默认路径或指定任意路径,点击“Install (安装)”,系统开始拷贝文件……,完成安装。
AutoIT使用类似于VBScript和BASIC的脚本语言,同时支持更加复杂的表达式、用户函数、循环以及其他功能。AutoIT被设计得尽可能小。使用其中的工具——Aut2Exe,可以把脚本文件编译为可独立运行的EXE文件,而使用AutoItX可以将它作为内核嵌入其他工具中使用。AutoIT安装后,安装目录下的主要模块及其功能说明请参考下表。
AutoIT脚本的语法特征
AutoIT的脚本语法特征,不仅仅包括变量、关键字、宏、设置选项等,详细的语法细节,可以参考其用户手册,也可以去AutoIT中文论坛(www.autoit.net.cn)交流。
1. 变量
AutoIT的变量命名规则:以$开头的字母、数字、下划线的组合,例如$Name、$Jone_Wang、$Num001,这些命名规则都是合法的。
定义变量可以使用Global、Dim或Local来定义。如:Dim $Name、 Global $Name、Local$Name。它们的区别如下。
Global,申明全局变量;
Local,申明局部变量,如函数内部变量;
Dim,如果变量名和全局变量同名,则会重用全局变量;否则就只是申明一个局部变量。
2. 常用关键字
Include,包含一个文件到脚本中,用法:#include "[路径\]文件名";
include-once,指定当前文件只能被包含一次。没有使用这个关键字申明时,一个库文件如果多次被引用,编译器会报错。用法:#include-once;
cs,注释行开始,ce: 注释行结束,两者配合使用,即#cs … #ce;
单独注释一行代码,可以使用分号“;”注释。
3. 宏
AutoIT提供了大量的宏,极大地方便了脚本的编写。宏都以@开头,如@OSVersion返回当前操作系统版本;@ProgramFilesDir返回Program Files文件夹路径;@YEAR返回当前年份(4位数)等。更多的宏,请参看AutoIT帮助。
4. 设置选项
AutoIT可以通过Opt()函数来实现运行时的各种设置,如:
Opt("MouseCoordMode", 1) 设置鼠标函数使用屏幕绝对坐标值;
Opt("MouseCoordMode", 0) 设置鼠标函数使用当前激活窗口的相对坐标值;
Opt("WinTitleMatchMode", 1) 设置窗口函数标题匹配时从头开始匹配标题;
Opt("WinTitleMatchMode", 2) 设置窗口函数按含有某子串模式来匹配标题。
更多配置选项,请参看Opt()函数的帮助。
5. 内置函数
AutoIT内置了大量常用的函数,主要包括:操作窗口和控件类、控制鼠标键盘类、文件目录管理类、字符串处理类等,基本可以满足绝大多数的需求。同时,官方包中还带了大量第三方的库函数,网络上也有很多人在不断扩充库函数。如果还找不到所需要的特殊功能函数,我们还可以自己编写库函数。
6. 如何编写库函数
当我们对一个复杂的应用程序编写测试脚本的时候,可能有许多功能段是会重复出现的。为了减少编写脚本和维护脚本的工作量及复杂度,我们可以将那些含有相同逻辑的脚本封装成函数,并将这些函数按照功能或类型特点,分类组织在不同的文件中,然后在使用这些函数的脚本里包含这些文件。函数的编写方法:
1) 将功能代码嵌在Func和EndFunc之间。
2) 定义函数的参数及其返回值。
3) 函数名必须用字母或下划线“_”开头。合法的函数名如MyFunc、Func1、_My_Func1等。
下面是一个示例函数,该函数的功能是返回一个数乘以2后的值。
;Head.au3
Func MyDouble($value)
$value = $value * 2
Return $value
EndFunc
写脚本时,可以随时通过F1键调出查看。使用这些库函数时,须要在脚本中包含对应的库文件(如#Include
如何使用AutoIT 完成单机程序的测试
1) 识别窗口的方法
编写自动化脚本的时候,首先要解决的一个问题就是如何(在众多窗口中)准确识别出目标窗口。一般来说,我们常把窗口的标题(Title)作为它的识别方法。但有时候只给出窗口标题还不够,还要同时给出标题及文本(text)。
AutoIt的大部分窗口函数都有窗口标题和文本参数,比如说WinWaitActive函数。这个函数的功能是使脚本暂停执行并一直等到指定窗口出现且激活为止。
WinWaitActive ( "窗口标题", ["窗口文本"], [超时时间] )
其中“窗口标题”是必须指定的参数,而“窗口文本”和“超时时间”都是可选参数。
AutoIt支持4种“窗口匹配”模式(识别模式)。若要更改此模式,可通过函数AutoItSetOption修改WinTitleMatchMode属性。
AutoItSetOption ( "option" [, param] )
Opt("WinTitleMatchMode",1) ;注释1=start,2=subStr,3=exact,4=advanced,-1 to -4=Nocase
模式1(默认)只匹配标题的前面部分
模式2 标题的任意子串皆可
模式3 完全匹配标题
模式4 高级模式,一些特殊的字符串可用来代替窗口标题参数,这样就可以使用窗口的类别名或句柄来识别窗口了。这些特殊的字符串不能含有空白符(whitespace,一般指空格、制表符、回车等),它们分别是:
"classname= CLASSNAME",只匹配具有相同类别名的窗口。例如,要识别一个类别名为“MYCLASS1”的窗口,则可把"classname=MYCLASS1"作为窗口标题参数使用。
"active",表示当前激活的窗口(其作用与默认的WinTitleMatchMode模式下的空字符串一样)。
"last" 或 "",使用上一次成功匹配的窗口,这样就不必三番五次地指定窗口标题和窗口文本了。
例如:
AutoItSetOption("WinTitleMatchMode", 4)
WinWaitActive("无标题 - 记事本")
WinClose("last") ;关闭前面匹配成功的记事本窗口
*注意:如果"classname="、"active"、"last"或""都没有作为窗口标题出现在该参数中,则自动以模式1进行匹配。
2) 窗口句柄
AutoIt中的变量可用来存储窗口句柄(Window Handles / HWNDs)。所谓窗口句柄是指Windows自动分配给每个新创建的窗口的特殊值。窗口句柄可用来代替窗口标题参数。使用窗口句柄来代替窗口标题的好处是能够更加精确地识别窗口。
WinGetHandle、WinList和GUICreate都会返回窗口句柄,示例:
$handle = WinGetHandle("无标题 - 记事本", "")
WinClose($handle)
*注意:不管当前的WinTitleMatchMode被设置为何种模式,窗口句柄始终可用。
3) 识别控件的方法
AutoIt提供了直接操作控件的功能。窗口上能看到的东西大多数都是以下控件中的一种:按钮、列表框、文本编辑框、静态文本等。例如,系统自带的记事本程序的主窗口也只是一个相对而言比较大的“编辑框(Edit)”控件罢了。AutoIt主要支持标准的Microsoft控件。有些应用程序使用了大量的自定义控件,很像是标准的MS控件,但却无法被脚本程序识别,就需要特别的办法来解决,常用的办法有:
1) 使用相对位置或绝对位置来定位自定义控件。可以通过在父窗口的相对位置,或者与可识别控件之间的相对位置来操作,也可以屏幕上的绝对位置来定位。
2) 对于有些无法通过正常方法取出控件里的文字或其他信息,但支持复制粘贴的控件,可以借助剪贴板,先将该控件里的文字或其他信息拷贝到剪贴板,然后通过AutoIT的操纵剪贴板函数来取出相关信息。
3) 对于一些绘图类软件或界面显示效果比较复杂的软件,可以截取完整的屏幕或窗口区域的屏幕并保存下来,作为测试结果的附件,供测试人员事后通过手工进行分析。
一般而言,最好的方法就是使用控件ID ,但如果控件ID无法获得或靠控件ID还不足以保证能识别目标控件(例如,同时存在几个相同ID的控件,这种情况通常发生在静态文本控件上),那么就须要使用其他的属性,或者属性的组合。
4) 操作窗口和控件
确定了窗口和控件的识别方法之后,可以使用AutoIT提供的函数来完成对窗口和控件的操作。常用的函数如下。
激活指定的窗口(设置焦点到该窗口,使其成为活动窗口):
WinActivate ( "窗口标题" [, "窗口文本"] )
关闭指定窗口:
WinClose ( "窗口标题" [, "窗口文本"] )
移动指定的窗口或调整窗口的大小:
WinMove ( "窗口标题", "窗口文本", X坐标, Y坐标 [, 宽度 [, 高度[,速度]]] )
显示、隐藏、最小化、最大化或还原某个窗口:
WinSetState ( "窗口标题", "窗口文本", 标志 )
向指定控件发送鼠标点击命令:
ControlClick ( "窗口标题", "窗口文本", 控件ID [, 按键 [, 点击次数 [, X坐标 [, Y
坐标 ]]]] )
向指定控件发送命令:
ControlCommand ( "窗口标题", "窗口文本", 控件ID, "命令" [, "选项"] )
设置输入焦点到指定窗口的某个控件上:
ControlFocus ( "窗口标题", "窗口文本", 控件ID)
向指定的控件发送字符串:
ControlSend ( "窗口标题", "窗口文本", 控件ID, "字符串" [, 标志] )
修改指定控件的文本:
ControlSetText ( "窗口标题", "窗口文本", 控件ID, "新文本",标志 )
向激活窗口发送模拟键击操作:
Send ( "按键" [, 标志] )
执行鼠标点击操作:
MouseClick ( "按钮" [, X坐标, Y坐标 [, 点击次数 [, 速度 ]]] )
执行鼠标拖曳操作:
MouseClickDrag ( "按钮", X1坐标, Y1坐标, X2坐标, Y2坐标 [, 速度] )
5) 验证
在完成测试用例的操作步骤之后,黑盒测试方法主要是通过检查和比较软件的输出结果(包括界面、文件、数据等)来验证测试的结果,判断软件是否存在缺陷。软件界面的检查主要是检查软件窗口和控件的各种状态、标题、文本和图片等信息,并将检查结果写入最终的测试报告中,以供分析。
1. 验证窗口、控件状态常用的方法
获取窗口控件的坐标位置和大小等:
WinGetPos ( "窗口标题" [, "窗口文本"] ) ;用于窗口
ControlGetPos ( "窗口标题", "窗口文本", 控件ID) ;用于控件
获取窗口控件的状态(包括是否可见、是否激活、最大化、最小化等):
WinGetState ( "窗口标题" [, "窗口文本"] ) ;用于窗口
ControlCommand("窗口标题", "窗口文本", 控件ID,选项) ;用于控件
检查窗口是否存在:
WinExists ( "窗口标题" [, "窗口文本"] )
2. 验证窗口、控件文本常用的方法
获取窗口的完整标题名:
WinGetTitle ( "窗口标题" [, "窗口文本"] )
获取窗口中的文本:
WinGetText ( "窗口标题" [, "窗口文本"] )
获取控件上的文本:
ControlGetText ( "窗口标题", "窗口文本", 控件ID)
3. 验证图片或显示效果的常用的方法
AutoIT没有提供图像比较函数,须要自己开发相应的函数。如果不准备开发这方面的功能,就只有将要检查的图像或效果用截屏的方法保存下来,并附在测试报告中,让测试人员事后人工分析。
截取整个屏幕或指定区域:
_ScreenCap_Capture("C:\Image1.jpg")
或_ScreenCap_Capture("C:\Image2.jpg", 0, 0, 796, 596)
截取指定窗口:
_ScreenCap_CaptureWnd("C:\Image.jpg", 窗口句柄)
4. 验证文件常用的方法
检查文件是否存在:
FileExists ( "路径")
获取文件大小:
FileGetSize ("路径")
获取文件基本属性(包括只读,隐藏等):
FileGetAttrib ("路径")
5. 其他验证
返回当前鼠标指针形状的ID:
MouseGetCursor ( )
获取当前鼠标的坐标位置:
MouseGetPos ( [dimension] )
示例
演示了如何打开计算器、找到计算器窗口、操作计算器完成“1+2”的计算和验证,并将检查的结果写入测试报告。
首先要启动计算器,其可执行文件名是calc.exe。这样,启动计算器可以使用Run函数,在编辑器里面输入:Run("calc.exe")。
启动了计算器后,须要等待其窗口出现并且变成激活状态,输入:WinWaitActive("计算器"),才能发送键击动作。
在确定计算器窗口可见之后,下一步要点击计算器上的按钮。使用窗口信息工具找到按钮“1”、“+”、“2”和“=”的ID,如下图所示。然后通过ControlClick函数完成点击动作。
然后,验证计算器计算的结果。结果显示在计算器窗口上端的Edit控件里,使用AutoIT窗口信息工具获得Edit控件的ID号(403),再通过ControlGetText读取控件里的TEXT值。
$Result=ControlGetText("计算器“,"",403)
最后,将这个值($Result)与期望的结果(正确值3)进行比较,并将比较结果写入测试报告。
if $Result=="3. " Then
FileWriteLine("c:\result.txt","正确:和期望结果3一致")
Else
FileWriteLine("c:\result.txt","错误:和期望结果3不一致, 实际计算结果为 " &
$Result)
EndIf
; 注: 计算器Edit控件里显示的结果后面有一个点和一个空格
测试执行完后,可以使用WinClose关闭计算器程序: WinClose("计算器") 。
如何使用AutoIT完成多机交互测试
对分布式软件(如MSN、QQ等)进行自动化测试时,就必须考虑不同机器上运行的脚本之间相互通信或传递信息的问题,包括同步多台机器上脚本的运行时序,即处理测试用例中操作步骤的依赖关系。如果使用AutoIT来完成这类测试,由于AutoIT是基于客户端的测试工具,没有提供良好的通信机制,不能单独完成分布式应用程序的测试,而必须借助第三方开源通信平台STAF/STAX来协助完成。
STAF(Software Test Automation Framework,http://staf.sourceforge.net/index.php)是自动化测试框架,提供一种可插拔的机制,通过服务调用(如远程处理、资源管理、监控等)来支持多平台与多语言的分布式结构。而STAX(STAf eXecution engine)是基于STAF的执行引擎,实现并行执行、嵌套测试用例、控制运行时间等。
其余的示例内容见朱少民老师的《轻轻松松学习自动化》。
本文来自朱少民老师的《轻轻松松自动化测试》,如有侵权,请通知后删除。