qtp入门教程

从理解QTP ADD-INS开始
QTP Add-ins即为QTP插件。通俗理解就是QTP识别不同控件对象类型的一套标准。
当我们在启动QTP时,QTP会首先弹出一个Addin-Manager窗口,这个窗口主要提供给自动化测试人员选择相应的插件。
插件的类型:
Web
ActiveX
VB
.Net
WPF
…..
如何择插件:
首先确定被测控件对象类型,然后择相应的插件
在必要时需要选择多个插件
择插件注意事项:
切记不要盲目的根据被测程序的开发语言来确定插件的选择
要严格遵守插件的定义,必须要根据被测控件对象的类型来进行择插件




QTP对象鉴别原理
作为一个自动化测试工程师来说,掌握测试对象的鉴别原理是非常重要的,因为几乎任何自动化测试工具在对象识别原理上几乎都是大同小异的,那么对于QTP这个工具来说,它的鉴别原理大致是这样的:
输入预期测试封装对象鉴别属性
获取实际运行封装对象鉴别属性
对比预期与实际是否一致
 
预期测试对象 = QTP对象库中的测试对象
实际测试对象 = QTP在运行时的被测对象
若是对比之后可唯一匹配,那么对象即识别成功;反之,则失败。




QTP测试对象鉴别属性的选取
qtp识别对象是通过匹配测试对象的关键属性是否与真实对象的关键属性唯一匹配来进行的,这一点在QTP对象鉴别原理中已经都讲的很清楚了,那么要匹配属性,肯定要一个依据才行,不可能自己拍脑袋说哪个属性就哪个属性,其实在qtp中只要是能够唯一识别的属性都可以作为鉴别属性,但是这不是一个通用的办法,在qtp这个工具本身就对这一项做了一定的封装。对于不同类型的控件封装了一些常用的鉴别属性,这样做的好处就是不用每次都取判断哪些才是唯一的鉴别属性。
在Tools --》Object Identification 中,首先确认需要查看的控件类型,这个其实就是取决于选择哪个插件,择好了插件之后,在左边一栏及可以看到对应的qtp封装对象,这是qtp自己封装的测试对象,随意选择一个封装对象,即可在右边看到相应的关键鉴别属性,这个其实就是描述对象的关键属性。一般情况下只要需要描述这些关键属性即可成功一个对象。这个在后面对象库操作和描述性编程中中也会讲到。




什么是QTP封装对象
所谓qtp封装对象就是qtp自身虚构出来的一种测试对象
这种对象是根据qtp的插件标准定制出的测试封装对象
它的作用主要是作为一种预期参考对象可与实际真实对象进行对比
主要体现:
qtp对象库
Object spy
object identification


什么是真实被测对象
所谓真实测试对象就是普通的真实对象,而非qtp封装对象。
它是一种真实存在的对象。
在识别对象过程中,qtp会把真实被测对象转化为qtp运行封装对象并把其作为一种实际结果对象。
在匹配对象时,qtp封装测试对象是作为一种预期虚拟对象,而真实被测对象时作为一种实际真实对象。
这一点一定不要搞混淆了。
它主要体现:程序界面上的真实控件对象




QTP对象库
qtp对象库简称OR,也就是object Repository,其实就是一个存放qtp封装对象的地方,自从mercury引入了关键字驱动测试之后,对象库就一直起着举足轻重的作用。
qtp对象库的优势:
对象与脚本的完美分离,降低巨大的维护成本
更好的定位对象识别问题,提高对象识别排错的效率
可轻易的修改对象库中对象的描述属性,并能够更好的管理对象。
 
在qtp中可以直接通过ctrl+r 打开qtp对象库,并可在其中进行添加对象、删除对象、复制对象等操作。
并且可以实现某个对象的属性增删改操作。这一点功能是非常实用的,以后可以结合spy和对象高亮进行快速排错。


如何添加对象到对象库(OR)
在QTP中添加对象到对象库的方式一共有三种:
录制过程中自动添加对象
手动添加测试封装对象到对象库
SPY中抓去直接添加 (QTP 11 新功能)
这里主要介绍手动添加测试对象的方式:
当打开QTP之后,点击Ctrl + R之后,即可打开对象库
此时如果需要手工添加测试对象到对象库,只需点击界面上的”Add Objects”,鼠标变更为手型
点击任何你想要添加的测试对象即可直接添加到对象库中
注意:QTP本身无法添加隐藏对象


