通过前面系列有关QuickTest博文的介绍及操作,已经对QuickTest有了一定的了解,本篇博文就通过实例图文并茂的对QuickTest下的对象进行深入的了解与剖析。
1. QuickTest工作原理
通过前面陆续blog文章中有关QuickTest文章中的学习,了解到 QuickTest 对录制的测试对象进行分类,例如,标准 Windows 对话框 (Dialog)、Web 按钮 (WebButton) 等。 QuickTest存储对象与对象属性的仓库叫对象库(Repository)。QuickTest录制被测应用程序时,录制过程中所涉及到的对象均被添加到QuickTest对象库中。
QuickTest录制对象时,QuickTest会尝试记录对象的属性与属性值,并存放于对象库中。对于每一个测试对象,QuickTest 对象库中都有一组属性及属性值列表与之相对应。在对象属性列表中, QuickTest将选取一些属性,选取的这些属性组合必须能够唯一描述(标示)该测试对象。QuickTest测试脚本回放过程中,根据对象库中记录的对像的属性(或多个属性列表组合),与回放过程中被测应用程序中的对象进行对比。如找到相匹配的对象,则再按录制过程的录制的操作,使被测应用程序中相匹配的对象执行某些操作,如Set或Click等。
2. 初识测试对象
QuickTest测试对象库是对象与对象属性的集合,QuickTest 用对象与对象属性来表示应用程序中的对象。QuickTest记录下来的每一个测试对象,均包括以下两项内容:
一个可以唯一标识该对象的属性列表。
QuickTest录制时对该对象所执行的操作方法(动作)。
学习QuickTest测试对象还需要区别两个重要概念:测试对象与运行时对象。
测试对象(Identification Properties):QuickTest 录制过程中所录制被测应用程序中的对象称为测试对象。QuickTest 使用测试对象标示被测应用程序中对象,并存储该对象属性及属性值,这些属性帮助于QuickTest在运行(回放)会话期间标识和检查被测应用程序中的对象。
运行时对象(Native Properties):应用程序运行(回放)会话过程中,实际运行的对象。
当添加一个对象到对象库时,QuickTest 将进行以下几步操作:
录制QuickTest 对象,并创建相应的测试对象与被测应用程序中的对象相对应。
读取应用程序中对象属性的当前值,然后将属性和属性值列表与测试对象一起存储到对象库中。
确定测试对象名称(一般使用测试对象某个重要属性的值)。
QuickTest 将录制过程中对测试对象执行操作记录在测试脚本中。
以QuickTest自带的Flight订票系统为例,测试场景如下:
表测试场景1
| 操作 |
数据 |
期望结果 |
场景1 |
1. 输入用户名 2. 输入密码 3. 点击OK |
正确的数据 用户名/密码 mercury/mercury |
正确登录系统 |
如图所示,在录制场景1过程中,当点击Agent Name输入域并输入Mercury时,QuickTest将操作对象标示为WinEdit测试对象,同时将该对象的属性和属性值存放于对象库中,在测试对象属性列表中选取一个属性值(Agent Name)作为WinEdit测试对象的名称。QuickTest还将录制过程中对 WinEdit对象执行的Set方法记录在测试脚本中。在关键字视图右击Agent Name对象,选择“Object Properties…”,打开该对象属性对话框。
对象属性
如图所示,场景1录制完成后,在专家视图中显示的脚本。
专家视图
回放测试脚本时,QuickTest 通过录制过程中对象库中对测试对象的描述(一组用于唯一标识该测试对象的属性和属性值)来标识应用程序中的对象。测试对象及其属性和属性值的列表存储在对象库中。场景1录制的测试脚本回放过程中,QuickTest 在对象库中查找到WinEdit对象。QuickTest在被调用的应用程序中查找与对象库中WinEdit 对象相一致的对象,该对象为WinEdit,且属性及属性值包括:nativeclass=Edit,attached text=Agent Name。找到相匹配的对象后,该对象执行Set操作方法。
注: 在某些情况下,即使对象的一些属性值发生了变化,QuickTest 也能够利用智能标识机制来标识对象。但是,如果知道某特定对象的属性值发生了变化,应尝试纠正测试对象属性或属性值,以便 QuickTest 可以根据其基本对象描述来标识该对象。 |
3. QuickTest对象库
通常在QuickTest开展自动化过程中,都是将测试对象都是保存在对象库中。QuickTest对象库分为本地对象库与共享对象库。要选择在哪里保存对象呢?先看不同测试场景之间的对比。
表测试场景1
| 操作 |
数据 |
期望结果 |
场景1 |
1. 输入用户名 2. 输入密码 3. 点击OK |
正确的数据 用户名/密码 mercury/mercury |
正确登录系统 |
表测试场景2
| 操作 |
数据 |
期望结果 |
场景2 |
1. 输入用户名 2. 点击OK |
正确的数据 用户名 mercury |
提示请输入密码的错误信息 |
观察场景2的录制与前面录制的场景1,有什么相同之处?又有什么异同之处?
相同之处即两个场景它们都对对象AgentName、OK对象进行了操作,并且都在对象库里记录这两个对象。不同之处是场景1由于录制过程中对Password也进行了操作,因此对象库中还存储了 Password对象。我们此时是否应该进行一些思考?读者是否也在思考同样的问题。既然AgentName、OK对象在两个场景中都存在,是否可以将场景1中的两个对象让场景2调用使用呢?答案是肯定的。这也就是接下要讲到的本地对象库与共享对象库。
本地对象库:每个测试场景(Action)都有自己的对象库,该对象库则称为本地对象库。因此以往录制的脚本使用的是什么对象库呢?本地对象库。
共享对象库:通俗讲即多个测试场景(Action)共用的一个对象库。结合前面所学习的Action,就是多个Aciton公用一个对象库,该对象库称为共享对象库。
那本地对象库与共享对象库除了定义上的区别外,是否还存在其他方面的异同呢?
本地对象库:是与Action相关联,本地对象库主要以文件ObjectRepository.bdb与Resource.mtr存储数据。每创建一个新的Action时会自动创建相应的本地对象库,同时创建生成这些文件。
共享对象库:与本地对象库的区别是,多个Action可以共用一个对象库 ―― 共享对象库。共享对象库可以以Tsr后缀名结尾。在复杂业务系统的测试框架中,建议使用共享对象库。同样,如因为业务复杂,对对象库管理不合理,会造成对象库冗余,后期维护工作复杂,Action运行速度慢等缺点。
因此,当设计和创建测试脚本时,首先必须考虑如何管理录制过程中的测试对象。是使用本地对象库,还是使用共享对象库。那何时使用本地对象库?何时使用共享对象库呢?
针对以下情况建议使用本地对象库:
创建单一操作测试脚本时。
不需要频繁修改对象属性时。
针对以下情况建议使用共享对象库:
使用关键字驱动测试技术。
包含(创建)多个测试脚本、接口或对象设置的多个测试时。
需要经常维护测试对象的属性或有规律的更新测试对象属性。
注: 本篇博文中剩下小节如未做特殊说明,则均是针对本地对象库进行讲解。 本篇博文附表1列出了对象库窗口和对象库管理器对于对象库管理的不同的功能与特性。 |
3.1 对象库窗口
“对象库”窗口显示录制脚本过程中的所录制的对象与对象的属性。在整个测试过程中所录制的对象在“对象库”中以树形结构展示。在“对象库”中可以使用对象属性对话框查看或修改库中任何测试对象的属性,或者将新建对象添加到库中。本博文仍然以录制好的飞机订票系统为例,对“对象库”窗口进行讲解。
“对象库”窗口
如图所示为录制飞机订票系统(Flight)完成后形成的对象库。点击QuickTest测试工具栏中对象库图标或点击菜单栏【Resource】―【Object Repository….】打开当前测试脚本的对象库。
对象库
对象库窗口左侧为测试脚本录制过程中所捕捉的对象(对象按树状展示)。
对象库窗口右侧顶部(Object Properties)显示了某对象属性的相关信息:
名称(Name):QuickTest 分配给测试对象的名称。
类(Class):对象所属的类。
对象库(Repository):对象库类型(本地库或共享库)。
对象库窗口右侧下部(Test Object details)显示了某对象的详细属性及属性值。
描述属性(Description properties):Description属性及属性值用于标识运行会话过程中的对象。在此可以添加和删除维护测试对象的描述属性。
QuickTest使用描述属性来确定测试对象。如QuickTest回放过程中不能够识别对象,可以通过添加、修改描述属性或删除描述属性,以达到能够识别回放时被测应用程序中的对象。
顺序识别码(Ordinal identifier):顺序识别码以数值形式体现,通过维护顺序识别码顺序与位置可以区别与被测应用程序中的其他相同对象(相同对象指多个对象的属性及属性值均相同)。
附加信息(Additional details):在测试脚本回放过程中,如果对象库中对测试对象的属性描述不能够唯一确定被测应用程序中的对象,可启用智能识别。通过将智能识别设置为True或False来指定是否启用QuickTest强制智能识别。
注: 本节只对对象库中现有对象的“对象属性”进行讲解。而未存储在对象库中,对象的“对象属性”则在后续的文章进行讲解 |
如图所示,为本篇博文录制飞机订票系统(Flight)(测试场景1)的对象库中,选择Agent Name对象后的对象属性框(Object Properties)。对象属性的各个组成部分已在对象库窗口中进行详细解释,在此不再复述。
对象属性
4. 编辑与修改对象属性
随着被测对象(应用程序或网站)的变化,最初录制测试脚本中的对象可能在新发布的Build中已发生了变化。如果不对对象库中相应的测试对象做出更改,则测试脚本回放时肯定会失败。因此,当测试对象在新发布的Build中已发生了变化,则需要对对象库中相应测试对象的属性或属性值进行维护。
假如,录制完测试场景1(飞机订票系统(Flight))测试脚本后,又发布了新的Bulid,而新版本中Agent Name对象的“attached text”属性的属性值发生了变化,由“Agent Name”变为了“Name””。由于其对象属性值的变化,测试脚本回放时停止在“Agent Name”操作步骤处,弹出错误提示信息并停止运行测试脚本。
出现错误提示信息后,又该如何处理呢?通用的方法是维护对象库中的对象属性。
1. 如图所示,打开测试场景1的对象库。在对象库窗口对象树中选择“Agent Name”对象。在对象库窗口右侧,描述属性(Description properties)中“attached text”属性值区域单击鼠标左键,此时其属性值区域变为可编辑状态。将“attached text”属性值由“Agent Name”更改为“Name”。然后回放修改对象属性后的测试脚本,此时看到可以观察到测试脚本成功回放。
修改对象属性
2. 如图所示,除了使用步骤1的方式来维护对象属性外,还可通过查找替换来更改对象的属性。如将步骤1中“attached text”属性值由“Name”再修改为原来的“Agent Name”。点击对象库窗口工具栏中的查找\替换图标,弹出查找\替换窗口,填写相应查找对象的属性及属性值及替换后相应属性的属性值,点击替换,则可以观察到“attached text”属性值由“Name”被修改为原来的“Agent Name”。
查找/替换对象属性
注: 如果希望搜索时查找与输入的单词完全匹配,请选择“Match whole word”。 如果希望搜索时区分大小写字母,请选择“Match case”。 |
有些时候,测试脚本回放失败,并不是最初录制测试脚本中的对象在新发布的Build中发生了变化引起的。而是由于以前对象库中对该对象的属性描述,再新发布的被测应用程序中无法唯一确定被测对象。此种情况,需要添加对该对象的属性描述。 如下举例说明。
1. 如图所示,测试脚本在新发布的Bulid中回放失败,而失败的原因是某对象的现有属性,不足以在新的bulid中确定或标示该对象。可以通过添加对象属性来维护测试对象。在对象属性窗口,点击弹出对象的其他属性,为选定对象添加其他的属性及属性值。添加完毕,调试测试脚本,可看到测试脚本成功回放。
添加属性
5. 添加对象到对象库
假如需要对测试脚本验证的思路进行调整。博文中使用的场景1与场景2,对测试场景的录制顺序进行调整,先录制了测试场景2。场景1录制过程中,只是比场景2多了对Password对象的操作。那能否不录制场景1,而在场景2的基础上做些操作,从而满足场景1的需要呢?学习了本节添加对象知识后,则可以实现由场景2变为场景1的需求。
假设某场景验证内容为打开飞机订票系统登录框,输入用户名、密码,点击取消而不是确定,目的是为验证是否能正常退出。那如何对已有的测试脚本进行调整呢?是否需要重新录制脚本呢?可以通过添加对象到对象库,并且在关键字视图中调整关键字顺序来实现。
添加对象有多种途径,主要有如下两种方式:
利用“Active Screen”添加对象。
利用对象库添加对象。
1. 如图所示,在“Active Screen”窗口中在“Cancel”所在位置右键单击,在右键列表中点击“View/Add Object”。
添加对象
2. 如图所示,第一步点击“View/Add Object”后弹出“Object Selection”对话框。“Object Selection”对话框中选择添加的对象(Cancel)。
选择对象
3. 如图所示,“Object Selection”对话框中点击【ok】打开“Object Properties”窗口。
对象属性
4. 如图所示,点击【Add to Repository】按钮,可以看到【Add to Repository】变为了【View in Repository】。
对象属性
5. 如图所示,点击【View in Repository】进入对象库,在对象库中,可以观察到对象库中左侧对象树中,多了“Cancel”对象。
对象库
6. 如图所示,在关键字视图中,选中“OK”操作对象所在行,可以看到“OK”关键字右侧出现了下拉箭头,在下拉对象列表中选中“Cancel”对象。
更改操作对象
7. 如图所示,将“OK”对象替换为了“Cancel”对象后。回放测试脚本,回放过程中可以观察到飞机订票系统,输入用户名、密码,点击取消而不是确定。
关键字视图
6. 删除对象
对象库中除了可以编辑、修改、添加对象外,当然也能完成简单的删除对象操作。
相对于添加对象,删除对象,就较容易理解。博文一直使用的测试场景1与测试场景2,场景1相比于场景2,仅仅多录制了Password对象及对该对象的操作。如果不录制场景2,是否能够实现由场景1变为场景2呢?答案是肯定的,在场景1中删除Password对象,并在关键字视图中调整场景1的测试脚本,即可实现由场景1变为场景2。
1. 如图所示,打开场景1对象库,在对象库中左侧对象树中选中Password对象。
选择对象
2. 如图所示,右击Password对象,选择Delete,删除Password测试对象。
删除对象
3. 如图所示,打开场景1关键字视图,在关键字视图中,删除Password对象所在的操作行。
添加操作对象
4. 将场景1另存为场景2的测试脚本,此时,已完成由场景1至场景2的变化。省去了场景2录制的时间,提高了测试工作效率。
7. 附表1