QTP中的descriptive programming

上一篇 / 下一篇  2007-06-18 16:12:57 / 个人分类:QTP

文章出处:www.51testing.com 作者:周坚 发布时间:2005-10-19

Q-duyzjH0【摘要】自动化功能测试是一种企业级的用于检验应用程序是否如期运行的功能性测试工具。通过自动捕获,检测,和重复用户交互的操作,能够辨认缺陷并且确保那些跨越多个应用程序和数据库的业务流程在初次发布就能避免出现故障,并且保持长期可靠运行。在市场上用的比较多的主要包括Mercury公司的WinRunner,QuickTest Professional和IBM的RationalRobot。笔者对于QuickTest Professional相对较为熟悉,希望有机会向大家逐步介绍QuickTest Professional中的一些要点及技巧。在本文里主要介绍了QuickTest Professional中的一项核心内容Descrīptive Programming,希望对大家有所借鉴和帮助。在文中,为了方便起见,将QuickTest Professional简称QTP。(本文是基于Quick Test Professional V8.0而写)。51Testing软件测试网ml5s0yvd I

}9D/Z3M8\B^Z7I8T0【关键词】51Testing软件测试网$p7vFz/q|

%xUmJ%i y0描述性编程Descrīptive Programming

B.{ K nu S0

r? @,|/T%Vq W0功能测试Functional Test51Testing软件测试网2c1r/S-ON z!XT

rV,K ?.f:~.S1IH[0专家视图Expert View51Testing软件测试网 RM0lt\cX'K

/r)Y/en#tlxd0关键字视图Keyword View51Testing软件测试网*N'HQr+y_

51Testing软件测试网x |0Pm"d7^

对象模型Object Model

S+S#?'Ha9q0

X9R'Y0V8pE0BF0运行时对象Run-Time Object51Testing软件测试网.P'HU%lW)F~E

51Testing软件测试网!}%m d1J{R7P*`O^}

测试对象Test Object51Testing软件测试网 Cu6kG0nv"Kx

51Testing软件测试网#n Bv*?"A7gIx

【正文】

`fgzE&F051Testing软件测试网6~BWB;{5M

.QTP功能测试基本方法51Testing软件测试网*AN{L-gC%x0W

%S3u:`8V(e-q{L0我们简单介绍一下有关功能测试的基本方法,这实际上对于所有自动化功能测试产品来说都是一样的。一般情况下,用QTP来进行功能测试的基本方法主要包括三个主要阶段:51Testing软件测试网gQ2Q K2M,P8S!N)Xe

  
51Testing软件测试网lBNI/^ ~

1、创建测试或组建

9Yu3r$nw9Di051Testing软件测试网? q)j-PE\|7yF

首先可以通过在应用程序或网站上录制会话,或者建立对象库并使用关键字驱动功能向关键字视图中手动添加步骤来创建测试或组件。在QTP里面我们可以通过两种方式添加步骤来创建测试或组件:51Testing软件测试网 j"u/b BC

  • 在应用程序或网站上录制会话。
  • 建立对象库并使用这些对象在关键字视图或专家视图中手动添加步骤
51Testing软件测试网3M Ar"u Bp;n.}0pk2_

然后在在测试或组件中插入检查点,检查页面、对象或文本字符串中的特定值或特征,通过它可以标识网站或应用程序是否正常运行。或是通过用参数替换固定值扩展测试或组件的范围。提供数据表中的数据,定义环境变量和值,定义测试、组件或操作参数和值,或者使用QTP生成随机数字或当前用户和测试数据等。51Testing软件测试网x h)k0VS"y7[k

51Testing软件测试网PVT4Q;F6B` f*n.]

最后如果需要的话使用QTP中众多的功能测试功能来增强测试或组件或添加编写语句来实现更复杂的测试目标。51Testing软件测试网'z,XW&KV!t

51Testing软件测试网#Y ]7{&KpQ6pa#I

2、运行测试和组建51Testing软件测试网+Ye(\?{!Su

51Testing软件测试网}"L"w5x%rf`HY+qm

控制运行会话,帮助标识和消除测试或组件中的缺陷。使用“单步执行”、“单步跳过”和“单步退出”命令逐步运行测试或组件,或设置断点使测试或组件在预定点暂停。每当测试或组件在断点处停止时,可以在“调试查看器”中查看其变量的值。

(xC`~:W!L0

{ ]6z]'bb03、分析结果

Uc-M3a6w6?'p Y9U051Testing软件测试网xN aS O

在运行测试或组件之后,通过两种方式可以查看其结果:在“结果”窗口中查看结果;自动报告在运行会话过程中检测到的缺陷,可能的话并上报到其他缺陷管理产品中。

p7G8?)TkM!Bf4R0

q[BiqV5U0.试图与对象模型51Testing软件测试网5GJ+Yg+J2s

51Testing软件测试网B)eOf&r

在介绍QTP中的Descrīptive Programming前,我们有必要先介绍一下ExpertView及在ExpertView里进行编码的一些基本知识。

T9q_L7AY`051Testing软件测试网8BB8w/D!}i U F6x

在QTP里面提供了两种视图,第一种我们把它称为KeywordView(关键字视图,在早期的版本中称为TreeView),第二种把它成为ExpertView(专家视图),这两种视图分别是针对两种类型的人进行使用的。51Testing软件测试网:S6^$C!{6` C1W

k7If1iF?)O01、KeywordView(关键字视图)