测试封装对象与运行封装对象
前面的文章中已经介绍了什么是封装对象
而qtp封装对象其实还分为两种类型:
测试封装对象(TO)
运行封装对象(RO)
测试封装对象简称TO,通俗的说就是对象库中的静态对象,对象属性为对象库中显示的属性值
运行封装对象简称RO,通俗的说就是spy中的动态对象,对象属性为spy中查询出来的实时属性值
说的再明白一点: TO就是对象库中的封装对象,RO就是spy中查出来的封装对象。


GETTOPROPERTY与SETTOPROPERTY
测试封装对象称为TO,既为对象库中的测试对象,而在qtp中提供了两种运行时修改或者获取TO对象属性的方式:
GetTOProperty
SetTOProperty
GetTOProperty作用是运行时获取测试封装对象的属性值
<code class="VB">msgbox Browser("Browser").Page("Page"). _
W
WebEdit("WebEdit").GetTOProperty("name")</code>
分析:通过以上脚本可以直接获取到对象库中名为WebEdit文本框对象的name属性
SetTOProperty作用是运行时动态设置测试封装对象的属性值
<code class="VB">Browser("Browser").Page("Page"). _
W
WebEdit("WebEdit").SetTOProperty "name","helloworld"</code>
分析:通过以上脚本可以直接在运行时把WebEdit对象的name属性实时更改为helloworld
注意:此处的所动态效果只在运行时效,当测试运行完毕之后既会自动恢复初始状态,例如:修改测试对象的属性值,只在运行时起效,当测试运行完毕,测试对象的属性值即会自动还原初始值。


GETROPROPERTY与SETROPROPERTY
之前已经在iquicktest中讲解过了GetTOProperty与SetTOProperty的区别与用法
这两种方法主要是用于针对qtp测试封装对象中的运行时的一些操作。
那么在之前的内容中,我们已经介绍过了测试封装对象与运行封装对象,
那既然qtp提供了测试封装对象的函数,那就也不会遗漏运行封装对象的一些函数方法。
GetROProperty
SetROProperty
GetROProperty:作用是获取运行封装对象的属性值,而非对象库中的属性值。
<code class="VBScript">Msgbox Browser("Browser").Page("Page"). _
W
WebEdit("WebEdit").GetROProperty("name")</code>
SetROProperty:QTP并没有提供此函数,原因其实很简单,因为本身这些方法本来就是针对封装对象的,所谓封装对象其实是qtp虚拟出来的一套标准接口对象,因此不存在修改其运行封装属性这一说法。但是我们可以修改控件的自身属性。
GetROProperty:作用是获取运行封装对象的属性值,而非对象库中的属性值。
<code class="VBScript">Browser("Browser").Page("Page"). _
W
WebEdit("WebEdit").Object.value = "test"</code>


SPY让对象无处藏身
Spy是一个自动化测试脚本编写过程探测运行封装对象的不可缺少的工具。当你打开qtp之后,可以在工具栏中找到一个带着高帽子图案的按钮即是Spy。
当你打开它之后即会弹出spy窗口,此时在界面上可以找到一个手势的按钮,在按下之后即可直接抓取对象,当你抓取完毕即可在spy窗口中看到两类属性和方法
运行封装属性
运行自身属性
在Spy窗口中有一个radio单选框,左边一个是运行自身属性,在qtp脚本编辑器可以用Object来进行访问,右边一个是运行封装属性,这边的属性其实就是GetROProperty获取的属性值,这些用法其实在GetROProperty与SetROProperty中都已经所介绍。在qtp 11中还添加了一个功能:使用Spy抓取完对象之后可以直接添加到对象库中,而这在11版本之前是无法进行的。这样做的原因我想主要是用于处理一些复杂对象层时spy天生的抓取高亮优势,而在对象库中添加对象是没有高亮提示的,因此很多时候对象库抓取对象没有spy抓取对象的精度高。
在编写脚本的过程中spy的作用其实是很明显的,它可以让你在维护变更对象时找出问题的源头,可以让你在做验证点时直接复制获取到验证实际结果,而不需手工输入导致错误的发生,可以让你查看对象的详细层次,可以让你查看对象的自身接口属性等等,总之Spy在自动化测试过程中几乎是不会闲着。是我们时时刻刻的好帮手。


