QTP中的descriptive programming

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

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

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

6Nr/of e|7M0【关键词】

T#M({2rLR c0

$C-C4SW6o3[f0描述性编程Descrīptive Programming51Testing软件测试网$S{&o7DE i`

#t|WRp@0功能测试Functional Test

n q-e9KW%@dw&DG0

4lb;k`z0专家视图Expert View51Testing软件测试网-tU${6Gy;W,_

51Testing软件测试网MnVE8^%_

关键字视图Keyword View

7t!wL2_]&Xg%a051Testing软件测试网|?3O_Or+V K

对象模型Object Model

"DKRz qV l7~,D K?0

5R%^yV2Ss4z1v0运行时对象Run-Time Object

o"p'~W zd1n0

;B$iNi4d9Z x*I0测试对象Test Object

+x%awj+Z1sPr/A'? P0

U;f}$l D})w d0【正文】

$w^hP\*N051Testing软件测试网$b2h2w^-JB

.QTP功能测试基本方法51Testing软件测试网u%C!~{?4@jw(y3} s)P

)E%}L%v-P1x0我们简单介绍一下有关功能测试的基本方法,这实际上对于所有自动化功能测试产品来说都是一样的。一般情况下,用QTP来进行功能测试的基本方法主要包括三个主要阶段:

,]@ OG4W1pM0
  
51Testing软件测试网-XZ.n&_&\B

1、创建测试或组建

7y |Z-IK4Q4R#H&N051Testing软件测试网j!p9EP/A|W7}

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

!To.m6` n!ja0
  • 在应用程序或网站上录制会话。
  • 建立对象库并使用这些对象在关键字视图或专家视图中手动添加步骤

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

51Testing软件测试网L7T:l\ tvyB+s&X

最后如果需要的话使用QTP中众多的功能测试功能来增强测试或组件或添加编写语句来实现更复杂的测试目标。

Y!|z O1cv0

j])FlR FWU*L02、运行测试和组建

~!B3e.\Q5r8Z0

/dn'oP(qI0控制运行会话,帮助标识和消除测试或组件中的缺陷。使用“单步执行”、“单步跳过”和“单步退出”命令逐步运行测试或组件,或设置断点使测试或组件在预定点暂停。每当测试或组件在断点处停止时,可以在“调试查看器”中查看其变量的值。51Testing软件测试网&l I!W m0l Rw~

3nC2K8Cx Uc03、分析结果

JS U}W+_*o)XBi Vv051Testing软件测试网8O G+C&SGj/@Q#[

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

)X PK4zkz~0.试图与对象模型51Testing软件测试网%Ob I6dVk

51Testing软件测试网v5`;QEa

在介绍QTP中的Descrīptive Programming前,我们有必要先介绍一下ExpertView及在ExpertView里进行编码的一些基本知识。51Testing软件测试网)Ba$~.?/h;_

51Testing软件测试网/[#N"zC_5`

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

51Testing软件测试网iu(]n,o K8{-Yq cO

1、KeywordView(关键字视图)51Testing软件测试网&c W UD0Dz.U%nGvkt{

51Testing软件测试网-jP I7A)|

通过关键字视图,QTP提供了一种模块化的表格格式创建和查看测试或组件的步骤。每个步骤在关键字视图中都是一行,这样用户可以轻松的修改任何一部分组成。

QC3Dr*Vf"J S0

7Y*vZ@ vx)xl&h0在录制会话过程中,用户在应用程序上执行的每个步骤在关键字视图中记录为一行。例如,在51testing的页面上执行的下列三个步骤:51Testing软件测试网"?K H(D0b,Lh

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

8IK y,C*S'U8[0那么,关键字视图将包含下列行:

$u+dGv-L qC)^0
  
51Testing软件测试网2B4Mg,~Or.jj!}-m

很显然,关键字视图非常直观有效,使用的人可以很清晰的看到被录制对象的录制层次及运行步骤,比较适合那些对于业务操作流程熟悉的人员使用。但是,如果需要一些增强型的操作,那就需要切换到专家视图里进行了。51Testing软件测试网&h#o!|#d@UK

