QTP中使用描述性编程

我们简单介绍一下有关功能测试的基本方法,这实际上对于所有自动化功能测试产品来说都是一样的。一般情况下,用QTP来进行功能测试的基本方法主要包括三个主要阶段:
 
1、创建测试或组建
首先可以通过在应用程序或网站上录制会话,或者建立对象库并使用关键字驱动功能向关键字视图中手动添加步骤来创建测试或组件。在QTP里面我们可以通过两种方式添加步骤来创建测试或组件:
在应用程序或网站上录制会话。
建立对象库并使用这些对象在关键字视图或专家视图中手动添加步骤
然后在在测试或组件中插入检查点,检查页面、对象或文本字符串中的特定值或特征,通过它可以标识网站或应用程序是否正常运行。或是通过用参数替换固定值扩展测试或组件的范围。提供数据表中的数据,定义环境变量和值,定义测试、组件或操作参数和值,或者使用QTP生成随机数字或当前用户和测试数据等。
最后如果需要的话使用QTP中众多的功能测试功能来增强测试或组件或添加编写语句来实现更复杂的测试目标。
2、运行测试和组建
控制运行会话,帮助标识和消除测试或组件中的缺陷。使用“单步执行”、“单步跳过”和“单步退出”命令逐步运行测试或组件,或设置断点使测试或组件在预定点暂停。每当测试或组件在断点处停止时,可以在“调试查看器”中查看其变量的值。
3、分析结果
在运行测试或组件之后,通过两种方式可以查看其结果:在“结果”窗口中查看结果;自动报告在运行会话过程中检测到的缺陷,可能的话并上报到其他缺陷管理产品中。
.试图与对象模型
在介绍QTP中的Descriptive Programming前,我们有必要先介绍一下ExpertView及在ExpertView里进行编码的一些基本知识。
在QTP里面提供了两种视图,第一种我们把它称为KeywordView(关键字视图,在早期的版本中称为TreeView),第二种把它成为ExpertView(专家视图),这两种视图分别是针对两种类型的人进行使用的。
1、KeywordView(关键字视图)
通过关键字视图,QTP提供了一种模块化的表格格式创建和查看测试或组件的步骤。每个步骤在关键字视图中都是一行,这样用户可以轻松的修改任何一部分组成。
在录制会话过程中,用户在应用程序上执行的每个步骤在关键字视图中记录为一行。例如,在51testing的页面上执行的下列三个步骤:
在“用户名”编辑框中输入zhoda02。
在“密码”编辑框中输入加密字符串41c630a213508cd49eb35089db1b893144b9。
单击“登录”按钮。
那么,关键字视图将包含下列行:


 
很显然,关键字视图非常直观有效,使用的人可以很清晰的看到被录制对象的录制层次及运行步骤,比较适合那些对于业务操作流程熟悉的人员使用。但是,如果需要一些增强型的操作,那就需要切换到专家视图里进行了。
2.ExpertView(专家视图)
QTP在关键字视图中的每个节点在专家视图中对应一行脚本。上面例子对应的脚本如下:(删除后一句是因为前后重复,一句可以说明问题)
Browser("51Testing软件测试网:软件测试的专业网站").Page("51Testing软件测试网:软件测试的专业网站").WebEdit("username").Set "zhoda02"
Browser("51Testing软件测试网:软件测试的专业网站").Page("51Testing软件测试网:软件测试的专业网站").WebEdit("password").SetSecure "41c630a213508cd49eb35089db1b893144b9"
Browser("51Testing软件测试网:软件测试的专业网站").Page("51Testing软件测试网:软件测试的专业网站").WebButton("登录").Click
对于QTP来说,其核心编码语言是Visual Basic Script,因此,如果用户熟悉VBScript,可以运用自如的添加和更新语句,并通过编程方式增强测试和脚本,而这一切必须在专家视图中完成。
更为重要的是,有些操作是必须在专家视图中才可以完成的,例如:要处理动态对象、客户化报告、获取对象运行时的属性值(Run-time Value)等等,这些都必须通过专家视图中的VBScript编码完成。
然而,QTP里所有的操作都是基于对象进行的,所以我们必须对对象模型有一个基本了解,才可以在专家视图内进行Descriptive Programming。
3、测试对象模型
测试对象模型是一大组对象类型或类,QTP用这些对象类型或类来表示应用程序中的对象。每个测试对象类都有一个可以唯一标识属于该类的对象的属性列表,以及一组QTP可以对其进行录制的方法。它包括测试对象(Test Object)和运行时对象(RunTime Object)。
测试对象是QTP在测试或组件中创建的用于表示应用程序中的实际对象的对象。QTP存储有关该对象的信息,这些信息有助于它在运行会话期间标识和检查该对象。
运行时对象是网站或应用程序中的实际对象,在运行会话期间执行针对该对象的方法。
如果录制时执行应用程序的相应操作,则一般情况下QTP将完成以下操作:
标识QTP测试对象类(表示执行了操作的对象),并创建相应的测试对象
读取应用程序中对象属性的当前值,然后将属性和属性值列表与测试对象一起存储。
选择该对象的唯一名称,一般使用该对象某个重要属性的值。
使用适当的QPT 测试对象方法录制对对象执行的操作。
例如,假定使用以下HTML 源代码单击“查找”按钮:
<INPUT TYPE="submit" NAME="Find" VALUE="Find">
QTPl将单击的对象标识为WebButton 测试对象。它将创建一个名为Find 的WebButton 对象,然后为该Find WebButton 对象录制下列属性和属性值,同时还会录制对WebButtion的Click方法。


 
在关键字视图及专家视图中显示内容分别为:


 
Browser("Mercury Interactive").Page("Mercury Interactive").WebButton("Find").Click
运行测试或组件时,QTP通过其测试对象类及其描述(一组用于唯一标识该对象的测试对象属性和属性值)来标识应用程序中的每个对象。测试对象及其属性和属性值的列表存储在对象库中。例如在上例中,QTP将在运行会话期间在对象库中搜索WebButton 对象,通过名称Find 来查找其描述。QTP根据找到的描述,在应用程序中查找WebButton 对象,该对象带有HTML 标记INPUT、类型为submit、值为Find。找到对象后,它将对其执行Click 方法。
在这样一组对象模型的基础上,QTP为各类应用对象都提供了一组方法和属性,例如Web Objects,Windows Objects,SAPGUI Objects,ActiveX,Java等。下面是一些Web Objects的方法和示例:
对象
方法