对象库模式
对象库是在自动化测试过程中非常重要的一个环节,但是对象库在使用其实也分为两种模式:
本地模式
共享模式
本地模式其实就是qtp默认的单个Action模式,它的优势就是可直接更新对象,并且当改变对象名之后当前脚本可以自动更新对象名,缺点也很明显测试脚本一多容易出现很多重复对象,而且维护比较麻烦,团队开发时容易出现混乱。
使用方法:打开一个脚本并输入快捷键Ctrl+R打开对象库,此时的对象库就是本地action
共享模式是一种可以共享给所有脚本的的模式,它的优势也是很明显适合团队开发,在大量测试脚本中不容易出现重复对象,维护对象属性比较容易,缺点是修改对象名(这里的对象名指的是qtp封装的对象名称,而非对象的name属性)后不能对所有使用其修改对象的脚本进行自动更新。
使用方法:打开一个脚本后,进入菜单栏Rescouces –> Associate Repositories, 点击“+”添加Tsr对象库文件(可由对象库中进行导出),并选择相应的Actions点击ok即可。此时打开对象库后可以看到库已经被成功加载到对象库中,但共享对象显示的时灰色的,意味着我们无法直接对其进行修改。这也是为了保证共享对象的不被乱改掉,而导致其他调用它的脚本无法直接进行执行。


对象库的管理者
对象库管理者在qtp中名为ObjectRepository Manager
入口: Rescources –> ObjectRepository Manager
常用作用:
方便的维护共享对象库
导出导入Tsr对象格式文件
导出导入XML对象格式文件
合并对象库
对象库管理者是我个人比较喜爱的功能之一,很多功能都是在对象库中无法实现的,并且当它与共享对象库结合使用时能达到非常不错的效果:
举个例子:
当一个脚本加载了一个1.tsr作为共享对象库,此时使用对象库管理者就比普通的对象库由优势,因为对象库管理者是可以和qtp脚本编辑器同时进行编辑的,而对象库就不可以和qtp脚本同时进行编辑,当打开对象库后,如果需要编辑脚本区,就必须先关闭对象库才行。


共享函数库加载
之前的内容中已经介绍了qtp共享对象库,那既然共享对象库就共享函数库。
共享函数库是qtp提供的一共用于共享脚本代码的方式,它一共有两种加载方式:
静态加载 (Resources)
动态加载 (ExecuteFile)
函数库静态加载步骤:
进入 Setting –> Resources (tab)
点击”+“,择函数库文件
点击ok
函数库动态加载步骤:
ExecuteFile “<filePath>”
例如: ExecuteFile “d:1.vbs”
注意:此处可以加载Txt、vbs、qfl等格式的函数库文件


如何手工编写QTP脚本
如果你还经常停留在录制的过程,那么相信这篇文章一定会给你带来启发。
首先录制是一种非常高效的方式,快速简单易学,但是在很多情况下,脚本是无法录制下来,并且如果你是需要真正把自动化做起来的话,那还有很长一段路要走,而要进入这段路的一扇大门就是要首先学会如何进行手工编写脚本。
手工编写qtp脚本的流程:
添加对象库
写入测试对象
写入测试行为
写入测试数据
写入测试对象或者公共函数的种方式:
最古老的方式- F7 步骤生成器
最专业的方式-自动完成(Completed Word)
最快速的方式-直接从available keywords视图中拖拽出来
分别介绍下种方式:
F7步骤生成器-这个是在9.5版本之前用的最多,因为那时还没有available keywords视图不能直接进行拖拽。
方法:在专家视图中,点击f7,弹出Step Generator,在category中选择test objects,然后选择你需要的对象和operations,点击insert即可自动生成脚本。
自动完成-这块比较适合纯手工编写脚本的测试工程师。
方法:利用Ctrl + Space 也就是Ctrl +空格的组合键,但是需要把输入法进行屏蔽
available keywords-此方式是在9 .5版本中才开始加入的,比较实用,非常的快捷
方法:只需要在此视图中找到相应的对象并拖入编辑器即可。