#Wbe:Yb0

*T9K-}KTu0通过关键字视图,QTP提供了一种模块化的表格格式创建和查看测试或组件的步骤。每个步骤在关键字视图中都是一行,这样用户可以轻松的修改任何一部分组成。51Testing软件测试网(X"f!M}1Kz

51Testing软件测试网r9H1W:U mL

在录制会话过程中,用户在应用程序上执行的每个步骤在关键字视图中记录为一行。例如,在51testing的页面上执行的下列三个步骤:51Testing软件测试网 P+G^C!z+B3bp

  • 在“用户名”编辑框中输入 zhoda02。
  • 在“密码”编辑框中输入加密字符串 41c630a213508cd49eb35089db1b893144b9。
  • 单击“登录”按钮。

q*e2x&X7MG-J!` s0那么,关键字视图将包含下列行:51Testing软件测试网k1C-J}I:{U/IYM%R

  

'lC{#E#^x ~1g0很显然,关键字视图非常直观有效,使用的人可以很清晰的看到被录制对象的录制层次及运行步骤,比较适合那些对于业务操作流程熟悉的人员使用。但是,如果需要一些增强型的操作,那就需要切换到专家视图里进行了。

CbQ2JA051Testing软件测试网IBlXk }

2.ExpertView(专家视图)

D)]0G-l9Z,gv_L051Testing软件测试网t(e(H/YUrtE

QTP在关键字视图中的每个节点在专家视图中对应一行脚本。上面例子对应的脚本如下:(删除后一句是因为前后重复,一句可以说明问题)

\#}5nsI0

N ss:oMsa3u M#J0Browser("51Testing软件测试网:软件测试的专业网站").Page("51Testing软件测试网:软件测试的专业网站").WebEdit("username").Set "zhoda02"

3V_8Rng'x2_$Q!Z051Testing软件测试网*C*vDw.F;R d6w!E

Browser("51Testing软件测试网:软件测试的专业网站").Page("51Testing软件测试网:软件测试的专业网站").WebEdit("password").SetSecure "41c630a213508cd49eb35089db1b893144b9"51Testing软件测试网r-L W#d%P}5D'w

k,|!CP q0Browser("51Testing软件测试网:软件测试的专业网站").Page("51Testing软件测试网:软件测试的专业网站").WebButton("登录").Click

ny|d _0

VG~1`+o|.j@x0对于QTP来说,其核心编码语言是Visual Basic scrīpt,因此,如果用户熟悉VBscrīpt,可以运用自如的添加和更新语句,并通过编程方式增强测试和脚本,而这一切必须在专家视图中完成。51Testing软件测试网c_b]3Z