Gc#f+P(S02.ExpertView(专家视图)

Hpi1@'e ^`.r051Testing软件测试网3pI9n7PT-|FP

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

51Testing软件测试网\5^d4@a7} Q

Browser("51Testing软件测试网:软件测试的专业网站").Page("51Testing软件测试网:软件测试的专业网站").WebEdit("username").Set "zhoda02"

4j4VIdK2j0

!r(@q!E^0Browser("51Testing软件测试网:软件测试的专业网站").Page("51Testing软件测试网:软件测试的专业网站").WebEdit("password").SetSecure "41c630a213508cd49eb35089db1b893144b9"

!\*zQUj@0

k]Z|7OHvrmZ0Browser("51Testing软件测试网:软件测试的专业网站").Page("51Testing软件测试网:软件测试的专业网站").WebButton("登录").Click

2A%D+f'?#~xx051Testing软件测试网Mt-z0B Snc

对于QTP来说,其核心编码语言是Visual Basic scrīpt,因此,如果用户熟悉VBscrīpt,可以运用自如的添加和更新语句,并通过编程方式增强测试和脚本,而这一切必须在专家视图中完成。

z-uwb0`051Testing软件测试网"^zS9[ y#_L

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

mqZ\A4eh"r:w0z0然而,QTP里所有的操作都是基于对象进行的,所以我们必须对对象模型有一个基本了解,才可以在专家视图内进行Descrīptive Programming。51Testing软件测试网]8U@"W[z

51Testing软件测试网$YT'E]!f A @

3、测试对象模型

[(dAwwCZi.p0

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

.C5q?7x|5O/x7o H0

FE,j$A4^ R1h S$w4f9K0测试对象是QTP在测试或组件中创建的用于表示应用程序中的实际对象的对象。QTP存储有关该对象的信息,这些信息有助于它在运行会话期间标识和检查该对象。

w h:r me*e\ [051Testing软件测试网,q;Tx&["K m0yN

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

~+b{hm M1o^(h051Testing软件测试网V? E5wwJT

如果录制时执行应用程序的相应操作,则一般情况下QTP将完成以下操作:

7r^{*vb3x]y0
  • 标识 QTP测试对象类(表示执行了操作的对象),并创建相应的测试对象
  • 读取应用程序中对象属性的当前值,然后将属性和属性值列表与测试对象一起存储。
  • 选择该对象的唯一名称,一般使用该对象某个重要属性的值。
  • 使用适当的 QPT 测试对象方法录制对对象执行的操作。
51Testing软件测试网f6J{*y3]9j;p

例如,假定使用以下 HTML 源代码单击“查找”按钮:51Testing软件测试网!H.F(H*{/[f.K}%sU F4Q

Z crT%r0<INPUT TYPE="submit" NAME="Find" VALUE="Find">51Testing软件测试网D,qK!h0h:@,}

C7O@W`*~0QTPl将单击的对象标识为 WebButton 测试对象。它将创建一个名为 Find 的 WebButton 对象,然后为该 Find WebButton 对象录制下列属性和属性值,同时还会录制对WebButtion的Click方法。51Testing软件测试网9yv,kPOB

  
51Testing软件测试网1EFpK7jD/o-K Y+E

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

T$C#DO;@tT;X0
  

)t#O n%hp8Gd w7R(dV-H Z0Browser("Mercury Interactive").Page("Mercury Interactive").WebButton("Find").Click

!}E2~'i8Z1g2o0

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

51Testing软件测试网 Drc2sUIy8^U

在这样一组对象模型的基础上,QTP为各类应用对象都提供了一组方法和属性,例如Web Objects,Windows Objects,SAPGUI Objects,ActiveX,Java等。下面是一些Web Objects的方法和示例:

8F)z'kh B K%E*^(~d!y0
对象方法
Browser51Testing软件测试网!Q!L$V5N/^6S2W