Browser
Check

Frame
Click

Image
Exist

Link
GetCellData

Page
GetProperty

WebArea
GetROProperty

WebButtion
Mouseover

WebCheckBox
RowCount

WebEdit
Select

WebList
Set

WebRadioGroup
SetProperty

WebTable
Submit
例1:获取单元格中的值
thisText = Browser(…).Page(…).Frame.(…).WebTable("sample").GetCellData(2,1)
例2:获取图片的名称
ObjectName = Browser(…).Page(…).Image("Find").GetProperty("Name")
例3:检查某个对象是否存在,如果存在弹出对话框说明对象存在。
If Browser("Browser").Page("Page").Applet("login.html").JavaEdit("username").Exist Then
MsgBox("The object exists.")
End if
.描述性编程(descriptive programming)
1、descriptive programming概述
通常情况下,当在录制一个操作时,QTP会将被操作对象加入到对象库里(Object Repository)。一旦对象存在于对象库里,我们就可以在专家视图里通过添加相关的对象方法来对该对象进行操作。我们可以通过引用层次型对象库里的对象描述(Object Description)来添加相应的方法。
因为QTP对象库中的每个对象都具有唯一名称,所以在引用时对象名是必须需要指定的。然后在测试运行期间,QTP在对象库中根据这个对象的名称和父对象来查找对象,并使用为这个测试对象存储的测试对象描述,在网站或应用程序中标识该对象。
例如我们用QTP录制Yahoo Mail登录情况时我们需要输入用户名,于是在录制时我们就会录下一个WebEdit对象,它的缺省逻辑名为“login”,该编辑字段位于名为“Yahoo! Mail - The best” 的页面上,并且该页面在浏览器中使用名称Yahoo!进行录制。如图所示,即为录制时的对象库的内容:


 
那么如果我们想要应用该对象,就可以在专家视图输入以下信息:
Browser("Yahoo!").Page("Yahoo! Mail - The best").WebEdit("login").Set “xxx”
或者我们也可以调用一些方法,获取改对象在运行时的对象名,如:
Browser("Yahoo!").Page("Yahoo! Mail - The best").WebEdit("login").GetROProperty(“name”)
然而,我们可以发觉到,上面的例子在处理对象时,对象已经存在于对象库里,因此我们可以应用这个对象的逻辑名。实际使用中,情况往往并非如此简单,我们经常会遇到很多在页面上动态产生的对象,换而言之,对象库里没有这些对象,我们也无从引用。因此我们必须采用其他的技术来完成这类操作,这也就是我们需要讲解的Descriptive Programming。
为了满足上面提到的动态对象的处理问题,QTP允许用户通过将对象属性编码到测试脚本里来动态识别对象,这就是我们通常意义下称为的Descriptive Programming。通过这种方式,我们可以指示QTP不通过引用对象库和对象名来对实际对象进行操作。具体操作中,我们只需要为QTP提供对象的一组属性和值,这样QTP就可以来识别相应的对象并对其进行操作。这相当于,告诉QTP要识别对象的一些关键特征,根据这些特征QTP就可以一一匹配然后识别出来这个对象。
而且,更为重要的是,通过这种Descriptive Programming的方式,还可以让QTP识别具有某些相同属性的对象。我们先来举个例子来看一下:我们假设当前的Windows系统中打开了若干的Yahoo主页面(多于一个),现在我们要关闭所有的正在浏览Yahoo主页面的浏览器。
对于上面那个例子来说,我们先看一个简单一点的情况,假设只有且仅有一个Yahoo主页面:那么我们可以用下面的方法来
Window("Text:=Yahoo! - Microsoft Internet Explorer").Close
我们可以看到语句里我们要查找的对象是Window窗口标题为“Yahoo! - Microsoft Internet Explorer”,然后把它关闭,具体的语法说明我们稍后为解释。但是上面的语句仅仅适合前面提到的条件“只有且仅有一个Yahoo主页面”,如果有多个同样的窗口就会出错,原因是通过语句可以匹配到多个对象,而QTP不知道应该对哪个对象进行关闭动作。我们需要进一步的缩小匹配范围:
Dim i
i = 0
while (Window("Text:="Yahoo!" - Microsoft Internet Explorer", "index:="&i).exist)
Window("Text:=Yahoo! - Microsoft Internet Explorer", "index:="&i).close
i = i +1
wend
这里我们可以看到,对于具有相同属性的对象,我们可以通过index参数来对其进行区别,第一个对象为index=0,第二个为index=1等等,依次类推。当然我们还可以通过CreationTime和Location参数来定位对象,这里就不详细叙述了。
通过上面的例子,我们对Descriptive Programming有一个基本了解了,下面我们详细讲解一下Descriptive Programming:在具体实现中,我们有两种类型的Descriptive Programming方法。可以列出直接在测试语句中描述对象的属性和值的集合;或者向Description 对象中添加属性和值的集合,然后在语句中输入Description 对象的名称。下面我们分别举例介绍。
2、直接在语句中输入编程描述
通过多个指定描述对象的property:=value对,可以直接在语句中描述对象,这是最直接有效的方法。
常规语法为:
TestObject("PropertyName1:=PropertyValue1", "..." , "PropertyNameX:="PropertyValueX""}
TestObject - 测试对象的类。
PropertyName:=PropertyValue - 测试对象的属性及其值。各个property:="value" 对之间应用逗号和引号分开。
例如:以下语句指定Mercury Tours 页面中名为author且索引值为3 的WebEdit 测试对象。当测试运行时,QTP 将查找具有匹配属性值的WebEdit 对象,并输入文本jojo。
Browser("Mercury Tours").Page("Mercury Tours").WebEdit("Name:="Author"", "Index:="3"").Set "Mark Twain"
我们也可以从从描述中的特定位置(从Page 对象描述开始)开始使用Descriptive Programming。
Browser("Mercury Tours").Page("Title:="Mercury" Tours").WebEdit("Name:="Author"", "Index:="3"").Set "jojo"
此外,如果我们希望在在一个测试或组件中多次使用相同的Descriptive Programming,则可以将创建的对象赋值给变量,这样使用会方便很多。
例如:我们需要完成下面一系列操作
Window("Text:=HyperSna").WinButton("Caption:=日期").Click
Window("Text:=HyperSna").WinButton("Caption:=时间").Click
Window("Text:=HyperSna").WinButton("Caption:=确定").Click
那么,为了方便其见,我们可以将Window("Text:=HyperSna")赋值到一个变量,然后再使用,参见下面的代码:
Set WinHyper = Window("Text:="HyperSna"")
WinHyper.WinButton("Caption:=日期").Click
WinHyper.WinButton("Caption:=时间").Click
WinHyper.WinButton("Caption:=确定").Click
如果使用了VBScript里面的With语句,还可以简化为以下代码:
With Window("Text:="HyperSna"")
.WinButton("Caption:=日期").Click
.WinButton("Caption:=时间").Click
.WinButton("Caption:=确定").Click
End With
下面我们来看一个更为详细的例子,在QTP产品缺省安装里面自带了一个网上订机票的示例称为Mercury Tour,我们看一下在订票过程中何时需要用Descriptive Programming。
首先登入系统后,如果需要订票,就要先搜索航班,此时系统要求输入订票乘客的数量,假设我们在第一次录制脚本时选择了1个Passenger,并成功完成订票。然后,我们需要参数化乘客数量来测试订票系统,我们会发现回放会失败。原因在于,不同的乘客的数量导致在订票时需要输入每个乘客的姓名,而录制时,只输入了一个乘客的姓名。而乘客姓名的输入框是随着乘客数量的变化而动态生成的,我们不可能从对象库里得到没有录制的对象,因此必须使用Descriptive Programming。


 
在录制单个乘客时,我们得到的录制语句是:
Browser("Welcome: Mercury Tours").Page("Book a Flight: Mercury").WebEdit("passFirst0").Set "Michael"
Browser("Welcome: Mercury Tours").Page("Book a Flight: Mercury").WebEdit("passLast0").Set "Wang"
显然WebEdit("passFirst0")和WebEdit("passLast0")是录制时产生的对象并存放到对象库里的。通过对象库,我们可以看到对象的属性如下


 
系统对于发生多个FirstName时,命名规则是passFirst0,passFirst1…依次类推。因此只要通过简单的Descriptive Programming就可以完成动态FirstName与LastName的识别工作。这里我们假设参数化的乘客数已经赋值给intPassNum,下面是脚本中的关键语句:
counter = 0
For i = 0 to (intPassNum)
Browser("Find a Flight:").Page("Book a Flight:").WebEdit("name:="passFirst""&i).Set "Michael"
Browser("Find a Flight:").Page("Book a Flight:").WebEdit("name:="passLast""&i).Set "Wang"
counter = counter + 1
Next
3、使用description对象
使用Description 对象可以返回包含一组Property 对象的Properties 集合对象。Property 对象由属性名和值组成。然后,可以在语句中指定用返回的Properties 集合代替对象名。(每个property 对象都包含一个属性名和值)。
要创建Properties 集合,可以使用以下语法输入Description.Create 语句:
Set MyDescription = Description.Create()
创建Properties 对象(例如,以上示例中的MyDescription)后,就可以输入语句,以便在运行会话期间在Properties 对象中添加、编辑、删除或检索属性和值。这样,就可以在运行会话期间,使用动态方法确定哪个属性以及多少个属性应包含在对象描述中。
在Properties 集合中填充一组Property 对象(属性和值)后,可以在测试语句中指定用Properties 对象代替对象名。
例如,假设我们需要完成以下一个操作:
Window("Error").WinButton("text:=OK", "index:="1"").Click
我们可以通过Description对象来实现同样的功能,参加下面的代码:
Set MyDescription = Description.Create()
MyDescription("text").Value = "OK"
MyDescription("index").Value = 1
Window("Error").WinButton(MyDescription).Click
Set MyDescription = Nothing
【小结】以上是对QTP中有关处理动态对象中的Descriptive Programming的简单介绍,希望对大家能够有所帮助,就总体而言,如果能够熟练掌握Descriptive Programming,那么有很多实际中的问题就可以迎刃而解。当然Descriptive Programming只是QTP中的一个功能,QTP在实际功能测试中还有很多强大的功能,作为QTP学习的一个系列有机会我会一一介绍。