51Testing软件测试网/OzMQZVAi

更为重要的是,有些操作是必须在专家视图中才可以完成的,例如:要处理动态对象、客户化报告、获取对象运行时的属性值(Run-time Value)等等,这些都必须通过专家视图中的VBscrīpt编码完成。

^7c&d!aN8UN0

Z{4}LxE0然而,QTP里所有的操作都是基于对象进行的,所以我们必须对对象模型有一个基本了解,才可以在专家视图内进行Descrīptive Programming。

@(cv"c)d-U:M051Testing软件测试网h El\7~/`9Pf

3、测试对象模型51Testing软件测试网 g0i`;I EBF

51Testing软件测试网'X0m]#Z6tWl+K&o4j

测试对象模型是一大组对象类型或类,QTP用这些对象类型或类来表示应用程序中的对象。每个测试对象类都有一个可以唯一标识属于该类的对象的属性列表,以及一组 QTP可以对其进行录制的方法。它包括测试对象(Test Object)和运行时对象(RunTime Object)。

aF r r%M0

6ptGZY#@g8i0测试对象是QTP在测试或组件中创建的用于表示应用程序中的实际对象的对象。QTP存储有关该对象的信息,这些信息有助于它在运行会话期间标识和检查该对象。

2MZQ^OiDdE0

/rA/rj In%^X0运行时对象是网站或应用程序中的实际对象,在运行会话期间执行针对该对象的方法。

%g"dg-s1}2Fg1] AQ0

h+B%t Y6hK$u{0如果录制时执行应用程序的相应操作,则一般情况下QTP将完成以下操作:51Testing软件测试网 bcC L5IQ;hQ

  • 标识 QTP测试对象类(表示执行了操作的对象),并创建相应的测试对象
  • 读取应用程序中对象属性的当前值,然后将属性和属性值列表与测试对象一起存储。
  • 选择该对象的唯一名称,一般使用该对象某个重要属性的值。
  • 使用适当的 QPT 测试对象方法录制对对象执行的操作。
51Testing软件测试网 WT^:I$j1XN)NG

例如,假定使用以下 HTML 源代码单击“查找”按钮:

2q { i r I051Testing软件测试网Y_$z hX$A5_$J

<INPUT TYPE="submit" NAME="Find" VALUE="Find">

|B%h(xQ[0

*K8o3G;[v&H w.d~dQQ0QTPl将单击的对象标识为 WebButton 测试对象。它将创建一个名为 Find 的 WebButton 对象,然后为该 Find WebButton 对象录制下列属性和属性值,同时还会录制对WebButtion的Click方法。51Testing软件测试网9|1g qSV [/x8E

  

:[U\ ug/V8Y0在关键字视图及专家视图中显示内容分别为:51Testing软件测试网$n;T-h6vM

  

Og_9y"B9O:[&S*v0Browser("Mercury Interactive").Page("Mercury Interactive").WebButton("Find").Click51Testing软件测试网G/uv;k:t/E

p0g3M&PGNqP0运行测试或组件时,QTP通过其测试对象类及其描述(一组用于唯一标识该对象的测试对象属性和属性值)来标识应用程序中的每个对象。测试对象及其属性和属性值的列表存储在对象库中。例如在上例中,QTP将在运行会话期间在对象库中搜索 WebButton 对象,通过名称 Find 来查找其描述。QTP根据找到的描述,在应用程序中查找 WebButton 对象,该对象带有 HTML 标记 INPUT、类型为 submit、值为 Find。找到对象后,它将对其执行 Click 方法。

#K}+h$d;pub,D0

q,G(k9u,t7\ v0在这样一组对象模型的基础上,QTP为各类应用对象都提供了一组方法和属性,例如Web Objects,Windows Objects,SAPGUI Objects,ActiveX,Java等。下面是一些Web Objects的方法和示例:51Testing软件测试网%zH4\\H4c6W)y

对象方法
Browser51Testing软件测试网BxSO*J'p$D v2T&\

Check

a*U0s@:Rk x}f0

l+V{*_"cwN)_Y0Frame

6G/i \3J:gfz_A0

p.eK5b }+TuS[0Click

*{GQF*MpH0
51Testing软件测试网5v*j H _ ~"pu

Image

zlM1B+Jp\0
51Testing软件测试网H%P'B cRI%w6w:N"h

Exist51Testing软件测试网 SrE ?WB9qy.[

51Testing软件测试网2R f+mcA1F/kZ

Link

n L N9h:k0
51Testing软件测试网5h\ lCg9c s-x

GetCellData51Testing软件测试网,d1@!M8?(I

`:C'Wgbo1~1w0Page51Testing软件测试网k.f6hG^ [3nL;{

51Testing软件测试网Lm?!G-a/H.s

GetProperty

`1~e7o ^'b0P0
51Testing软件测试网$c:Tgbr&d

WebArea51Testing软件测试网&GR0C.fb#vR

51Testing软件测试网e6E8c)fc A4xt

GetROProperty

c8j L A{|0
51Testing软件测试网3vp3an HBb&w2q

WebButtion

6K'N$t}L*rFX0
51Testing软件测试网1O/`^Qg R'O~QU!}'Q

Mouseover

NR;ku3si0x0

%q1N6H%T,o*`6o*rc;h ^0WebCheckBox

:N(R`PR0
51Testing软件测试网_|{%G3A^+H(S)i2q

RowCount51Testing软件测试网a v7]zUF!_!W;U

7m^^%l*g.@I H0WebEdit51Testing软件测试网X8`4@;~+u1L;F~

1N8u_7l,_z2u0Select

l}O@],j[r0
51Testing软件测试网rQg [$WR3Q~

WebList

y9X&F6@-i(ToF0
51Testing软件测试网 PEa4@,}_*c

Set

"zj-_(H@ lbf"y{0
51Testing软件测试网-z ko+`?#XM9i

WebRadioGroup

-Al&N7C#v$zB\0
51Testing软件测试网Rgl3SI8e'Qx O I

SetProperty51Testing软件测试网 ^xr `L$n~

WebTableSubmit

V!gm'T W7e0例1:获取单元格中的值51Testing软件测试网"wWM \0uM!gj/So

51Testing软件测试网6`u~ j"wiW\

thisText = Browser(…).Page(…).Frame.(…).WebTable("sample").GetCellData(2,1)51Testing软件测试网)]4i]'ix6a,B