正确使用描述性编程
描述性编程其实和对象库一样是用于识别对象的一种方式。它并不像它的名字一样其实它压根和编程就没有任何关系。
所谓描述性编程就是利用脚本来把测试封装对象的属性描述下来,而非利用简易的对象库。
描述性编程的两种写法:
字符串直接描述法
Browser(“micClass:=Browser”).Page(“micClass:=Page”).WebEdit(“name:=wd”).Set “iquicktest”
 
对象封装描述法
ystemutil.Run “C:Program FilesInternet ExplorerIEXPLORE.EXE”,”http://www.baidu.com”
set oBrowser=Description.Create
Set oPage=Description.Create
Set oEdit=Description.Create
oBrowser(“micClass”).value = “Browser”
oPage(“micClass”).value=”Page”
oEdit(“name”).value=”wd”
Browser(oBrowser).Page(oPage).WebEdit(oEdit).Set “iquicktest”
 
误区:
许多刚接触自动化测试的新手们,会一直认为描述性编程好,高深,比对象库高级,其实这是一种极为错误的想法,前面我也已经讲过了,描述性编程只是一种识别对象的一种方式,它并不是一种编程,它只是一种早期的自动化测试脚本原型,它有着天生的致命弱点,就是对象没有真正的与脚本分离,维护起来非常的麻烦,因此mercury在开发qtp时为了解决这个问题而特地开发出对象库这个功能,这样做的目的也是为了能够让脚本与对象分离,使的维护测试对象更加的方便。当然为什么qtp还把描述性编程留着,使因为在某些特殊情况下还是需要描述性编程的,例如在处理一些动态对象或者处理webTable对象等,但这也是一些少数的情况并非在所有情况下都去使用描述性编程,希望沉迷于描述性编程的测试新手们在看到这篇文章时能够快速把思维转变回来,也不要去误导别人。


如何利用好QTP环境变量
在qtp自动化测试过程中,经常会需要一些预先的配置信息文件来用于不同的测试环境下。环境变量也就这样应运而生了。在qtp中存在着两种类型的环境变量:
内置环境变量
自定义内部环境变量
自定义外部环境变量
内置环境变量
介绍:它是qtp内部已经事先封装好.
方式:直接进入到Settings –> Environment中选择built-in选项即可查询到所有的内置环境变量。并且这些环境变量的值都是qtp已经封装好的。
举例: Msgbox Environment.Value(“TestName”)
结果:直接可以获取到当前测试脚本名称。
自定义内部环境变量
介绍:它是qtp中的一种可以在qtp内部进行自定义的环境变量
方式:直接进入到Settings –> Environment中选择User-defined选项,点击旁边的”+”,即可定义name 和 value
举例:Msgbox Environment.Value(“自定义名称”)
结果:直接可以获取到当前自定义环境变量的值
自定义外部环境变量
介绍:直接从xml格式文件中进行读取环境变量
方式:进入Settings –> Environment中选中Load variables and values from external file并给出xml的文件路径
举例:xml文件
<Environment>
<Variable>
<Name>Url</Name>
<Value>http://www.iquicktest.com</Value>
</Variable>
</Environment>
Msgbox Environment.Value(“Url”)
结果:直接打印结果为http://www.iquicktest.com
注意:环境变量中的属性名是大小写敏感的,必须要注意。


验证点-自动化的关键
验证点或者检查点在qtp自动化测试中非常常用的,可以说如果一个自动化测试中没有验证点,那这个自动化测试其实没有任何意义的,因为既然时自动执行的脚本,那么我们就只能通过最终的验证结果来查看测试脚本是否执行成功,每项实际结果都达成了预期的结果。因此验证点可以说时自动化测试过程中的关键。
那么在qtp中验证点有哪几种方式呢:
checkpoint
checkproperty
其中第一种方式是qtp默认的一种检查点方式,可以对进行很多方式的验证,主要是用于验证对象。这块比较简单只需要在qtp中直接添加验证点即可,这里主要来介绍checkproperty这个方法,CheckProperty的应用范围比checkpoint广很多,并且很多地方可以替代checkpoint,笔者在这里推荐大家使用checkpoint。
如果我需要验证一个文本框的值为:iquicktest.com , 那么只需要使用如下脚本直接对其属性进行验证。
Browser("Browser").Page("Page"). _
WebEdit("WebEdit").CheckProperty "value","iquicktest.com"