Check51Testing软件测试网CBR,O8H#UmJC

51Testing软件测试网3C ?9\)OWg [](a

Frame

"F9f b9EO)~cC0

tbB"Am;mCzs9i0Click

5T ].M,[_xG[J0

1mS*h-XJK9e3~h$m0Image

~ TWz?:zz|0

5]7xx-fy0Exist

'`-MzN3B0I u#d V0

8w"oj*l{$o2X OH y:o0Link

o5J9O)F+kW&I7ro0

:w#HI1vLK _0GetCellData

OWx%k `0

Y dw*Kv)`6F#]0Page51Testing软件测试网-y l!_ I N@#xI.~_

9[D/KqS{n0GetProperty

bmt~"k'r8ALZE0
51Testing软件测试网X'~hMT;l]YN

WebArea

R/P3u[ Yw0

MWz*h1X0GetROProperty

%`G*M)ia0
51Testing软件测试网/N(NiYVd4jJ3n].[

WebButtion

NHXU$_J#s0
51Testing软件测试网1P4u3]&`7h0IsZ

Mouseover51Testing软件测试网zDQ;^S~&OhW8I

A:tv ^R3X0WebCheckBox51Testing软件测试网-fzyQC9u@

+hOc"@Eg8\0RowCount51Testing软件测试网pY/RHh V

51Testing软件测试网}*Fl6L^]Z`

WebEdit51Testing软件测试网pR#lf]I

.O+b U8r/`7i+X0Select

6r#s ]+? V Jj c0

]Q th2R0WebList51Testing软件测试网j8| q9G kx k

~;H;F@q$Gb~0Set

x'[t)}U ]/n WQ0

g INze&`#?v)h0WebRadioGroup

_,S&RQ7{)i[_2iQ+kQ0

[{w-I3mb#i3H0SetProperty

?2vT)Sym e)oD @f0
WebTableSubmit
51Testing软件测试网w l4Rr+} Z:B

例1:获取单元格中的值

:BO.c GWOC0

(RP!^%@ [*X+wa&B~.O0thisText = Browser(…).Page(…).Frame.(…).WebTable("sample").GetCellData(2,1)51Testing软件测试网rXh P\2}8\4A)J

-mEQ2K.R| \0例2:获取图片的名称

;Q;ecw4rr7n\(ys0

&}3O(tRsF/Ws;j*|H0ObjectName = Browser(…).Page(…).Image("Find").GetProperty("Name")

'w'en2q6i3l0

~F(s-jT1Xk0例3:检查某个对象是否存在,如果存在弹出对话框说明对象存在。

2X.h,ibY l];] U(a0

]Y+F8Orjg?0If Browser("Browser").Page("Page").Applet("login.html").JavaEdit("username").Exist Then

uRjD4c'^051Testing软件测试网+h'h!}f },d s

MsgBox("The object exists.")51Testing软件测试网/N"vl9Yg

51Testing软件测试网3n|&l d7J-h0DX`.qxe

End if

N7^ ]t8Z;n'V)L0

yf3Gh ?'K,V0.描述性编程(descrīptive programming)51Testing软件测试网(Y8qvqe

51Testing软件测试网b&BTY;~o4Lf G