转载于:https://www.cnblogs.com/beagles/archive/2007/12/06/985370.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/380235.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

字符数组的查找法

package asdasqq; import java.util.*; public class suoying { public static void main(String[] args) { Scanner wsqnew Scanner(System.in); System.out.print(“请输入对应的星期范围在一~日&#xff1a;”); int week wsq.nextInt(); System.out.print(getWeek(…

结构和其他数据形式

0x01 结构声明 结构声明&#xff08;structure declaration&#xff09;描述了一个结构的组织布局。 struct book{char title[MAXTITL];char author[MAXAUTL];float value; };该声明描述了一个由两个字符数组和一个float类型变量组成的结构。该声明并未创建实际的数据对象&am…

Java StringBuffer char charAt(int index)方法与示例

StringBuffer类char charAt(int index) (StringBuffer Class char charAt(int index)) This method is available in package java.lang.StringBuffer.charAt(int index). 软件包java.lang.StringBuffer.charAt(int index)中提供了此方法。 This method is used to return the …

Form验证

代码写 N 久了&#xff0c;总想写得别的。这不&#xff0c;上头说在整合两个项目&#xff0c;做成单一登录&#xff08;Single Sign On&#xff09;&#xff0c;也有人称之为“单点登录”。查阅相关文档后&#xff0c;终于实现了&#xff0c;现在把它拿出来与大家一起分享。或许…

添加LinkServer的两句代码

sp_addlinkedserver linkserver,,SQLOLEDB,linkserver.comsp_addlinkedsrvlogin linkserver,false,null,sa,asdf第一句是添加一个名字为linkserver的链接服务器 地址是linkserver.com第二句是针对第一句添加的Linkserver添加一个访问帐号两句不能同时执行 要第一句执行成功后执…

数组的基本查找

package asdasqq; import java.util.*; public class jibenchazhao { public static void main(String[] args) { int [] arr{11,22,33,44,55,66,77}; Scanner wsqnew Scanner(System.in); int qwsq.nextInt();//输入q&#xff0c;即为查找的数&#xff1b; int index g…

Cobaltstrike4.0系列教程(一)----简介与安装

0x01-Cobaltstrike简介 Cobalt Strike是一款美国Red Team开发的渗透测试神器&#xff0c;常被业界人称为CS。这款神器许多大佬们都已经玩的很6&#xff0c;我一个菜鸡玩的略有心得&#xff0c;因此写一下自己的Cobaltstrike系列文章&#xff0c;希望给各位一点帮助。 最近这个…

c ++类成员函数_仅使用C ++创建具有公共数据成员的类

c 类成员函数Let’s understand 让我们来了解 What is data member? 什么是数据成员&#xff1f; Any variable declared inside the class in known as data member of the class. 在类内部声明的任何变量&#xff0c;称为类的“数据成员”。 What is public data member…

转:php.ini中文版

[PHP] ; PHP还是一个不断发展的工具&#xff0c;其功能还在不断地删减 ; 而php.ini的设置更改可以反映出相当的变化&#xff0c; ; 在使用新的PHP版本前&#xff0c;研究一下php.ini会有好处的 ;;;;;;;;;;;;;;;;;;; ; 关于这个文件 ; ;;;;;;;;;;;;;;;;;;; ; 这个文件控制了PHP许…

qt 试用 (3)配置编译源代码及调试

qt 试用 &#xff08;3&#xff09;配置编译源代码及调试qt creater是一个集成ide&#xff0c;像vc一样容易使用&#xff0c;所以首先下载带qt creater的qt sdk Offline installer - 1.4 GB http://qt.nokia.com/downloads/sdk-windows-cpp-offline这里的lib没有pdb和源代码…

两数的最大公约数算法基础及优化

最大公约数算法师从辗转相除法&#xff08;欧几里得算法&#xff09;时间复杂度更相减损术&#xff08;《九章算术》&#xff09;时间复杂度二分化更相减损术思路优化时间复杂度师从 本篇是观Vita君算法视频后总结&#xff0c;他是bilibili一位小up主&#xff1a;小学生Vita君…

cobaltstrick4.0系列教程(2)---用户接口

0x01 概述 Cobalt Strike 用户接口分为两部分。接口的顶部是会话或目标的视觉化展示。接口的底部展示了每个你与之交互的 Cobalt Strike 功能或会话的标签页。你可以点击这两部分之间的区域、按你的喜好重新调整这两个区域的大小。 0x02 工具条 Cobalt Strike 顶部的工具条…

java类名与文件名_为什么Java文件名必须与公共类名相同?

java类名与文件名The question is that "Can we keep different names for java class name and java file name?" 问题是“我们可以为Java类名和Java文件名保留不同的名称吗&#xff1f;” Yes, we can keep the different name for the java filename and java c…

玩什么都别玩暧昧

暧昧 这个介于朋友与情人间的关系 能给予寂寞的人些须安慰与短暂的幸福感 暧昧 没有任何承诺 彼此都不向对方许下诺言 没有甜言蜜语 没有海誓山盟 却在彼此悲伤难过的时候 给予彼此依靠 也许 这种关系是最好的 因为它不虚假 它没有骗人的谎言 因为彼此没有承诺 两个人 可以一起…

快速幂模

快速幂模简述师从普通思路缺陷一&#xff1a;溢出缺陷二&#xff1a;运算次数多二分化快速幂模简述 计算 ana^nanmod p 师从 本篇是观Vita君算法视频后总结&#xff0c;他是bilibili一位小up主&#xff1a;小学生Vita君 正所谓“生乎吾后&#xff0c;其闻道也亦先乎吾&#…

《那些年啊,那些事——一个程序员的奋斗史》——31

“我们再重新找房吧&#xff1f;”伍定轩对段伏枥说道。“为什么&#xff1f;”段伏枥突然觉得奇怪&#xff0c;为何伍定轩会突然提出这个问题。“你看我的仙人掌。”伍定轩指了指摆在电脑旁边的一盆仙人掌。当初伍定轩决定买这小盆仙人掌的时候&#xff0c;也是从网上听人说&a…

数煤球

煤球数目 有一堆煤球&#xff0c;堆成三角棱锥形。具体&#xff1a; 第一层放1个&#xff0c; 第二层3个&#xff08;排列成三角形&#xff09;&#xff0c; 第三层6个&#xff08;排列成三角形&#xff09;&#xff0c; 第四层10个&#xff08;排列成三角形&#xff09;&…

cobalt strick 4.0系列教程(3)---数据管理

0x01 概述 Cobalt Strike 的团队服务器是行动期间 Cobalt Strike 收集的所有信息的中间商。Cobalt Strike 解析来自它的 Beacon payload 的输出&#xff0c;提取出目标、服务和凭据。 如果你想导出 Cobalt Strike 的数据&#xff0c;通过 Reporting → Export Data 。Cobalt S…

JavaScript中的交互式网页/事件处理

Programming languages like C, C etc are all based on synchronous coding approach i.e. the execution takes place from top to bottom in a linear manner. 诸如C&#xff0c;C 等编程语言均基于同步编码方法&#xff0c;即执行以线性方式从上到下进行。 But JavaScript…

2008来了,搬个凳子先

此帖为证. 转载于:https://www.cnblogs.com/margiex/archive/2008/01/01/1022098.html