51Testing软件测试网t@l+^y+u1. QTP 识别对象原理51Testing软件测试网
Vs6Mcj#ITl
51Testing软件测试网2u yi1`Ml5k|QTP对每个控件类都定义了一些强制属性和辅助属性。当qtp对对象进行识别的时候,首先qtp会取出控件的所有强制属性,如果这些强制属性能够唯一标识这个控件则选强制属性来标识控件,如不能唯一标识控件,qtp则逐一取出控件类的辅助属性直到能唯一标识控件为止。51Testing软件测试网3]JP
W+K#LjOs
[T!kmo4s2ux0如果使用强制属性和辅助属性还不能唯一标识控件。 则有以下两种可能:51Testing软件测试网I;wL
t$P'U
j,nSpv(k u0QTP对控件类的识别使用了智能识别(Smart Identification),qtp会忽略之前对强制属性与辅助属性的识别,这时qtp会使用smart identification 中的 basic filter properties和optional filter properties来对对象进行识别. basic filter properties就是一些控件的基础属性,例如button的Name,这个属性变了button也就变成另外一个button了。51Testing软件测试网2kAULF(Jn
51Testing软件测试网O O"R f)}&}a]如果对控件类的识别没有使用Smart Identification,系统会使用Ordinal Identifier来对控件进行识别。51Testing软件测试网2W4m6P0K.}
RkB6@
51Testing软件测试网(N(b2W/VQb;M2X2. QTP的测试流程。大多自动化测试工具都是使用录制回放这种方式:
3W,h)]B$Bf
c:Aq051Testing软件测试网
x lz2k*C/c/bc录制:QTP录制方式有三种,标准录制,模拟录制与低级录制。
&Ug'v/W2zgq051Testing软件测试网y L
q
NWD%o-E标准录制一般就是最常用的,录制对标准控件的一些操作,如对button的click,winEdit的Set value等等。51Testing软件测试网#{8~G;w%Va*n5K
'jC0I W"j(q1`E0模拟录制,可以录制鼠标的轨迹,主要用与绘图此类软件的录制。51Testing软件测试网L Z.CW9Tgs]5S6g
51Testing软件测试网4]y)F&q'Or6y低级录制,与标准录制不同,不是Object.Operation value 而是记录屏幕坐标点上的操作。 稳定性较差。51Testing软件测试网'rf(@Wj+dVe&V8^w
51Testing软件测试网#LJyqX~+{k录制的时候,QTP会将用户的操作以VBscrīpt的形式保存在Expert View里头,录制的时候还会判断控件是否存在对象库里面,如果没有则创建对象。对象库里面的对象称为 Test Object 与程序UI上的控件对象Run Time Object 相对应。51Testing软件测试网e1Y3e1M
t_?
S@!^K5UV-C*T0和TO、RO相关的几个函数有:51Testing软件测试网ye8b6X%^gL
51Testing软件测试网)z4h"E*QG
GetTOProperty():取得仓库对象的某个属性的值51Testing软件测试网 {[_@Wp2u%t(Y
GetTOProperties():取得仓库对象的所有属性的值 //返回一个对象类型,属性集为对象标识属性集51Testing软件测试网w2C/voS+OD_M
m
SetTOProperty():设置仓库对象的某个属性的值51Testing软件测试网Th,y:r'R0s8Z1p0Y;M
GetROProperty():取得实际对象的某个属性的值
O4KfxEQSf\)J051Testing软件测试网1S&?'C u:y:j
qG {xMNGw0录制完成需要对代码进行修改,增加代码的稳定性与可移植性。
t)D#O"d%h0z)tJ;ZFp_01. Add Comments. 代码中加必要的解释能增加代码的可读性,利于回归测试中代码的维护。
0C0}IT_e
{01w7TqF
gP }P02. 增加控制流语句。如程序的登陆,正常流程是输入验证信息,点击登陆按钮进入主界面。若用户已经登陆则系统就应该弹出一个确认框问用户是否需要删除原来的session。 这是录制的教本里面我们就应该加一个判断, 判断是否这个弹出框存在。51Testing软件测试网I$yY)MlK"L
51Testing软件测试网{P\(].hynCk3. 参数化。 QTP 参数化有一下几种方式:1)action parameter. Keyword View -> 右键ActionName ->Action Properties, Parameter tab. 可以配置action的传入参数与传出参数,参数的使用为: strInput = Parameter("input"), input为action的传入参数。 Parameter("output") = strOutput, output为action的输出参数。 2)Environment, 在脚本中使用strTemp = Environment("environmentVariable"). 3)datatable, 使用DataTable.SetCurrentRow(RowVale) strTemp = DataTable.RowValue(Parameter, SheetID).
_mF-@6EU
~-C U1t(]0/~JaDi+D0o6Z*W7Ga9e04. CheckPoint.
?A br%yC(Z051Testing软件测试网+H H/vIws'US2q&c5. 同步点. WaitProperty(Property, value, Timeout). Object.exist(Timeout). Wait Time.51Testing软件测试网&b[-{"X&}|0w2Tk$l
51Testing软件测试网
`}[{9M9a7c6. QTP错误处理机制:
~fz"\7[-c051Testing软件测试网
L
O2Bi ?QTP 有三种错误处理机制:51Testing软件测试网bN5V&wP{NI:l
51Testing软件测试网?`L&AR1, 全局错误响应: Test setting中run设置
?BdJFA-]&v0V9wV*r'H7fT
_6]$l0全局错误响应是qtp的系统缺省错误处理,当没有使用其他错误处理方式时,系统会自动调用这里指定的方式进行错误处理。
)q`E2M
q2C051Testing软件测试网 m1G
_!N@.uO在整个脚本有效。 若是出错在Function Library,则错误号只存在library,不会传到Action中。
|G }8Q4u9?0k_$D051Testing软件测试网2]6V(kq-T,H@O}'Nt2, VBscrīpt on Error错误处理: On Error Resume Next51Testing软件测试网+N/z2|6Y"J'@8h v
!ZFt L
O/rT&n0VBscrīpt的错误处理方式,三种相关方式为:
MFg(js5TB0(]bq-Br&Z){8r7^0a)On Error Resume Next: 一旦这个语句已经被处理,脚本将继续后面的程序,不理会已经出现的错误。
e9N,J/I*U0w#v,X"m6}
qyDH,t0b)On Error GoTo 0: 使用On Error GoTo 0语句恢复缺省的错误处理行为, 在运行这个语句后, 发生的运行期错误将导致缺省错误处理,在qtp中,缺省的出错处理就是全局错误响应。51Testing软件测试网hX{9a^B.w4q1I$J
51Testing软件测试网q&gxR3}6m5~'ic)Err对象: Err对象有三个属性 Number, Source, Descrīption. Err对象在运行时错误发生的时候赋予新的值,原来的值将被丢弃。 Err对象是全局的, 不受函数调用的影响。 Err对象可以使用clear方法清空。 任何时候使用On Error Resume Next或者On Error GoTo 0都会清空Err对象。
'b%E\!cQ7l0a051Testing软件测试网RRe%n^S]3K只对语句所在的函数或Action中该语句之后的代码生效,对于子函数,调用Action均无效。若On Error 语句存在Action中而出错在Function Library则系统会调用全局错误响应处理。若是Action中函数调用,则会返回到使用On Error 语句的环境中。51Testing软件测试网+t2@"tJ*L8T.IRy
51Testing软件测试网(Qr~:PHt7n:An
tv o3, 错误恢复场景: Recovery Scenario.51Testing软件测试网}
~lW6U9B$Z/V3@4Y![&O
51Testing软件测试网0j(c9`S;kM3JA D&Q2s|触发条件有:51Testing软件测试网D
pY,mL^
M1@V }0R`B0a) Pop-up Window51Testing软件测试网9Y1Bj Dtnr^x
51Testing软件测试网?1O H%]u+SsuR1bb) Object state
4D-Zn)we4k051Testing软件测试网s.U e,WR?0Jc) Test run error.51Testing软件测试网3{7nxt6W1RF5r7If
2gxv"EA&y]0d) Application Crash.51Testing软件测试网aMq Bv]
m8@,v
s
D;f4]^f4D([7j0错误恢复有以下几种方式:51Testing软件测试网%}!{"Wqu7H&f.w
51Testing软件测试网NF%ZuO0J
s&b8n.k{a) Keyboard or mouse operation
(mZAKh2B0O2w"aoJh~3J's0b) Close Application process51Testing软件测试网vfhJUoh3j$b pbB
#`?"P q:}}-xx @#A-D0c) Function Call51Testing软件测试网OShwU(@q"tCH
JaNk,P;Q^0d) Restart Microsoft Windows51Testing软件测试网{*@6eP\2^&i
qbC5D5X5z07. 关于虚拟对象的使用:51Testing软件测试网 N3nt3R?n+o$}l
51Testing软件测试网X
GX6h-_x'k虚拟对象管理器中显示的虚拟对象集合存储在您的计算机中,而不是随包含虚拟对象步骤的测试或组件存储。这意味着如果您在测试或组件步骤中使用虚拟对象,则仅当在包含正确的虚拟对象定义的计算机中运行时,该对象在运行会话过程中才能被识别。要将您的虚拟对象集合定义复制到另一个计算机,请将您的 <QuickTest 安装文件夹>\dat\VoTemplate 文件夹的内容(或该文件夹中的单个.vot集合文件)复制到目标计算机上的相同文件夹中
~sr,KP*Hx3[*dB5vsy;Q051Testing软件测试网E(E6_#P5R+`V <QuickTest 安装文件夹>\dat\VoTemplate 文件夹只有在已经定义虚拟对象的情况下才会出项51Testing软件测试网ui/`(UMJ
,[SMr$F#kk?08. 使用RegisterUserFunc注册用户定义的测试对象方法51Testing软件测试网RS_~ |1UB
51Testing软件测试网/iSS:s/d*UKarRegisterUserFuncTOClass, MethodName, FunctionName51Testing软件测试网7rRA-}
~A&K
"Rc5|,@A!Tmw,v0如果输入已经和指定的对象类关联的方法的名称,则用户定义的函数将覆盖现有方法。如果输入新名称,将添加到对象支持的方法列表中。
MV!S W_0
wY2Fz5Ne7E0Function MySet (obj, x)51Testing软件测试网%krL
zsK%Q!rF
dim y
1yan}/ea.W0y = obj.GetROProperty("value")
g6@yE't7@gS.o0Reporter.ReportEvent micDone, "previous value", y51Testing软件测试网6Yb_yC4X
MySet=obj.Set(x)
hx_4}g0End Function51Testing软件测试网?,~l2h;Of%K"b
RegisterUserFunc "WebEdit", "Set", "MySet"
p7V!fi"x@3g0Browser("MercuryTours").Page("FindFlights").WebEdit("Country").Set "Canada"
M{lZ{oNa7qM0使用UnRegisterUserFuncTOClass, MethodName可以取消用户注册方法51Testing软件测试网m G(ct~ Q5_8y6h
9, QTP描述性编程:
a.M3c_]X4w)p^0平行于对象库的一种编程方法. Example:
m'zD,H(\/@5F0set EditDesc = Descrīption.Create()51Testing软件测试网|rz!r"F[9G9R
EditDesc("Name").Value = "userName"
)Idm:d |Z k0EditDesc("Index").Value = "0"
0y&B{j+L8h+F0Browser("Welcome: Mercury").Page("Welcome: Mercury").WebEdit(EditDesc).Set "MyName"51Testing软件测试网 s-[u:[9qe;xg
使用描述性编程加正值表达式对于那些测试对象经常动态变化的情况很有用, Example:
o)lqt,mVE0Dim strTemp51Testing软件测试网SZk1oW_z#I
strTemp = "Google.*"51Testing软件测试网H%b~
YE5t;U
{4z|
Browser("百度一下,你就知道").Page("Google").WebEdit("q").Set "abc"
8NU"Pl Tcf{0Browser("百度一下,你就知道").Page("Google").WebButton("Name:="&strTemp).Click51Testing软件测试网o^0b^i3o f
10, 巧用WebTable的ChildItem方法: Example
5TW's*@P2k#H0Set ōbjTable = Browser("hao123网址之家--文学小说").Page("hao123网址之家--文学小说").WebTable("起点中文网")
l/O,`xr0intRow = 251Testing软件测试网#t]|/K.t Oa
intCol = 251Testing软件测试网pP!{{4?
' 通过ChildItem获取单元格中的链接对象
/\5t-JLd0Set ōbjLink = objTable.ChildItem(intRow, intCol, "Link" , 0)
`$R L(Uo8C-b d*]}0' 单击链接51Testing软件测试网3A Zp?MC'q&y
objLink.click51Testing软件测试网
fW1_ k'D0Ph#AGHBw
F;a%D5R&]TpPj0