引用:
原帖由 yabest 于 2007-8-2 02:35 发表 
>描述性编程还有一个好处,就是支持通过框架和数据进行配置和设置式的自动化测试,而不是录制+修改+回放
搞自动化的人,竟然排斥自动化,推崇自己手工写出每一行脚本(包括啥框架、配置方式的伪脚本) ...
假设你的脚本全部做好了。现在界面上增了加5个输入的内容,你打算怎么办?
我的办法很简单,打开框架配置的EXCLE,在输入数据的配置中插入5行,设置好输入对象的类型和属性。然后在后面的测试数据中输入对应的测试数据就OK了,各个过程不超过5分钟。
当然是基于对于我们的产品非常熟悉,一看界面就知道这5个对象是什么,不用使用对象库,也不用录制就知道它们的属性是什么。如果是新的对象,或者是不熟悉的对象,通过Object SPY功能查看,找到可以唯一识别的属性记下来。已经有网友自己编写了工具来自动识别对象,并生成自己的配置对象库(XML文件),这样,只需要在框架的配置文件中填写对象的名称就可以了。
下面一段是QTP自己生成的XML对象,只包括一个MSG窗口,窗口上有一个确定按钮。看看有多少内容,但实际上识别对象不需要这么多的内容。在你使用对象库时,虽然表面上没有代码,但实际上,QTP还是有很代码在对象库中搜索对象,根据对象的属性来创建对象。
- <qtpRep:ObjectRepository xmlns:qtpRep="http://www.mercury.com/qtp/ObjectRepository">
- <qtpRep:Objects>
- <qtpRep:Object Class="VbWindow" Name="frmBrower">
- <qtpRep:Properties>
- <qtpRep:Property Name="vbname" Hidden="0" ReadOnly="0" Type="STRING">
<qtpRep:Value RegularExpression="0">frmBrower</qtpRep:Value>
</qtpRep:Property>
- <qtpRep:Property Name="regexpwndtitle" Hidden="0" ReadOnly="0" Type="STRING">
<qtpRep:Value RegularExpression="0">电子病历基础-中联医院信息系统</qtpRep:Value>
</qtpRep:Property>
- <qtpRep:Property Name="nativeclass" Hidden="0" ReadOnly="0" Type="STRING">
<qtpRep:Value RegularExpression="0">ThunderRT6FormDC</qtpRep:Value>
</qtpRep:Property>
- <qtpRep:Property Name="is owned window" Hidden="0" ReadOnly="0" Type="BOOL">
<qtpRep:Value RegularExpression="0">-1</qtpRep:Value>
</qtpRep:Property>
- <qtpRep:Property Name="is child window" Hidden="0" ReadOnly="0" Type="BOOL">
<qtpRep:Value RegularExpression="0">0</qtpRep:Value>
</qtpRep:Property>
</qtpRep:Properties>
- <qtpRep:BasicIdentification>
<qtpRep:PropertyRef>vbname</qtpRep:PropertyRef>
<qtpRep:PropertyRef>regexpwndtitle</qtpRep:PropertyRef>
<qtpRep:PropertyRef>nativeclass</qtpRep:PropertyRef>
<qtpRep:PropertyRef>is owned window</qtpRep:PropertyRef>
<qtpRep:PropertyRef>is child window</qtpRep:PropertyRef>
</qtpRep:BasicIdentification>
<qtpRep:LastUpdateTime>2007年8月1日 22:46:48</qtpRep:LastUpdateTime>
- <qtpRep:ChildObjects>
- <qtpRep:Object Class="Dialog" Name="MS软件">
- <qtpRep:Properties>
- <qtpRep:Property Name="text" Hidden="0" ReadOnly="0" Type="STRING">
<qtpRep:Value RegularExpression="0">MS软件</qtpRep:Value>
</qtpRep:Property>
- <qtpRep:Property Name="nativeclass" Hidden="0" ReadOnly="0" Type="STRING">
<qtpRep:Value RegularExpression="0">#32770</qtpRep:Value>
</qtpRep:Property>
- <qtpRep:Property Name="is owned window" Hidden="0" ReadOnly="0" Type="BOOL">
<qtpRep:Value RegularExpression="0">-1</qtpRep:Value>
</qtpRep:Property>
- <qtpRep:Property Name="is child window" Hidden="0" ReadOnly="0" Type="BOOL">
<qtpRep:Value RegularExpression="0">0</qtpRep:Value>
</qtpRep:Property>
</qtpRep:Properties>
- <qtpRep:BasicIdentification>
<qtpRep:PropertyRef>text</qtpRep:PropertyRef>
<qtpRep:PropertyRef>nativeclass</qtpRep:PropertyRef>
<qtpRep:PropertyRef>is owned window</qtpRep:PropertyRef>
<qtpRep:PropertyRef>is child window</qtpRep:PropertyRef>
</qtpRep:BasicIdentification>
- <qtpRep:CustomReplay>
<qtpRep:Behavior Name="simclass" Type="STRING">#32770</qtpRep:Behavior>
</qtpRep:CustomReplay>
<qtpRep:LastUpdateTime>2007年8月1日 22:46:48</qtpRep:LastUpdateTime>
<qtpRep:ChildObjects />
</qtpRep:Object>
</qtpRep:ChildObjects>
</qtpRep:Object>
</qtpRep:Objects>
<qtpRep:Parameters />
<qtpRep:Metadata />
</qtpRep:ObjectRepository>
录制+修改+回放的做法,不是不好。而描述性编程也不是某些网友所说的是落后,应该是根据不同的使用人员,环境和目标,各取所需,不然,QTP就不会提供2种方法了。
[
本帖最后由 loho1968 于 2007-8-2 15:42 编辑 ]