1、descrīptive programming概述51Testing软件测试网df@e G9X [Q

51Testing软件测试网@FOOCy1kvE,?5ef

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

51Testing软件测试网o?|bjl(q

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

$|qo-sq_0例如我们用QTP录制Yahoo Mail登录情况时我们需要输入用户名,于是在录制时我们就会录下一个WebEdit对象,它的缺省逻辑名为“login”,该编辑字段位于名为 “Yahoo! Mail - The best” 的页面上,并且该页面在浏览器中使用名称 Yahoo!进行录制。如图所示,即为录制时的对象库的内容:51Testing软件测试网^ x.s^)j-_pm

  

/|!a4G3l;`3U0那么如果我们想要应用该对象,就可以在专家视图输入以下信息:51Testing软件测试网0kb1`'y8|0~^Dy.G

51Testing软件测试网#A0s{gc*]TB

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

O|W'kH} \%j8v ]0

Q2i,yN*IOGjc0或者我们也可以调用一些方法,获取改对象在运行时的对象名,如:51Testing软件测试网A5IS3o @s Lc

51Testing软件测试网.d&b{+d x F

Browser("Yahoo!").Page("Yahoo! Mail - The best").WebEdit("login").GetROProperty(“name”)51Testing软件测试网y;j8{0N:k C

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

5BW9~e'rw0

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

1B O,z2Qw bm4~0而且,更为重要的是,通过这种Descrīptive Programming的方式,还可以让QTP识别具有某些相同属性的对象。我们先来举个例子来看一下:我们假设当前的Windows系统中打开了若干的Yahoo主页面(多于一个),现在我们要关闭所有的正在浏览Yahoo主页面的浏览器。51Testing软件测试网6c7^6nS1D p(IW

51Testing软件测试网 Z(i cAfF-D;E2}

对于上面那个例子来说,我们先看一个简单一点的情况,假设只有且仅有一个Yahoo主页面:那么我们可以用下面的方法来

"m HEg/w&qc4i051Testing软件测试网'uKiZ I:T4Gd

Window("Text:=Yahoo! - Microsoft Internet Explorer").Close51Testing软件测试网G*B-t3l.o

51Testing软件测试网6r)PH?,u.KE

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

`R[@3qk{051Testing软件测试网#e0X"ZStF]UYw

Dim i

K;? QcRD&KHd+R051Testing软件测试网1~2[FCz&E d1c+K

i = 051Testing软件测试网^%| AI/~}0E.y^ X

!iZ8^Ms$U0while (Window("Text:=Yahoo! - Microsoft Internet Explorer", "index:="&i).exist)51Testing软件测试网Rj{ q dY

51Testing软件测试网xnXRB G

Window("Text:=Yahoo! - Microsoft Internet Explorer", "index:="&i).close51Testing软件测试网1U mmPB

51Testing软件测试网!b:s2N(y#H9CP1au

i = i +151Testing软件测试网smvnzua/Q2k

51Testing软件测试网 {Or \3m

wend51Testing软件测试网N+d2]%W3`:{k$[,i

#a-j T,X(@%S0这里我们可以看到,对于具有相同属性的对象,我们可以通过index参数来对其进行区别,第一个对象为index=0,第二个为index=1等等,依次类推。当然我们还可以通过CreationTime和Location参数来定位对象,这里就不详细叙述了。51Testing软件测试网`-i.R!v5[Nc

4@6cV8Uk;I0通过上面的例子,我们对Descrīptive Programming有一个基本了解了,下面我们详细讲解一下Descrīptive Programming:在具体实现中,我们有两种类型的Descrīptive Programming方法。可以列出直接在测试语句中描述对象的属性和值的集合;或者向 Descrīption 对象中添加属性和值的集合,然后在语句中输入 Descrīption 对象的名称。下面我们分别举例介绍。

"^.}~8r8Ox"U)AJ%J051Testing软件测试网%i+lo.m@

2、直接在语句中输入编程描述51Testing软件测试网cfr;Sq1n5nzz

51Testing软件测试网\-Ii7Z\sb6O$ZQ

通过多个指定描述对象的property:=value对,可以直接在语句中描述对象,这是最直接有效的方法。

}!P)oBTD&t2m051Testing软件测试网$lZ `SmR*O

常规语法为:51Testing软件测试网Mi E(DHN L;J(j2f

51Testing软件测试网t V,N'gY/JR

TestObject("PropertyName1:=PropertyValue1", "..." , "PropertyNameX:=PropertyValueX"}51Testing软件测试网 t;EU;JI D

51Testing软件测试网5? ca-E0y9qxtI']

TestObject - 测试对象的类。

'} B(`-V?051Testing软件测试网1A,P2} LI

PropertyName:=PropertyValue - 测试对象的属性及其值。各个property:=value对之间应用逗号和引号分开。51Testing软件测试网 v5dw#E.N9|@4\+f4N

51Testing软件测试网"cjolA*W?5B

例如:以下语句指定 Mercury Tours 页面中名为author且索引值为 3 的 WebEdit 测试对象。当测试运行时,QTP 将查找具有匹配属性值的 WebEdit 对象,并输入文本jojo。

|7W.V(T`+? L051Testing软件测试网2O~"S%Y_j

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

.p0hEOsp#t7O0

s y4] u TOz4[+o0我们也可以从从描述中的特定位置(从 Page 对象描述开始)开始使用Descrīptive Programming。51Testing软件测试网3G:B}B"~3x(C+H,\2Vk

r1I.NE'D bW ^4@/b0Browser("Mercury Tours").Page("Title:=Mercury Tours").WebEdit("Name:=Author", "Index:=3").Set "jojo"51Testing软件测试网*GTL\ vo

51Testing软件测试网}fE4h#k

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

F.}-q*{+}$m,v051Testing软件测试网-Sr1X)T@(RD

例如:我们需要完成下面一系列操作51Testing软件测试网[7i(qr8wb

51Testing软件测试网 Dq;|+n5}9Cnd&M.U

Window("Text:=HyperSna").WinButton("Caption:=日期").Click

DP%@+V8V,A0

T/hs-f'b;XO*zuS5]}0Window("Text:=HyperSna").WinButton("Caption:=时间").Click

:G+U6|4n"x.Sl!er051Testing软件测试网Q.yK'km`

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

7h^$Ek:g ]7A051Testing软件测试网t*[ F G~7D6u

那么,为了方便其见,我们可以将Window("Text:=HyperSna")赋值到一个变量,然后再使用,参见下面的代码:51Testing软件测试网AG1L0?'f Ft

1W`X R+DG0Set WinHyper = Window("Text:=HyperSna")51Testing软件测试网#\]Z A\

51Testing软件测试网sF4_I5y']YY R

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

8V,J'f&XH051Testing软件测试网q}R6@S.ume

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

O2~+pV j1f0

`!hI j.dgt4h~X0WinHyper.WinButton("Caption:=确定").Click

4D1WLcIuP"Y0

+i"|#WC G5p%bC(W^;m0如果使用了VBscrīpt里面的With语句,还可以简化为以下代码:

m Q%V!m zy9?&}051Testing软件测试网EI qxFL

With Window("Text:=HyperSna")

u+f^l [Ok~051Testing软件测试网4e v X"hc/w!@3p7j A/r/d)^

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

E0t'd4|ku'rG0R G0

} w z E BMs T[0.WinButton("Caption:=时间").Click

A!GIvkP?4JU051Testing软件测试网c5e5`'uP ~k5?4p

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

7r+Fq?@v0

y&raWa0End With

Qs*uD`y0

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

p@i@"n[051Testing软件测试网Xyu1?;ex-R

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

4o!M0vEW0
  
51Testing软件测试网)IB.P7A.A,b%I hZt

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

*t@:B&V;TO8e0

`u&{,p ]dd/gR4f0Browser("Welcome: Mercury Tours").Page("Book a Flight: Mercury").WebEdit("passFirst0").Set "Michael"

'zh/hgOc;Df+_ o&\051Testing软件测试网!ts8@,B{'OsH

Browser("Welcome: Mercury Tours").Page("Book a Flight: Mercury").WebEdit("passLast0").Set "Wang"51Testing软件测试网e/q*MgH

51Testing软件测试网|!K i1?+~%I-}4?

显然WebEdit("passFirst0")和WebEdit("passLast0")是录制时产生的对象并存放到对象库里的。通过对象库,我们可以看到对象的属性如下

h Ng1ZM!z0
  

,mDQv(x/~(k E{Q0系统对于发生多个FirstName时,命名规则是passFirst0,passFirst1…依次类推。因此只要通过简单的Descrīptive Programming就可以完成动态FirstName与LastName的识别工作。这里我们假设参数化的乘客数已经赋值给intPassNum,下面是脚本中的关键语句:

'H0PK:r5j3|,S _cqb051Testing软件测试网 c~5E-Y-Oo*Q

counter = 0

(H*ch A0sPB0

hr@s q2Erx _+[0For i = 0 to (intPassNum)51Testing软件测试网SQNf"_Q;vbT;vA

?.z4iZ%US0Browser("Find a Flight:").Page("Book a Flight:").WebEdit("name:=passFirst"&i).Set "Michael"

&|u6UT2e,u%_0

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

3I'cXAh_d)V051Testing软件测试网&oy|f&W7ln HWh

counter = counter + 1

)w7yx1P%x_0

j4^v1R|2s0Next

S~/@ g \$dV4B4M051Testing软件测试网wH1z$u}T$t

3、使用descrīption对象51Testing软件测试网9E%x&`Aa:l/P0t

L'Jn bD*^]R0使用 Descrīption 对象可以返回包含一组 Property 对象的 Properties 集合对象。Property 对象由属性名和值组成。然后,可以在语句中指定用返回的 Properties 集合代替对象名。(每个 property 对象都包含一个属性名和值)。51Testing软件测试网~O ETq$Z g

8}#c T/IP!O ]']w|0要创建 Properties 集合,可以使用以下语法输入 Descrīption.Create 语句:

Ng9ag6u2q(v8o|F051Testing软件测试网^7l JA5}

SetMyDescrīption= Descrīption.Create()51Testing软件测试网8W u,nw N(Z v

F"j3].J&S I0]#s8l9B0创建 Properties 对象(例如,以上示例中的MyDescrīption)后,就可以输入语句,以便在运行会话期间在 Properties 对象中添加、编辑、删除或检索属性和值。这样,就可以在运行会话期间,使用动态方法确定哪个属性以及多少个属性应包含在对象描述中。

$nP$o a+X?:\w0

$xQ)v*Ub Vy(}0在 Properties 集合中填充一组 Property 对象(属性和值)后,可以在测试语句中指定用 Properties 对象代替对象名。

LU L\hSt0

Bo$[4mTxWL0例如,假设我们需要完成以下一个操作:

K%q-z/w(|^$f5z0

+s(VW![? Vr0^0Window("Error").WinButton("text:=OK", "index:=1").Click

Qf*f h.G0

5})C#t2u1^5yb4m0我们可以通过Descrīption对象来实现同样的功能,参加下面的代码:

t/v7T1sg(T*Z;?0

l@$w1I*Pj&?4^9nF0Set MyDescrīption = Descrīption.Create()

imO_$n!N-T q T0

g-RljFW`z _0i0MyDescrīption("text").Value = "OK"

:[ ]:otj/Tt@5D0

1R ^W/vy J_6X0MyDescrīption("index").Value = 151Testing软件测试网'SWC"a0l8\7}8n,?j

51Testing软件测试网$?Fw _h-R

Window("Error").WinButton(MyDescrīption).Click51Testing软件测试网8j5sH0||E(q

51Testing软件测试网6@@ f_!Sc K&{3m ?4r

Set MyDescrīption = Nothing51Testing软件测试网9^E[ n$r"\6k?

51Testing软件测试网G oN4uE!o

【小结】以上是对QTP中有关处理动态对象中的Descrīptive Programming的简单介绍,希望对大家能够有所帮助,就总体而言,如果能够熟练掌握Descrīptive Programming,那么有很多实际中的问题就可以迎刃而解。当然Descrīptive Programming只是QTP中的一个功能,QTP在实际功能测试中还有很多强大的功能,作为QTP学习的一个系列有机会我会一一介绍。

v6E j!v1vt?0

TAG: QTP

 

评分:0

我来说两句

我的栏目

日历

« 2024-03-16  
     12
3456789
10111213141516
17181920212223
24252627282930
31      

我的存档

数据统计

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

RSS订阅

Open Toolbar