7Y nvjCFP](s"An0例2:获取图片的名称51Testing软件测试网&N~O.y8P h

R4yvdhs)B8Y0ObjectName = Browser(…).Page(…).Image("Find").GetProperty("Name")

*E'?.A$CGdi%d!m0

'QzV)EQ"O4{0例3:检查某个对象是否存在,如果存在弹出对话框说明对象存在。

uIy | ]4FSB*Y!u t051Testing软件测试网5lw~+@8G1n)A

If Browser("Browser").Page("Page").Applet("login.html").JavaEdit("username").Exist Then51Testing软件测试网"A$ZhYt/V2@2j#Sz

yb"cu ~q/Ne:U Ca0MsgBox("The object exists.")

Tv5GUtK.G051Testing软件测试网v M U9bO

End if

jQ8T(fgn0

+oL\"jK!u2et'X0.描述性编程(descrīptive programming)51Testing软件测试网|6|Cn/ae

+P XFG{j01、descrīptive programming概述

#]O4If6c3aoT`Ejh0

#Ao0Sx7\r.MD0通常情况下,当在录制一个操作时,QTP会将被操作对象加入到对象库里(Object Repository)。一旦对象存在于对象库里,我们就可以在专家视图里通过添加相关的对象方法来对该对象进行操作。我们可以通过引用层次型对象库里的对象描述(Object Descrīption)来添加相应的方法。51Testing软件测试网9HFTD0Gpy*j

51Testing软件测试网U,WPF'} {3dk

因为QTP对象库中的每个对象都具有唯一名称,所以在引用时对象名是必须需要指定的。然后在测试运行期间,QTP在对象库中根据这个对象的名称和父对象来查找对象,并使用为这个测试对象存储的测试对象描述,在网站或应用程序中标识该对象。

3i2BybN0

3C{A0z2K z,|0例如我们用QTP录制Yahoo Mail登录情况时我们需要输入用户名,于是在录制时我们就会录下一个WebEdit对象,它的缺省逻辑名为“login”,该编辑字段位于名为 “Yahoo! Mail - The best” 的页面上,并且该页面在浏览器中使用名称 Yahoo!进行录制。如图所示,即为录制时的对象库的内容:

}1|:a6T t0
  

k'O ysl0那么如果我们想要应用该对象,就可以在专家视图输入以下信息:51Testing软件测试网IS u] E

51Testing软件测试网7IId]H*po?

Browser("Yahoo!").Page("Yahoo! Mail - The best").WebEdit("login").Set “xxx”51Testing软件测试网 T Uqm9{:tG

51Testing软件测试网{{4e6N[ I!C0y b

或者我们也可以调用一些方法,获取改对象在运行时的对象名,如:

Vc5XXX/S"r051Testing软件测试网o9X dd V1g7P%T

Browser("Yahoo!").Page("Yahoo! Mail - The best").WebEdit("login").GetROProperty(“name”)

A.v%h/y?GA051Testing软件测试网C0W ~~[+_

然而,我们可以发觉到,上面的例子在处理对象时,对象已经存在于对象库里,因此我们可以应用这个对象的逻辑名。实际使用中,情况往往并非如此简单,我们经常会遇到很多在页面上动态产生的对象,换而言之,对象库里没有这些对象,我们也无从引用。因此我们必须采用其他的技术来完成这类操作,这也就是我们需要讲解的Descrīptive Programming。

"o)XW,z ?A:d051Testing软件测试网B9qi[-Y

为了满足上面提到的动态对象的处理问题,QTP允许用户通过将对象属性编码到测试脚本里来动态识别对象,这就是我们通常意义下称为的Descrīptive Programming。通过这种方式,我们可以指示QTP不通过引用对象库和对象名来对实际对象进行操作。具体操作中,我们只需要为QTP提供对象的一组属性和值,这样QTP就可以来识别相应的对象并对其进行操作。这相当于,告诉QTP要识别对象的一些关键特征,根据这些特征QTP就可以一一匹配然后识别出来这个对象。51Testing软件测试网WU/w%CH&G

51Testing软件测试网 e5? sKHR*b

而且,更为重要的是,通过这种Descrīptive Programming的方式,还可以让QTP识别具有某些相同属性的对象。我们先来举个例子来看一下:我们假设当前的Windows系统中打开了若干的Yahoo主页面(多于一个),现在我们要关闭所有的正在浏览Yahoo主页面的浏览器。

"X&CPx R"^gK0

7c)JU,? ^#b+d ^D-|0对于上面那个例子来说,我们先看一个简单一点的情况,假设只有且仅有一个Yahoo主页面:那么我们可以用下面的方法来51Testing软件测试网%O*Lh2|4Kvz

;Fo;ZoTj7Oek0Window("Text:=Yahoo! - Microsoft Internet Explorer").Close

9S)xbU].b0

8cy1d(|.B0我们可以看到语句里我们要查找的对象是Window窗口标题为“Yahoo! - Microsoft Internet Explorer”,然后把它关闭,具体的语法说明我们稍后为解释。但是上面的语句仅仅适合前面提到的条件“只有且仅有一个Yahoo主页面”,如果有多个同样的窗口就会出错,原因是通过语句可以匹配到多个对象,而QTP不知道应该对哪个对象进行关闭动作。我们需要进一步的缩小匹配范围:

]8p!CDU LBJ V051Testing软件测试网6@#Y-Wn'I

Dim i

n:ig-tQf*w0

#we!|upp7x `0i = 0

)p-\v ~o_2x3KR T0

v{ g` w {J2}0while (Window("Text:=Yahoo! - Microsoft Internet Explorer", "index:="&i).exist)

'qa/ZJ~ s051Testing软件测试网NUENq*V%E.lf

Window("Text:=Yahoo! - Microsoft Internet Explorer", "index:="&i).close

E)u2q cv7Q:U051Testing软件测试网8p3L8mZ}l1T

i = i +151Testing软件测试网"I2]6ag~!v

51Testing软件测试网Lw+b7^~&moZ'\

wend

F V%[.Vc\E(b0

8[,[t$A0JBL0这里我们可以看到,对于具有相同属性的对象,我们可以通过index参数来对其进行区别,第一个对象为index=0,第二个为index=1等等,依次类推。当然我们还可以通过CreationTime和Location参数来定位对象,这里就不详细叙述了。

Z{_?!j9Pp(i0

tQJxQ0通过上面的例子,我们对Descrīptive Programming有一个基本了解了,下面我们详细讲解一下Descrīptive Programming:在具体实现中,我们有两种类型的Descrīptive Programming方法。可以列出直接在测试语句中描述对象的属性和值的集合;或者向 Descrīption 对象中添加属性和值的集合,然后在语句中输入 Descrīption 对象的名称。下面我们分别举例介绍。51Testing软件测试网 [C\}Io&d$ET

51Testing软件测试网l2c5EE(t&t(USp

2、直接在语句中输入编程描述

Qfz^\~051Testing软件测试网1su1| P9FH,F

通过多个指定描述对象的property:=value对,可以直接在语句中描述对象,这是最直接有效的方法。51Testing软件测试网,` Hl4oQqA5x

51Testing软件测试网W6I&Ir N B

常规语法为:

m b Shy.eS%a0

k0th-iu dV.gP0TestObject("PropertyName1:=PropertyValue1", "..." , "PropertyNameX:=PropertyValueX"}

'K%~}YU3b b Lx0

u)C`I/Lz:g.b0TestObject - 测试对象的类。51Testing软件测试网st^Q})kq9F*}

h/M'Gx ^S0PropertyName:=PropertyValue - 测试对象的属性及其值。各个property:=value对之间应用逗号和引号分开。51Testing软件测试网da+ku*H*mv[

&K%I-tj%bfq/B ]_0例如:以下语句指定 Mercury Tours 页面中名为author且索引值为 3 的 WebEdit 测试对象。当测试运行时,QTP 将查找具有匹配属性值的 WebEdit 对象,并输入文本jojo。51Testing软件测试网 uG0p IF[b/B%AA|r#[

51Testing软件测试网3H_N#Ff&J9J[)b

Browser("Mercury Tours").Page("Mercury Tours").WebEdit("Name:=Author", "Index:=3").Set "Mark Twain"

j.} K:g8u8^ai7V051Testing软件测试网"u9brME D5e$i;rMl

我们也可以从从描述中的特定位置(从 Page 对象描述开始)开始使用Descrīptive Programming。

Iz}+}$I&?p4n051Testing软件测试网~)uH+v\-P tE4A1WX

Browser("Mercury Tours").Page("Title:=Mercury Tours").WebEdit("Name:=Author", "Index:=3").Set "jojo"

;bo(@+h"NK0Q@051Testing软件测试网^9i3s |,[5B%\

此外,如果我们希望在在一个测试或组件中多次使用相同的Descrīptive Programming,则可以将创建的对象赋值给变量,这样使用会方便很多。

,?.}1UA%Dsc \$e\m0

]m.^(G6IA!lN0例如:我们需要完成下面一系列操作51Testing软件测试网(JjQi,a/E O

(HD8_ p+Vn0Window("Text:=HyperSna").WinButton("Caption:=日期").Click

LP~q0nb l051Testing软件测试网$z(Z0m ~6TN

Window("Text:=HyperSna").WinButton("Caption:=时间").Click

6];@| H4S g5Ja9W051Testing软件测试网z-@ ~'H0{~3od

Window("Text:=HyperSna").WinButton("Caption:=确定").Click

b H1g@%} o#YnJ}TE051Testing软件测试网._!`;l*f-t1[7U!C(~

那么,为了方便其见,我们可以将Window("Text:=HyperSna")赋值到一个变量,然后再使用,参见下面的代码:

-x[1q6Y8p6C~X$W0

*rT ME8vm9Z+}0Set WinHyper = Window("Text:=HyperSna")51Testing软件测试网5AL MN0XZlh

51Testing软件测试网G*|Pt1A

WinHyper.WinButton("Caption:=日期").Click51Testing软件测试网m&f {Z0En7]_{M6N

51Testing软件测试网*_#w9TI-dmB3] d)\8o

WinHyper.WinButton("Caption:=时间").Click51Testing软件测试网.d kOU.P })P

51Testing软件测试网){N8x[Wu

WinHyper.WinButton("Caption:=确定").Click

K2{#dRph8x4Yx0W051Testing软件测试网r6k!N"dxwh9_7O

如果使用了VBscrīpt里面的With语句,还可以简化为以下代码:51Testing软件测试网P#Xu!e5`/T}

51Testing软件测试网I9cC#OMV

With Window("Text:=HyperSna")

I S.A [{1I*R|g051Testing软件测试网,`L^5n)g^

.WinButton("Caption:=日期").Click

$d#| `Mk |$Hr051Testing软件测试网/j iKi*V8Vl NS_;~

.WinButton("Caption:=时间").Click

5ks QI*t!}0

P6k-X1y)lq8]dO0.WinButton("Caption:=确定").Click

(Im0}U L,K;\L6g'H0

R/E+N0LUcW0End With51Testing软件测试网#lQV4K5r1RWo

51Testing软件测试网w~9bg\ t

下面我们来看一个更为详细的例子,在QTP产品缺省安装里面自带了一个网上订机票的示例称为Mercury Tour,我们看一下在订票过程中何时需要用Descrīptive Programming。

$Mjj5K:S5|)O'|)B$f0

!R X.|S+F'@/H{!~R0首先登入系统后,如果需要订票,就要先搜索航班,此时系统要求输入订票乘客的数量,假设我们在第一次录制脚本时选择了1个Passenger,并成功完成订票。然后,我们需要参数化乘客数量来测试订票系统,我们会发现回放会失败。原因在于,不同的乘客的数量导致在订票时需要输入每个乘客的姓名,而录制时,只输入了一个乘客的姓名。而乘客姓名的输入框是随着乘客数量的变化而动态生成的,我们不可能从对象库里得到没有录制的对象,因此必须使用Descrīptive Programming。

gJ/p?4u4JO-w7sa0
  
51Testing软件测试网 F*P,|`j7D!Ur

在录制单个乘客时,我们得到的录制语句是:

y2U%K)d!?!Ci0

Bi7mU:j.nH0Browser("Welcome: Mercury Tours").Page("Book a Flight: Mercury").WebEdit("passFirst0").Set "Michael"

)sp J&w{D(b!x051Testing软件测试网B^e+_1W f7vN:q4H

Browser("Welcome: Mercury Tours").Page("Book a Flight: Mercury").WebEdit("passLast0").Set "Wang"51Testing软件测试网%C ]yP {

51Testing软件测试网Y {_#B4P

显然WebEdit("passFirst0")和WebEdit("passLast0")是录制时产生的对象并存放到对象库里的。通过对象库,我们可以看到对象的属性如下51Testing软件测试网,M }:U2f q%V.s

  

`ZeCc@0系统对于发生多个FirstName时,命名规则是passFirst0,passFirst1…依次类推。因此只要通过简单的Descrīptive Programming就可以完成动态FirstName与LastName的识别工作。这里我们假设参数化的乘客数已经赋值给intPassNum,下面是脚本中的关键语句:51Testing软件测试网6n ?4pb Kq(kQ*E

51Testing软件测试网,?;^R#?#HW

counter = 051Testing软件测试网4S%\*@&v y2ul}bJ

@3^1g9Mghs N0For i = 0 to (intPassNum)

O-L7QJj)P{Fp0

t*w(hf:[;H*hD0Browser("Find a Flight:").Page("Book a Flight:").WebEdit("name:=passFirst"&i).Set "Michael"

\ SV MM:RVc0

Browser("Find a Flight:").Page("Book a Flight:").WebEdit("name:=passLast"&i).Set "Wang"

.b6ki:b5tQpb0

;A*X8UJ*|7~{0counter = counter + 1

_rp5q@J051Testing软件测试网eo4_t]

Next51Testing软件测试网1e+y7L"qC q

Wl%Vpe6n#Dlj03、使用descrīption对象51Testing软件测试网3s{B.Z\9H(J

] XB5C"Ui5b)Y|2B \A0使用 Descrīption 对象可以返回包含一组 Property 对象的 Properties 集合对象。Property 对象由属性名和值组成。然后,可以在语句中指定用返回的 Properties 集合代替对象名。(每个 property 对象都包含一个属性名和值)。

mf/m!V&Z:W"m051Testing软件测试网.s:P I#|F']

要创建 Properties 集合,可以使用以下语法输入 Descrīption.Create 语句:

Q|VE+I kr E051Testing软件测试网a*?n.vJ,s

SetMyDescrīption= Descrīption.Create()51Testing软件测试网,c&[(H"oR%AB

#F+k,g H ? dow0创建 Properties 对象(例如,以上示例中的MyDescrīption)后,就可以输入语句,以便在运行会话期间在 Properties 对象中添加、编辑、删除或检索属性和值。这样,就可以在运行会话期间,使用动态方法确定哪个属性以及多少个属性应包含在对象描述中。51Testing软件测试网gH:`7b Xqwd

51Testing软件测试网;yW r$f-|4W

在 Properties 集合中填充一组 Property 对象(属性和值)后,可以在测试语句中指定用 Properties 对象代替对象名。51Testing软件测试网%z/j(r ax(t:m(o

Z~@QZ,w?0例如,假设我们需要完成以下一个操作:51Testing软件测试网WOZ5?%n%Lh(D

51Testing软件测试网-RfkdG;AA"{ }y

Window("Error").WinButton("text:=OK", "index:=1").Click51Testing软件测试网dW:B h4fN+?

51Testing软件测试网;w^&z(t,C^

我们可以通过Descrīption对象来实现同样的功能,参加下面的代码:

5e.NI:SF$E/Yt051Testing软件测试网C,h#oH8x#CE3nj6w

Set MyDescrīption = Descrīption.Create()51Testing软件测试网 g@@-Q~*W\

51Testing软件测试网\r5` | ZQu#q?#t

MyDescrīption("text").Value = "OK"51Testing软件测试网,JpsWP9vt;@

51Testing软件测试网var"m m.b{4O&o;x

MyDescrīption("index").Value = 1

l,O~Qj!s0

w7V |4Q#J!l Y9}0Window("Error").WinButton(MyDescrīption).Click51Testing软件测试网'}C b5]3k` RG&D

51Testing软件测试网*U b-\{e:Sc

Set MyDescrīption = Nothing

l1|(L%cXz {9k:jc0

}1_ ]:v V F$i.K0【小结】以上是对QTP中有关处理动态对象中的Descrīptive Programming的简单介绍,希望对大家能够有所帮助,就总体而言,如果能够熟练掌握Descrīptive Programming,那么有很多实际中的问题就可以迎刃而解。当然Descrīptive Programming只是QTP中的一个功能,QTP在实际功能测试中还有很多强大的功能,作为QTP学习的一个系列有机会我会一一介绍。51Testing软件测试网6M#wG!P+n(^G Q


TAG: QTP

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

我的栏目

日历

« 2021-01-25  
     12
3456789
10111213141516
17181920212223
24252627282930
31      

我的存档

数据统计

  • 访问量: 5681
  • 日志数: 16
  • 建立时间: 2007-06-12
  • 更新时间: 2007-06-21

RSS订阅

Open Toolbar