QTP测试结果
qtp提供了一个在脚本执行完毕后的运行结果,称为Test Results , 这个测试结果的主体文件是通过一个xml文件来储存的
其中主要包含种图标:
大叉代表fail
感叹号代表Warning
打勾说明success
当在qtp中执行验证点函数或者使用checkproperty函数时,qtp会在验证完毕之后自动将结果写入到测试结果中。如果验证成功即打一个绿色的钩子,如果失败即会把预期结果与实际结果进行比对。
自定义测试结果报告写入
介绍: 使用Reporter对象
4种状态:micPass , micFail , micWarning , micDone
举例:
textValue = Browser("Browser").GetROProperty("title")
If textValue = "iQuickTest Studios" then
Reporter.ReportEvent micPass,"correct"
else
Reporter.ReportEvent micFail,"wrong"
End If


什么是同步点
当一个应用在执行了一个步骤之后需要一定时间的响应,而此时脚本并没有准备而是直接执行下一行脚本,那么此时qtp可能会抛出错误。
而同步点的作用就是插入一段等待时间后再执行下一步操作。
在qtp中一共有三种同步点的方式:
Sync
Wait
WaitProperty
 
Sync用法 :
Browser("Browser").Sync
Wait用法 :
Wait 3
WaitProperty用法:
Browser("Browser").Page("Page"). _
WebEdit("..").WaitProperty "value","iQuickTest"
这里笔者还是比较推荐第种方式,因为第一种方式虽然不错,但是有时会抛出错误,第二种方式太死板,需要写入具体的等待时间才可,而第三种则是自动化测试中应用最多的一种等待某个属性变更为某个值时执行下一步操作。


如何判定对象识别成功
测试对象对于自动化测试来说是非常重要的,那么我们如何来判定抓取下来的测试封装对象一定已经识别成功了呢。
这里笔者提供给大家两种方式:
对象库手工高亮
利用脚本动态高亮
对象库手工高亮这个比较容易,只需要在对象库中中需要判定的对象,然后点击对象高亮的那个按钮即可。
脚本动态高亮对于一些无法使用对象库直接进行高亮的情况下比较实用。例如google suggestion类似的下拉框,一旦切换页面,对象就会消失,因此需要在运行时高亮才能判定对象是否真正识别成功。具体的实现方式是利用qtp的隐藏方法:highlight
Browser("Browser").Page("Page"). _
WebEdit("wd").highlight
 
当然以上脚本的最终呈现方式是与对象库中手工高亮的方式是一样的。此方法还有一个优势,就是在使用描述性编程时比较优势。


什么是虚拟对象
当被测程序出现了一些对象本身无法被qtp识别的情况,此时可以使用虚拟对象来进行识别,虽然笔者一直不推荐使用虚拟对象,一方面它是与坐标绑定不稳定,另一方面移植起来比较麻烦,需要另外拷贝一些文件在qtp安装目录才可。但是说管说,在这里还是需要给大家介绍一下,让大家有这样一个概念。
何时使用虚拟对象?
对象无法识别为正确的类
如何使用虚拟对象?
进入菜单tools --》visual object manager 进入之后点击下一步选择对象的类型后,点击mark objects按钮即可开始选取虚拟对象的范围框。说白了虚拟对象就是一个人工设置的区域;选取完成之后把虚拟对象名填写完即可创建完毕。在录制时脚本即会自动生成虚拟对象文件。
注意:
在移植带虚拟对象的脚本时,需要把<QuickTest 安装目录>datVoTemplate下的所有文件拷贝到另一台机器上,此处的虚拟对象并不是与脚本直接绑定的。


什么是QTP保留对象
所谓qtp保留对象就是qtp本身为我们预留的一些可用对象。通俗些讲就是当打开qtp时它就已经把这些对象给实例化了,一直到我们关闭qtp后,这些保留对象的实例才会终止。


那么保留对象具体在qtp中呈现在哪里呢
当打开qtp后,点击F7,弹出了步骤生成器窗口,在分类中可以选择保留对象类型之后就可以看到所有可见的保留对象,每个保留对象都是一个com组件,都可自行创建,其中很多的保留对象在做实例项目的时候都是非常实用,并且其中还包括了一些隐藏保留对象,具体的这些保留对象的使用方法会在后期进行详细介绍。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值