51Testing软件测试论坛

标题: 描述性编程VS 对象库 [打印本页]

作者: jackymail    时间: 2007-7-31 23:54
标题: 描述性编程VS 对象库
是先把所有要操作的对象添加到对象库里去,然后看着对象库里面对象的属性来写,写了以后删除对象库。
还是用spy一个一个去查找然后写?

有的人说对象库是精华,你们不用对象库,为什么?

我测试的软件。在主界面上能获取上千个对象,但是不能获取到子叶面的对象。然后具体到某个叶面也都有几十个上百个自己的对象。

我全部用的对象库。

或许可以把主叶面上的对象加入到对象库,子叶面里面的对象就用描述性编程好了,这样获取了主叶面对象以后就共享给所有人,用到子叶面的对象的时候就让相关负责的人用描述性编程。你说呢?

[ 本帖最后由 walker1020 于 2007-9-6 23:43 编辑 ]
作者: MarsNoNo    时间: 2007-8-1 03:56
标题: LZ真会偷懒!
QTP并不能识别所有的对象!
而且,对象库也占存储空间的。
还有,假如,对象变化了,难道你还要去对象库中修改对象的属性等等?到时候光修改对象就头痛死了,更别说改脚本啦。
还有……还有就是该睡觉了!

p.s.:照着对象库里的对象来做描述性编程,貌似“脱了裤子放屁”的说……sdlkfj3多此一举!LZ别怪我说话太直,我确实想不到其他词汇来形容你这个想法了!sdlkfj5

[ 本帖最后由 MarsNoNo 于 2007-8-1 04:00 编辑 ]
作者: zhong1984314    时间: 2007-8-1 08:28
描述性编程需要熟练掌握常用对象的基本特性,对于新手来说先通过对象库也不识为一种好办法,现在需求变更频繁,对象也多变,用描述性编程对脚本维护非常有利

[ 本帖最后由 walker1020 于 2007-8-15 23:30 编辑 ]
作者: jackymail    时间: 2007-8-1 10:48
标题: 你们楼上2个人怎么都在侃侃而谈?
你们到底是不是用spy一个一个去查找的。就一句话怎么都懒得回答呢。

就算用描述性编程,先收集到对象库以后看起来比较方便。再删除对象也没什么不可以,因为你无非是不想使用对象库。

还有你们知道对象库识别机制吗?需求变更频繁与对象库或者描述性编程一点关系都没有,准确地说描述性编程识别对象要更差一些!

何谓新手?

[ 本帖最后由 walker1020 于 2007-8-15 23:30 编辑 ]
作者: yabest    时间: 2007-8-1 11:18
原帖由 MarsNoNo 于 2007-8-1 03:56 发表
QTP并不能识别所有的对象!
而且,对象库也占存储空间的。
还有,假如,对象变化了,难道你还要去对象库中修改对象的属性等等?到时候光修改对象就头痛死了,更别说改脚本啦。
还有……还有就是该睡觉了!
...



>>QTP并不能识别所有的对象!
  对象库和描述行编程识别对象的原理不一样的?!

>>而且,对象库也占存储空间的。
  这种理由,搞笑!

>>还有,假如,对象变化了,难道你还要去对象库中修改对象的属性等等?到时候光修改对象就头痛死了,更别说改脚本啦。
  是啊,一个对象在脚本里出现了几十上百上千处,对象变化了:
  用对象库只要修改一处地方,修改了直接HighLight一下验证是否正确,
  用描述行编程,你要修改几十上百上千处用到此对象的脚本!哪个让你头疼?
  别跟我说用属性变量,对象识别不是一个简单的属性变量可以囊括的!用属性变量简直是吃饱撑着、自找苦吃!
作者: yabest    时间: 2007-8-1 11:48
原帖由 zhong1984314 于 2007-8-1 08:28 发表
描述性编程需要熟练掌握常用对象的基本特性,对于新手来说先通过对象库也不识为一种好办法,现在需求变更平凡,对象也多变,用描述性编程对脚本维护非常有利


对象仓库就像高级语言,方便高效!
描述性编程就像汇编语言或机器语言,功能差不了多少,可那琐碎繁杂的程度,只会让人发疯!

QTP有别其他工具的一大特点,或者说是精华,就是使用对象仓库!就像高级语言一样,极大的简化了开发工作。
描述性编程只是作为某种补充的小分支技术,就像高级语言里支持嵌入式汇编一样。
在高级语言环境里少量使用嵌入式汇编是有好处的,但是通篇使用嵌入式汇编,只能说是吃饱了撑着!

如果为了显示自己是高手,那就尽情的用描述性编程吧!

[ 本帖最后由 yabest 于 2007-8-1 11:52 编辑 ]
作者: sidneylover    时间: 2007-8-1 11:53
看你们的帖子太搞笑了sdlkfj3

一般情况能不用描述性编程就不要用,通过对象库识别对象的时间要远小于通过描述性编程找到对象的时间,执行效率要高的多。
作者: wopost    时间: 2007-8-1 11:57
sdlkfj2
作者: jackymail    时间: 2007-8-1 11:59
标题: 行了行了,开始总结了。
基本上除了运行期间重要属性会发生改变的对象是用描述性编程,其余的一律对象库。

用spy一个一个去查询然后写出一堆看似比较高深的却又不方便阅读和编写的的代码。。这种做法。。。不评论!
作者: loho1968    时间: 2007-8-1 12:12
原帖由 sidneylover 于 2007-8-1 11:53 发表
看你们的帖子太搞笑了sdlkfj3

一般情况能不用描述性编程就不要用,通过对象库识别对象的时间要远小于通过描述性编程找到对象的时间,执行效率要高的多。



你是否有测试呢?时间真的快吗?

我认为2都的原理是一样的,通过描述对象的属性和类型,来识别对象。对于初学者,对象库确实是使用简单方便。但对象库维护不方便,如果使用描述性编程,对象有变化时,可以通过“查找”和“替换”来快速的修改对象的属性变化。如果再配合测试框架,或者是XML的方式来描述对象,甚至可以自己做一个适应于自己测试软件的对象管理功能。

比如:
set Main_window=desciption.create()
Main_window("vbname").value="frmBrower"
这2句就完成了一个对象的建立,需要使用时,直接就是 vbwindow(Main_window).active,非常方便。
如果将来"frmBrower"属性变了,一个查找替换就完成了调整,甚至可以通过自动工具来完成。

[ 本帖最后由 walker1020 于 2007-8-15 23:43 编辑 ]
作者: yabest    时间: 2007-8-1 13:04
原帖由 loho1968 于 2007-8-1 12:12 发表



你是否有测试呢?时间真的快吗?

我认为2都的原理是一样的,通过描述对象的属性和类型,来识别对象。对象初学者,对象库确定使用简单方便。但对象库维护不方便,如果使用描述性编程,对象有变化时,可 ...



>>你是否有测试呢?时间真的快吗?
  这个应该无所谓吧

>>但对象库维护不方便,如果使用描述性编程,对象有变化时,可以通过“查找”和“替换”来快速的修改对象的属性变化。
  怎么维护不便啊, 我觉得对象仓库实在是太好用了!
  QTP给对象仓库可是做了很多非常方便的操作,通过对象仓库来管理对象特征属性,HightLight检验对象,
  点脚本里的某对象的右键菜单直接跳到它在对象库里的位置,写脚本时自动搜索对象库并提示下一级对象的名称。
  反正对象库的好处是说都说不尽!

>>如果再配合测试框架,或者是XML的方式来描述对象,甚至可以自己做一个适应于自己测试软件的对象管理功能。
  XML描述对象?又是吃饱撑着自找苦吃!

>>比如:
>>set Main_window=desciption.create()
>>Main_window("vbname").value="frmBrower"
>>这2句就完成了一个对象的建立,需要使用时,直接就是 vbwindow(Main_window).active,非常方便。
>>如果将来"frmBrower"属性变了,一个查找替换就完成了调整,甚至可以通过自动工具来完成。

  呵呵,相比起   Window("Main").active  这么简单直观好看的脚本,你这段代码简直是繁琐难看死了!
  就为了可以“查找”和“替换”来修改对象描述,就为了用XML代替对象仓库,你就这么折腾脚本,值得吗?!
作者: loho1968    时间: 2007-8-1 22:12
呵呵,相比起   Window("Main").active  这么简单直观好看的脚本,你这段代码简直是繁琐难看死了!
  就为了可以“查找”和“替换”来修改对象描述,就为了用XML代替对象仓库,你就这么折腾脚本,值得吗?!
看看下面的脚本:
对象库:VbWindow("frmBrower").VbWindow("frmApparatusList").VbButton("∨ 从仪器项目列表中删除").Click
描述性编程:vbWindow(frmAppara).vbbutton(add).click
哪个更简洁?
描述性编程还有一个好处,就是支持通过框架和数据进行配置和设置式的自动化测试,而不是录制+修改+回放
作者: jackymail    时间: 2007-8-2 00:13
标题: 回复 #12 loho1968 的帖子
楼上的不对吧,你定义frmappara and add的代码呢?不用定义就能用啊??
定义以后关键属性发生改变你不用修改定义阿?
还有框架数据配置设置式的自动化测试。
框架就比较宏观了。数据配置我用对象库方法也作了,设置式的自动化测试不知道是什么名词。

数据配置:我把数据都拿到一个vbs里面去了。在test里面引入就好了,我没用datatable.

我觉得datatable可以放弃,对象库不能放弃。
作者: yabest    时间: 2007-8-2 02:35
原帖由 loho1968 于 2007-8-1 22:12 发表
看看下面的脚本:
对象库:VbWindow("frmBrower").VbWindow("frmApparatusList").VbButton("∨ 从仪器项目列表中删除").Click
描述性编程:vbWindow(frmAppara).vbbutton(add).click
哪个更简洁?
描述性编程还有一个好处,就是支持通过框架和数据进行配置和设置式的自动化测试,而不是录制+修改+回放


>描述性编程还有一个好处,就是支持通过框架和数据进行配置和设置式的自动化测试,而不是录制+修改+回放

  搞自动化的人,竟然排斥自动化,推崇自己手工写出每一行脚本(包括啥框架、配置方式的伪脚本),真是讽刺,而且这样子不累啊?
  视简单为低级,视复杂为高级,一定要把简单的东西复杂化,才甘心?!

  我做了这么多年的QTP,从来都是用 “录制+修改+封装+回放” 的方式!
  先录制取得初始脚本,再做简单的修改和参数化,再进行封装形成可重用的函数,最后回放调试,形成了最终的脚本。
  这样子开发,省去一个字符一个字符的写脚本,效率不知高了多少倍!而且全自动化,不怕会拼写错误!
  我简直无法想象,我这么多年写的QTP脚本,如果不用录制方式,而改用手工方式写,要多花上几倍的时间才能完成!!!

  框架?框架是要使开发工作更简单更高效!
  排斥录制方式,用手工写每一行脚本,在我看来,就是排斥高级语言,用汇编语言、机器语言来编程。
  厉害是挺厉害的,但却是吃饱撑着,自找苦吃

[ 本帖最后由 yabest 于 2007-8-2 13:08 编辑 ]
作者: flyfly310    时间: 2007-8-2 12:29
呵呵,best整天在这里吵个不停
反正我懒,还是录制好啦
作者: jackymail    时间: 2007-8-2 12:52
Yabest 收我为徒吧。。。。。。

原帖由 yabest 于 2007-8-2 02:35 发表


>描述性编程还有一个好处,就是支持通过框架和数据进行配置和设置式的自动化测试,而不是录制+修改+回放

  搞自动化的人,竟然排斥自动化,推崇自己手工写出每一行脚本(包括啥框架、配置方式的伪脚本) ...

作者: yabest    时间: 2007-8-2 13:26
原帖由 flyfly310 于 2007-8-2 12:29 发表
呵呵,best整天在这里吵个不停
反正我懒,还是录制好啦

我容易吗我sdlkfj8
作者: yabest    时间: 2007-8-2 13:28
原帖由 jackymail 于 2007-8-2 12:52 发表
Yabest 收我为徒吧。。。。。。



现在教育都产业化了,我也不能落伍啊!你看,这学费怎么算啊?!sdlkfj3
作者: jackymail    时间: 2007-8-2 13:52
等我学成出师,第一个月外快归您老。。。。
sdlkfj4
原帖由 yabest 于 2007-8-2 13:28 发表


现在教育都产业化了,我也不能落伍啊!你看,这学费怎么算啊?!sdlkfj3

作者: loho1968    时间: 2007-8-2 15:34
原帖由 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 编辑 ]
作者: loho1968    时间: 2007-8-2 15:48
原帖由 jackymail 于 2007-8-2 00:13 发表
楼上的不对吧,你定义frmappara and add的代码呢?不用定义就能用啊??
定义以后关键属性发生改变你不用修改定义阿?
还有框架数据配置设置式的自动化测试。
框架就比较宏观了。数据配置我用对象库方法也作 ...


datatable不用我赞成,不如使用EXCEL,因为操作方法几乎一样,但编辑却没有EXCEL方便。
作者: jackymail    时间: 2007-8-2 16:26
标题: 你说的不对
就算描述性编程,qtp也一样要经过必要的判断步骤。
还有就是对象库里面的描述属性是可选的,你可以选择和你描述性编程使用一样的数量和属性。
你的5个元素修改过程在使用对象库的时候是一样的。
把对应的脚本拿过来添加几个步骤就行了。

工作量肯定只少不多。

描述性编程到底是因何开发。
对象属性存在部分动态变化

不是提供2种录制方式。

yabest说的还是很有道理的。。。qtp在对象识别和获取上花了很大功夫。是重头戏。

原帖由 loho1968 于 2007-8-2 15:34 发表


假设你的脚本全部做好了。现在界面上增了加5个输入的内容,你打算怎么办?
我的办法很简单,打开框架配置的EXCLE,在输入数据的配置中插入5行,设置好输入对象的类型和属性。然后在后面的测试数据中输入对 ...

作者: yabest    时间: 2007-8-2 16:32
原帖由 loho1968 于 2007-8-2 15:34 发表

假设你的脚本全部做好了。现在界面上增了加5个输入的内容,你打算怎么办?
我的办法很简单,打开框架配置的EXCLE,在输入数据的配置中插入5行,设置好输入对象的类型和属性。然后在后面的测试数据中输入对应的测试数据就OK了,各个过程不超过5分钟。
当然是基于对于我们的产品非常熟悉,一看界面就知道这5个对象是什么,不用使用对象库,也不用录制就知道它们的属性是什么。如果是新的对象,或者是不熟悉的对象,通过Object SPY功能查看,找到可以唯一识别的属性记下来。已经有网友自己编写了工具来自动识别对象,并生成自己的配置对象库(XML文件),这样,只需要在框架的配置文件中填写对象的名称就可以了。


我还是不明白你这样子做的意义!
用录制方式的话,我就启动录制,在5个输入内容里填入相应的值,然后停止录制,整个过程,半分钟都不到!简单、准确、直观!
你这样子,我越发觉得像是汇编、机器语言那样,算个简单的公式,也要繁琐的把数据从寄存器搬来搬去,累的半死又容易出错,何苦呢?

录制+修改+回放的做法,不是不好。而描述性编程也不是某些网友所说的是落后,应该是根据不同的使用人员,环境和目标,各取所需,不然,QTP就不会提供2种方法了。

我说的很清楚,QTP的描述性编程就像高级语言里支持的嵌入式汇编!
高级语言简单、高效、易读、不易出错,嵌入式汇编繁琐、复杂、难以阅读、容易出错!
在这样的环境里开发代码,大部分都使用高级语言,只有少数特殊的地方高级语言不好处理的,才用嵌入式汇编!

如果觉得高级语言太简单了没意思,或者功能不够强大,就通篇用嵌入式汇编来编码,并沉迷于汇编里直接操作硬件、控制一切的快感,
那就有点本末倒置、自找苦吃了!

QTP只是个工具而已,怎么简单,就怎么使用!  不要执意把它玩的很高深,象写个茴字一定要研究出六种写法才罢休的样子!

[ 本帖最后由 yabest 于 2007-8-2 20:21 编辑 ]
作者: loho1968    时间: 2007-8-3 12:41
为什么QTP还提供描述性编程呢?从官方的说明是:有些对象是动态创建的,没有办法录制。比如有根据操作创建多个页面,页面的标题就是“页1”、“页2”等等,这种情况下,录制就不能解决,就需要描述性编程了。

我认为,在windows环境内,语言没有高级、低级的区分,只有你能否掌握和使用得好。不是有人说VB是落后的语言吗?我们靠10几年靠编VB的程序养活了几百号人。
作者: loho1968    时间: 2007-8-3 12:46
原帖由 jackymail 于 2007-8-2 16:26 发表
就算描述性编程,qtp也一样要经过必要的判断步骤。
还有就是对象库里面的描述属性是可选的,你可以选择和你描述性编程使用一样的数量和属性。
你的5个元素修改过程在使用对象库的时候是一样的。
把对应的脚本 ...

》》yabest说的还是很有道理的。。。qtp在对象识别和获取上花了很大功夫。是重头戏。

QTP的对象识别,不是在对象库上,对象库只是一个管理工具而已。QTP对对象的识别和处理,关键在它对运行对象的识别和操作,而不是在于你是通过对象库,还是description对象来描述对象。
当然,使用对象库和KEYWORD视图确实很方便,通过鼠标操作,就可以设计自动化测试脚本。但实际应用中,不同的软件有不同的需求,再加上测试的业务流程的复杂程度不同,光靠鼠标是不能就会所有的情况的。
我不是反对录制+回放,而是认为不要太武断,除了对,就是错,应该区别情况对待。
作者: jackymail    时间: 2007-8-3 12:52
QTP对对象的识别和处理,关键在它对运行对象的识别和操作

上面这句话我实在知识有限,无法理解。

对象的识别过程你可以看一下帮助。

关于描述性编程的作用帮助里面也有。

不武断是对的。但是要把正确的方法用到正确的时机,还有就是尽量陈述一些有价值的准确地文字,才对别人有参考意义,感谢讨论。

原帖由 loho1968 于 2007-8-3 12:46 发表

》》yabest说的还是很有道理的。。。qtp在对象识别和获取上花了很大功夫。是重头戏。

QTP的对象识别,不是在对象库上,对象库只是一个管理工具而已。QTP对对象的识别和处理,关键在它对运行对象的识别和操 ...

作者: loho1968    时间: 2007-8-3 13:20
原帖由 jackymail 于 2007-8-3 12:52 发表
QTP对对象的识别和处理,关键在它对运行对象的识别和操作

上面这句话我实在知识有限,无法理解。

对象的识别过程你可以看一下帮助。

关于描述性编程的作用帮助里面也有。

不武断是对的。但是要把正 ...

>>QTP对对象的识别和处理,关键在它对运行对象的识别和操作
就是说,QTP可以识别更多的对象,可以对这些对象进行更多的操作,比如,WR对网页的支持就没有QTP好,但WR的对象管理与QTP的对象管理没有本质上的区别。重点不在对象库上面。而在对象库中的对象上面,比如支持智能识别,识别属性可以排序,支持多个相同对象的识别等。

其实,反而我觉得不论是QTP还是WR,把对象库保存为自己独有的格式反而不好,因为在对象库中维护对象有它不方便的地方。QTP9.2开始,已经支持导出和导入XML格式的对象库了。
单就对象识别技术而言,也不是很高深,论坛上有个网友就自己开发了一个程序,可以识别对象并记录为XML文档。
作者: jackymail    时间: 2007-8-3 13:34
智能识别的基础就是对象库,没有对象库就先进行识别就不会启动智能识别。
排序也是在对象库中的排序。没有对象库不纯在排序识别。

还有其他的。。。所有的你提到的都是基于对象库才有的特性,没有对象库就没有那些特性。。
这是我最近研究的重点,如有偏颇,希望有高手出来指正。。。这个观点很重要哦
补充一下:举个例子就是在你使用描述性编程的时候,是绝对不会启动智能是别的,这是重点。

原帖由 loho1968 于 2007-8-3 13:20 发表

>>QTP对对象的识别和处理,关键在它对运行对象的识别和操作
就是说,QTP可以识别更多的对象,可以对这些对象进行更多的操作,比如,WR对网页的支持就没有QTP好,但WR的对象管理与QTP的对象管理没有本质上的区 ...

[ 本帖最后由 jackymail 于 2007-8-3 13:36 编辑 ]
作者: loho1968    时间: 2007-8-3 14:06
原帖由 jackymail 于 2007-8-3 13:34 发表
智能识别的基础就是对象库,没有对象库就先进行识别就不会启动智能识别。
排序也是在对象库中的排序。没有对象库不纯在排序识别。

还有其他的。。。所有的你提到的都是基于对象库才有的特性,没有对象库就没 ...


>>智能识别的基础就是对象库,没有对象库就先进行识别就不会启动智能识别。

这个理解不正确,看下图
[attach]30402[/attach]

在设置Smart Identification时,针对的是某一类对象,比如vbwindow,winButton等,是设置QTP在识别对象时,先根据对象的什么属性来寻找对象(base filter properties),如果找到多个时,再根据补充的属性逐个来过滤(Option filter properties),直到找到唯一的对象。当然也可能还是有多个,这时就会出现错误。
这个智能识别与对象库没有直接的关系。从菜单上也可以看到,object identification是一个在tools下的独立菜单。

[ 本帖最后由 loho1968 于 2007-8-3 14:19 编辑 ]
作者: jackymail    时间: 2007-8-3 14:19
你是不是没写完阿?
我在论坛里面开了2个帖子,一个介绍smart identifation
另一个介绍对象识别。被加红色的那个。

你可以先读一下,有不对的地方欢迎指明
建议先看一下帮助。帮助里面有完整地介绍。
原帖由 loho1968 于 2007-8-3 14:06 发表


>>智能识别的基础就是对象库,没有对象库就先进行识别就不会启动智能识别。

智能识别,我理解如下
  1、Windows中多个对象,一个对象中多个属性。
对象的数量,再加上属性的数量非常巨大。

作者: loho1968    时间: 2007-8-3 14:23
这是QTP9.2中生成的设置识别属性的脚本
App.Options.ObjectIdentification("vbradiobutton").AvailableProperties.Add("abs_x")
App.Options.ObjectIdentification("vbradiobutton").AvailableProperties.Add("abs_y")
App.Options.ObjectIdentification("vbradiobutton").AvailableProperties.Add("checked")
App.Options.ObjectIdentification("vbradiobutton").AvailableProperties.Add("enabled")
App.Options.ObjectIdentification("vbradiobutton").AvailableProperties.Add("focused")
App.Options.ObjectIdentification("vbradiobutton").AvailableProperties.Add("height")
App.Options.ObjectIdentification("vbradiobutton").AvailableProperties.Add("hwnd")
App.Options.ObjectIdentification("vbradiobutton").AvailableProperties.Add("nativeclass")
App.Options.ObjectIdentification("vbradiobutton").AvailableProperties.Add("regexpwndtitle")
App.Options.ObjectIdentification("vbradiobutton").AvailableProperties.Add("text")
App.Options.ObjectIdentification("vbradiobutton").AvailableProperties.Add("vbname")
App.Options.ObjectIdentification("vbradiobutton").AvailableProperties.Add("vbname path")
App.Options.ObjectIdentification("vbradiobutton").AvailableProperties.Add("visible")
App.Options.ObjectIdentification("vbradiobutton").AvailableProperties.Add("width")
App.Options.ObjectIdentification("vbradiobutton").AvailableProperties.Add("window id")
App.Options.ObjectIdentification("vbradiobutton").AvailableProperties.Add("x")
App.Options.ObjectIdentification("vbradiobutton").AvailableProperties.Add("y")
App.Options.ObjectIdentification("vbradiobutton").OrdinalIdentifier = "location"
App.Options.ObjectIdentification("vbradiobutton").MandatoryProperties.RemoveAll()
App.Options.ObjectIdentification("vbradiobutton").MandatoryProperties.Add("nativeclass")
App.Options.ObjectIdentification("vbradiobutton").MandatoryProperties.Add("vbname")
App.Options.ObjectIdentification("vbradiobutton").AssistiveProperties.RemoveAll()
App.Options.ObjectIdentification("vbradiobutton").AssistiveProperties.Add("vbname path")
App.Options.ObjectIdentification("vbradiobutton").AssistiveProperties.Add("text")
App.Options.ObjectIdentification("vbradiobutton").AssistiveProperties.Add("window id")
App.Options.ObjectIdentification("vbradiobutton").EnableSmartIdentification = False
App.Options.ObjectIdentification("vbradiobutton").BaseFilterProperties.RemoveAll()
App.Options.ObjectIdentification("vbradiobutton").OptionalFilterProperties.RemoveAll()
作者: loho1968    时间: 2007-8-3 14:30
QTP8.2中,关于智能识别的一段说明
了解智能标识进程
如果 QuickTest 在运行会话期间激活智能标识机制(原因是,它不能基于录制的描述标识对象),它将按照以下进程标识对象:

QuickTest“忘记”录制的测试对象描述,创建一个新的候选对象列表,该列表包含与基本筛选器属性列表中定义的所有属性匹配的对象(在该对象的父对象内)。
在该对象列表中,QuickTest 筛选任何与“可选筛选器属性”列表中列出的第一个属性不匹配的对象。其余对象成为新的候选对象列表。
QuickTest 计算新的候选对象列表:
如果新的候选对象列表仍然有多个对象,QuickTest 将使用新的(更小的)候选对象列表对列表中的下一个可选筛选器属性重复步骤 2。

如果新的候选对象列表为空,QuickTest 将忽略该可选筛选器属性,返回以前的候选者列表,对列表中的下一个可选筛选器属性重复步骤 2。

如果候选对象列表只包含一个对象,那么 QuickTest 认为它已标识该对象并执行包含该对象的语句。

QuickTest 继续在步骤 2 和 3 中描述的进程,直到它标识一个对象,或者没有可选筛选器属性可用。
智能标识删除进程完成后,如果 QuickTest 仍然不能标识对象,则 QuickTest 将使用录制的描述加上顺序标识符来标识对象。

如果组合的录制描述和顺序标识符不足以标识对象,则 QuickTest 将停止运行会话,并显示“运行错误”消息。有关“运行错误”消息的详细信息,请参阅 QuickTest 故障排除测试。

我的理解:对象库中记录了对象的属性,使用Descrtiption对象也“记录”(实际上设置了)对象的属性,都可以用于智能识别。

[ 本帖最后由 loho1968 于 2007-8-3 14:31 编辑 ]
作者: jackymail    时间: 2007-8-3 15:05
if QT is unable to find any object that matches the learned objet description.orifit finds more than one object that fits the description,then qt ignores the learned description , and uses the Smart Identificaitoin mechanism to try to identify the object.

可能问题出自对这段话的理解。

不继续评论了,大家花的时间都太多了,先放一放,不说谁对谁错,等后来的人继续讨论。

原帖由 loho1968 于 2007-8-3 14:30 发表
QTP8.2中,关于智能识别的一段说明
了解智能标识进程
如果 QuickTest 在运行会话期间激活智能标识机制(原因是,它不能基于录制的描述标识对象),它将按照以下进程标识对象:

QuickTest“忘记”录制的测 ...

作者: yabest    时间: 2007-8-3 17:04
原帖由 loho1968 于 2007-8-3 12:41 发表
我认为,在windows环境内,语言没有高级、低级的区分,只有你能否掌握和使用得好。不是有人说VB是落后的语言吗?我们靠10几年靠编VB的程序养活了几百号人


高级语言是专有名词,是相对汇编语言、机器语言而说的。不是普通意义上的高级和低级、先进和落后的意思。VB也是高级语言的。
高级语言屏蔽了很多底层硬件的琐碎繁杂的操作,给人带来极大的便利,所以编程时都是优先使用高级语言。
人们一般只有在特殊情况,受到硬件的限制不得不的情况下,才用汇编语言、机器语言来编程。
能用高级语言的地方不用高级语言,执意用汇编语言、机器语言,就是自找苦吃了!


QTP的对象识别,不是在对象库上,对象库只是一个管理工具而已。QTP对对象的识别和处理,关键在它对运行对象的识别和操作,而不是在于你是通过对象库,还是description对象来描述对象。
当然,使用对象库和KEYWORD视图确实很方便,通过鼠标操作,就可以设计自动化测试脚本。但实际应用中,不同的软件有不同的需求,再加上测试的业务流程的复杂程度不同,光靠鼠标是不能就会所有的情况的。
我不是反对录制+回放,而是认为不要太武断,除了对,就是错,应该区别情况对待。


“对象库” 比 “描述性编程” 简单方便,简单方便!!!
它们本质上没啥区别,识别对象的原理是一样的,但就是简单方便,所以QTP主要让大家用对象库。
除了动态对象外,大多数情况对象库都可以处理,跟是什么软件,是什么测试流程没啥关系!
作者: jackymail    时间: 2007-8-6 10:44
这个功能9.0里面有没有阿。我怎么没见过啊。。指导一下啊
原帖由 loho1968 于 2007-8-3 14:23 发表
这是QTP9.2中生成的设置识别属性的脚本
App.Options.ObjectIdentification("vbradiobutton").AvailableProperties.Add("abs_x")
App.Options.ObjectIdentification("vbradiobutton").AvailableProperties.A ...

作者: loho1968    时间: 2007-8-6 11:22
原帖由 jackymail 于 2007-8-6 10:44 发表
这个功能9.0里面有没有阿。我怎么没见过啊。。指导一下啊


9.0中有没有我不清楚,我使用的是9.2,在设置智能识别时,就有一个功能是输出为脚本。
作者: jackymail    时间: 2007-8-6 11:26

原帖由 loho1968 于 2007-8-6 11:22 发表


9.0中有没有我不清楚,我使用的是9.2,在设置智能识别时,就有一个功能是输出为脚本。

作者: zitong    时间: 2007-8-10 16:13
好不容易才看完,真是一场激烈的讨论。收益了!
作者: nedved1020    时间: 2007-8-10 17:24
终于看完了!!很漂亮的一场舌战!!受教了!
作者: ppent    时间: 2007-8-10 22:33
对象库和描述性编程都是基于对象识别原理上的应用,两者在识别原理上是一致的,唯一的差别是对象库比描述性的对象识别多了一层封装,正如高级语言对于汇编语言。也正是如此,所以在使用上有信手拈来的感觉。
在应用技术上,关键字视图大大降低了用户的技术门槛,而相对来说,描述性编程灵活一些。
两者并非决然对立,而是相辅相成,共同构成了一个功能强大、有竞争力的工具。
最后引用魔兽世界中流行的一句话:没有垃圾的种族或职业,只有垃圾的玩家。大家体会一下这句话。sdlkfj2
作者: yabest    时间: 2007-8-11 03:15
原帖由 ppent 于 2007-8-10 22:33 发表
对象库和描述性编程都是基于对象识别原理上的应用,两者在识别原理上是一致的,唯一的差别是对象库比描述性的对象识别多了一层封装,正如高级语言对于汇编语言。也正是如此,所以在使用上有信手拈来的感觉。
在应用技术上,关键字视图大大降低了用户的技术门槛,而相对来说,描述性编程灵活一些。
两者并非决然对立,而是相辅相成,共同构成了一个功能强大、有竞争力的工具。
最后引用魔兽世界中流行的一句话:没有垃圾的种族或职业,只有垃圾的玩家。大家体会一下这句话



我不喜欢你这种和稀泥的说法,这样子说只会让初学者更迷惑更无所适从,甚至走上歧路!

就像你说的,对象库和描述性编程,就像高级语言和汇编语言的关系,一个简单高效,一个繁琐低效。
现在编程都首选高级语言,只有特殊的高级语言无法实现的地方,才用汇编语言,否则就是自找苦吃!

每种技术都有特点和适用范围,你应该跟初学者说明清楚,好让他们知道该如何选择。
而不是跟初学者说一通“两者并非决然对立,而是相辅相成,共同构成了一个功能强大、有竞争力的工具”、“没有垃圾的技术,只有垃圾的使用者”,这样的说法表面看起来是绝对正确,但实质上却是最没用的废话,说了跟没说一样,甚至比没说还误导人家!

我不希望有初学者看了你这样的说法后,一头栽进汇编语言(或描述性编程)的泥潭里,再也无法出来!

[ 本帖最后由 yabest 于 2007-8-11 03:19 编辑 ]
作者: wtucel    时间: 2007-8-11 11:08
原帖由 ppent 于 2007-8-10 22:33 发表
对象库和描述性编程都是基于对象识别原理上的应用,两者在识别原理上是一致的,唯一的差别是对象库比描述性的对象识别多了一层封装,正如高级语言对于汇编语言。也正是如此,所以在使用上有信手拈来的感觉。
在 ...



强烈赞同,感觉去争论是用编程描述还是录制回放没有什么意义,存在即是合理,两者相铺相成,讨论这还不如讨论什么时候用录制回放什么时候用编程描述的方式.
作者: yabest    时间: 2007-8-11 14:18
原帖由 wtucel 于 2007-8-11 11:08 发表



强烈赞同,感觉去争论是用编程描述还是录制回放没有什么意义,存在即是合理,两者相铺相成,讨论这还不如讨论什么时候用录制回放什么时候用编程描述的方式.


对,要讨论清楚,什么时候用高级语言,什么时候用汇编,免得让初学者糊里糊涂的,大多时候都用汇编,少数时候才用高级语言,全颠倒了!

[ 本帖最后由 yabest 于 2007-8-11 14:24 编辑 ]
作者: danmy    时间: 2007-8-11 15:50
原帖由 loho1968 于 2007-8-3 13:20 发表

>>QTP对对象的识别和处理,关键在它对运行对象的识别和操作
就是说,QTP可以识别更多的对象,可以对这些对象进行更多的操作,比如,WR对网页的支持就没有QTP好,但WR的对象管理与QTP的对象管理没有本质上的区 ...

求这个识别对象为XML的工具,呵呵
作者: danmy    时间: 2007-8-11 16:16
原帖由 yabest 于 2007-8-11 14:18 发表


对,要讨论清楚,什么时候用高级语言,什么时候用汇编,免得让初学者糊里糊涂的,大多时候都用汇编,少数时候才用高级语言,全颠倒了!

兄弟不要极端了, 比如B/S系统的测试,大量的对象都是动态生成,增加一个记录,生成一个链接,表格增加一行,这些动态的东西太多了,不用描述性编程,参数化以后根本不能流畅运行.

比如 Link("text:="&datatable.value("职员",dtLocalSheet))可以对应页面上的某员工链接,录制的化只能针对这一个员工有效, 要匹配datatable里大量的员工,只能描述性编程.

所以不用录制的方式,是不影响自动化测试流程的,但是不使用描述性编程,往往很多流程根本无法覆盖.

[ 本帖最后由 danmy 于 2007-8-11 16:17 编辑 ]
作者: yabest    时间: 2007-8-11 17:00
原帖由 danmy 于 2007-8-11 16:16 发表

兄弟不要极端了, 比如B/S系统的测试,大量的对象都是动态生成,增加一个记录,生成一个链接,表格增加一行,这些动态的东西太多了,不用描述性编程,参数化以后根本不能流畅运行.

比如 Link("text:="&datatable.value("职员",dtLocalSheet))可以对应页面上的某员工链接,录制的化只能针对这一个员工有效, 要匹配datatable里大量的员工,只能描述性编程.

所以不用录制的方式,是不影响自动化测试流程的,但是不使用描述性编程,往往很多流程根本无法覆盖.



你可能对象库用的不熟吧,对象库一样可以动态设置的,一样可以解决问题!

只要动态设置一下对象属性
Link("职员").SetTOProperty("text", datatable.value("职员",dtLocalSheet))

然后就可以反复的使用此对象了
Link("职员").Click
...
Link("职员").Click
...
Link("职员").Click


总结下描述性脚本的三大罪状:
一是写脚本效率底下容易出错。
二是脚本繁杂难看,充斥着复杂的属性描述。不像对象库方式那样,把复杂的属性描述封装在对象库里,只留给脚本一个清晰易读的对象名。
三是对象描述分散重复,每处脚本都要重复描述一遍对象。对象一变,天才知道要修改多少处的脚本,要修改哪些行的脚本。

QTP推出对象库,就是为了解决这些问题的!
所以要尽量多用对象库,少用描述性。

不知道你是怎么看待和解决这些罪状的?

[ 本帖最后由 yabest 于 2007-8-11 17:02 编辑 ]
作者: MarsNoNo    时间: 2007-8-11 19:49
jackymail的帖子貌似都有舌战的说……
QTP的精华就是对象库。能用对象库的尽量用对象库。
我自己就用9.0自带的那个例子做了一个插入订单,然后再删除,再试着去打开刚删除的订单号,代码太多了,很不方便!
引用一位QTP高手的话:学习和使用QTP,多使用spy和F7(Step Generator)!
yabest每次都好像很激昂的控诉描述性编程罪状的说……sdlkfj5

[ 本帖最后由 MarsNoNo 于 2007-8-11 19:55 编辑 ]
作者: yabest    时间: 2007-8-11 20:21
原帖由 MarsNoNo 于 2007-8-11 19:49 发表
...
yabest每次都好像很激昂的控诉描述性编程罪状的说……sdlkfj5
...


呵呵,见笑了!sdlkfj1
作者: dftx511619    时间: 2007-8-12 23:09
我现在正在尝试写 描述性编程
作者: dftx511619    时间: 2007-8-12 23:09
谁可以教教我们啊
作者: dftx511619    时间: 2007-8-12 23:10
谁有很好的资料啊
作者: dftx511619    时间: 2007-8-12 23:11
dddddddddddd
作者: dftx511619    时间: 2007-8-12 23:13
ddddddddddddddddddddddddd
作者: ppent    时间: 2007-8-13 09:55
标题: 回复 #41 yabest 的帖子
你勇于辩论的精神我很佩服,但极端的方式并不会给讨论交流带来良好的解决。现在很多事情,都没办法也不应该一句话对和错去判定的。
要不我们换个角度来交流吧,也别列举什么罪状了,在什么情况下使用对象库,什么情况下使用描述性编程更合适。
作者: hcgzzz    时间: 2007-8-13 11:29
QTP只不是一个工具,任工具都有一定的极限性.
      用对象库或用描述性编程,我觉得要看个具体公司的情况来说.如果公司有专门自动测试人员,会有一套相应的规定.因为自动化测试人员不一定非常明白第个项目的每个流程.如果没有专门的自动测试人员.那在许多项目中,您又要如何让自动化测试来节省自己的测试时间和工作呢?还有一点是:如何去管理众多的对象库和脚本?
作者: yabest    时间: 2007-8-13 11:30
原帖由 ppent 于 2007-8-13 09:55 发表
你勇于辩论的精神我很佩服,但极端的方式并不会给讨论交流带来良好的解决。现在很多事情,都没办法也不应该一句话对和错去判定的。
要不我们换个角度来交流吧,也别列举什么罪状了,在什么情况下使用对象库,什 ...


真奇怪了,我讨论问题都是摆事实讲道理,有理有据的,怎么就被说成是极端了,不利交流了?
难道要放弃自己的观点,当和事佬,和稀泥,才不是极端?

我列的罪状,其实就是描述性的缺点,对象库的优点。
你也可以列出描述性的优点,对象库的缺点。
然后就可以对照双方的优缺点,衡量一下,就很容易得出哪些情况下用对象库好,哪些情况下用描述性好了。
作者: loho1968    时间: 2007-8-13 12:01
原帖由 danmy 于 2007-8-11 15:50 发表

求这个识别对象为XML的工具,呵呵

QTP9.2就支持把共享对象库保存为XML
作者: loho1968    时间: 2007-8-13 12:13
[quote]原帖由 yabest 于 2007-8-11 17:00 发表


你可能对象库用的不熟吧,对象库一样可以动态设置的,一样可以解决问题!

只要动态设置一下对象属性
Link("职员").SetTOProperty("text", datatable.value("职员",dtLocalSheet))
>>这是非常好的解决办法,这个方法实际就是动态的改变对象的Description的值

总结下描述性脚本的三大罪状:
一是写脚本效率底下容易出错。
>>这个不对,如果程序结构设计好,描述性编程中对对象的处理部分一样可以封装。
二是脚本繁杂难看,充斥着复杂的属性描述。不像对象库方式那样,把复杂的属性描述封装在对象库里,只留给脚本一个清晰易读的对象名。
>>描述性编程一样的可以只留给脚本一个清晰易读的对象名,对象库的对象要清晰易读还得在识别后手工修改。
三是对象描述分散重复,每处脚本都要重复描述一遍对象。对象一变,天才知道要修改多少处的脚本,要修改哪些行的脚本。
>>描述性编程一样的可以集中处理生成需要使用测试对象,如果要修改,同样只修改一个地方。描述性编程一样可以使用SetTOProperty。

QTP推出对象库,就是为了解决这些问题的!
>>QTP对象库确实有它方便的地方,比如是基于对象的使用,当你输入vbwindow(后,就需要列出当前Action中你可以使用的vbwindow对象,而描述性编程就不能,你需要记住可以使用的对象。
所以要尽量多用对象库,少用描述性。
>>如果是针对软件测试这个目标,使用什么方式不是最重要的,关键在于你是否掌握了,能否熟悉的运用,并达成的你的目标,结果才是最重要的。
作者: yabest    时间: 2007-8-13 13:08
原帖由 loho1968 于 2007-8-13 12:13 发表
[quote]原帖由 yabest 于 2007-8-11 17:00 发表


你可能对象库用的不熟吧,对象库一样可以动态设置的,一样可以解决问题!

只要动态设置一下对象属性
...


总结下描述性脚本的三大罪状:
一是写脚本效率底下容易出错。
>>这个不对,如果程序结构设计好,描述性编程中对对象的处理部分一样可以封装。

  我说的是,如果不用对象库,你就不能用录制的方式生成脚本,只能自己一个字母一个字母的写脚本,效率低下,容易出错!
  用对象库,QTP就可以帮你用录制的方式自动的生成大部分的脚本,你只要少量修改就可以了,何必自己一个字母一个字母的写呢!
  你这是在做测试,要讲究效率,不要搞得为了测试一个软件系统,却要先编程开发一个新的软件系统,得不偿失。


二是脚本繁杂难看,充斥着复杂的属性描述。不像对象库方式那样,把复杂的属性描述封装在对象库里,只留给脚本一个清晰易读的对象名。
>>描述性编程一样的可以只留给脚本一个清晰易读的对象名,对象库的对象要清晰易读还得在识别后手工修改。

  只留给脚本一个清晰易读的对象名?那对象描述跑哪里去了?不在对象库里,就是在脚本里了!
  嗯,你可以把对象描述存在变量里!那天啊,一个软件系统里有多少个对象啊,你要定义多少个变量啊,你记得住嘛,不是很容易写错吗?
  而且有些对象需要用几个属性才能标识呢,你还要定义好几个变量呢!
  我想一想都要晕倒了!  



三是对象描述分散重复,每处脚本都要重复描述一遍对象。对象一变,天才知道要修改多少处的脚本,要修改哪些行的脚本。
>>描述性编程一样的可以集中处理生成需要使用测试对象,如果要修改,同样只修改一个地方。描述性编程一样可以使用SetTOProperty。

  “集中处理生成需要使用测试对象”,呵呵,怎么看你这样子是想自己做一个对象库!那何必呢?QTP都给你做好了,而且是集成的,更方便更好用。
  你自己做的话,要手工描述一遍所有的对象,那得费多大的功夫啊!
  人家QTP的对象库可以在录制中自动建立的,最多只要改下对象名,多轻松啊。
  而且一个系统里有多少个对象啊,你集中生成这么多个对象变量啊,你记得住吗?!

  

QTP推出对象库,就是为了解决这些问题的!
>>QTP对象库确实有它方便的地方,比如是基于对象的使用,当你输入vbwindow(后,就需要列出当前Action中你可以使用的vbwindow对象,而描述性编程就不能,你需要记住可以使用的对象。
所以要尽量多用对象库,少用描述性。
>>如果是针对软件测试这个目标,使用什么方式不是最重要的,关键在于你是否掌握了,能否熟悉的运用,并达成的你的目标,结果才是最重要的。
  
又来了,和稀泥。不同方式,虽然一样可以达到目的,但是要付出的成本和代价可能相差很远的!
  所以使用什么方式是非常重要的,关系到事半功倍,还是事倍功半的差别!



  说来说去,很简单的事情,对象库又好用又方便,描述性又难用又麻烦。搞不懂为什么一心要用描述性呢?!(少量使用我是不反对的)
作者: danmy    时间: 2007-8-13 13:09
原帖由 yabest 于 2007-8-11 17:00 发表


你可能对象库用的不熟吧,对象库一样可以动态设置的,一样可以解决问题!

只要动态设置一下对象属性
Link("职员").SetTOProperty("text", datatable.value("职员",dtLocalSheet))

然后就可以反复的使 ...

受教~~ 不过本人还是对对象库持保留意见

就说这个例子吧
其实
Link("职员").SetTOProperty("text", datatable.value("职员",dtLocalSheet))
Link("职员").click

和Link("text:="& datatable.value("职员",dtLocalSheet)).click 的作用是一样的,还得加上录制,录制后在对象库里修改对象的工作

再说说我用对象库时碰到的问题
一个弹出对话框的对象,这个对话框的上层可能时frame,也可能时网页对话框(识别为window)下的page,但是这个对话框基本是一样的,我写个函数获取这个对话框的提示信息.
对这个弹出框用描述性编程的话

set myFrame = Page().frame()
myframe.getpopmsg()

set myframe = page().Dialog().page.().frame()
myframe.getpopmsg()

是可以的, 但是用对象库录制的话, 这个弹出对话框所指的对象就必须在这frame和网页对话框对象下层都存在,否则myframe.getpopmsg()就出现对象找不到,这个函数复用性就很差了

所以还是怎么最方便怎么用,我无意完全否定对象库的好处,但是描述性编程确实也有无法替代的优点
作者: loho1968    时间: 2007-8-13 13:26
原帖由 danmy 于 2007-8-13 13:09 发表

受教~~ 不过本人还是对对象库持保留意见

就说这个例子吧
其实
Link("职员").SetTOProperty("text", datatable.value("职员",dtLocalSheet))
Link("职员").click

和Link("text:="& datatable.value(" ...

是可以的, 但是用对象库录制的话, 这个弹出对话框所指的对象就必须在这frame和网页对话框对象下层都存在,否则myframe.getpopmsg()就出现对象找不到,这个函数复用性就很差了

>>录制的对象库中,对象的树形型结束是可以调整的。你可以把对话框从某一个网页对象下面独立出来。就如同windows程序中大全用的dialog对象一样,完全可以单独独立成一个对象(当然可以包括这个dialog中所包括的对象)。当然,你不能把一个“按钮”独立出来,这样就无法识别了(windows的程序必须基于窗口,网页的程序,我没有测试过,不太了解对象的最小单位应该是什么?),大家可以试试
vbwindow("A).vbwindow("b).vbbutoon("c").active==vbwindow("b").vbbutoon("c").active
作者: yabest    时间: 2007-8-13 13:35
原帖由 danmy 于 2007-8-13 13:09 发表

受教~~ 不过本人还是对对象库持保留意见

就说这个例子吧
其实
Link("职员").SetTOProperty("text", datatable.value("职员",dtLocalSheet))
Link("职员").click

和Link("text:="& datatable.value(" ...


界面的操作对象大部分是可以静态识别的,需要动态识别的还是少数的!这少数,可以用SetTOProperty实现的。不要因小失大,舍弃对象库。
录制是对象库方式的优点,一系列操作下来,你手工写脚本要写的半死,录制一下子就生成了大量的脚本了,只要稍做修改即可。两者效率可是天差之别啊!
对象库起名字是有好处的,脚本清晰好看。描述性脚本里没有给对象另外起名,实在是太难看了。如果另设对象变量,那就复杂化了,脚本一样难看。

象你说的对话框的问题,我也是一样写个通用函数,用描述性编程来实现的。
我测试的几个系统,包括Web、Java的,都有类似的对话框处理函数,这是属于我说的,特殊情况,少量使用。
不要因对话框这样的特殊问题而因噎废食,舍弃对象库。QTP支持描述性,只是将其作为对象库的补充嘛!

[ 本帖最后由 yabest 于 2007-8-13 13:38 编辑 ]
作者: loho1968    时间: 2007-8-13 13:51
原帖由 yabest 于 2007-8-13 13:35 发表


界面的操作对象大部分是可以静态识别的,需要动态识别的还是少数的!这少数,可以用SetTOProperty实现的。不要因小失大,舍弃对象库。
录制是对象库方式的优点,一系列操作下来,你手工写脚本要写的半死, ...



象你说的对话框的问题,我也是一样写个通用函数,用描述性编程来实现的。
我测试的几个系统,包括Web、Java的,都有类似的对话框处理函数,这是属于我说的,特殊情况,少量使用。
不要因对话框这样的特殊问题而因噎废食,舍弃对象库。QTP支持描述性,只是将其作为对象库的补充嘛!
>>对的,具体问题具体分析。但是为什么对话框你不使用对象库,而使用一个通用的函数呢?从理论上来讲,描述性编程的,对象库都可以实现呀(包括动态产生的对象)。
作者: yabest    时间: 2007-8-13 14:41
原帖由 loho1968 于 2007-8-13 13:51 发表
>>对的,具体问题具体分析。但是为什么对话框你不使用对象库,而使用一个通用的函数呢?从理论上来讲,描述性编程的,对象库都可以实现呀(包括动态产生的对象)。


用对象库,一样可以实现,但是麻烦点。
因为对话框不好录制,有些等待对话框一闪而过,你根本抓不到,另外一些错误对话框,你也不知道什么时候会出现!
不好录制的对象,那就只能用描述性编程了,总不能为了抓这个等待对话框,反复抓上半天吧,那还不让人笑死了!
作者: mstiunicon    时间: 2007-8-14 08:55
无聊,yabest觉得讨论这个话题很有趣么?
这两种方式你分别研究3个月了,再来说吧。

本贴终结到66楼。

66楼的是猪,白痴!
作者: EdmondYe    时间: 2007-8-14 09:00
原帖由 ppent 于 2007-8-10 22:33 发表
对象库和描述性编程都是基于对象识别原理上的应用,两者在识别原理上是一致的,唯一的差别是对象库比描述性的对象识别多了一层封装,正如高级语言对于汇编语言。也正是如此,所以在使用上有信手拈来的感觉。
在 ...

同意这个的观点,我们也做过在Robot的基础上的一层封装,做成关键字形式,就是safs(open source),看你们争的真有意思,根据公司项目的需求来决定在什么地方使用对象库还是描述性语言,最终还是一样的.好用了,当然被屏蔽的东西就多些,灵活了,自然描写起来就麻烦些.有什么好争的呀.受不了了.潜水多日,看到这些忍不住上来说两句.
作者: bobile    时间: 2007-8-14 09:09
看对象仓库就可以了,网上也有很多的例子呀google下
作者: bobile    时间: 2007-8-14 09:10
实在不行的话,发邮件给我,我给你传一个过来.zhongbo45@sina.com
作者: wtucel    时间: 2007-8-14 09:40
原帖由 mstiunicon 于 2007-8-14 08:55 发表
无聊,yabest觉得讨论这个话题很有趣么?
这两种方式你分别研究3个月了,再来说吧。

本贴终结到66楼。

66楼的是猪,白痴!


哈哈,确实是很无聊的讨论,感觉就像小孩子在争论孙悟空和奥特曼谁厉害一样.

yabest也确实有点偏激了.人家说"尽量多用对象库,少用描述性编程"的时候,你说人家是"和稀泥"的说法

但是上面你又自己说特殊情况下还是要用描述性编程,这不是搬石头砸自己的脚么?

反正我的做法就是先录制了,再回放,回放不过去的改描述性编程就完了
作者: yabest    时间: 2007-8-14 10:55
原帖由 wtucel 于 2007-8-14 09:40 发表
...
yabest也确实有点偏激了.人家说"尽量多用对象库,少用描述性编程"的时候,你说人家是"和稀泥"的说法
但是上面你又自己说特殊情况下还是要用描述性编程,这不是搬石头砸自己的脚么?
...


晕死,"尽量多用对象库,少用描述性编程"这话是我说的!
loho1968的帖子里,加">>"才是他自己的,不加是引用别人的,跟一般的用法相反了哈。

原帖由 yabest 于 2007-8-13 13:08 发表

所以要尽量多用对象库,少用描述性。
>>如果是针对软件测试这个目标,使用什么方式不是最重要的,关键在于你是否掌握了,能否熟悉的运用,并达成的你的目标,结果才是最重要的。
  
又来了,和稀泥。不同方式,虽然一样可以达到目的,但是要付出的成本和代价可能相差很远的!


作者: qiubole    时间: 2007-8-14 10:59
描述性编程需要一个非常不错的框架,否则就会被搞得很被动,但想要找到或设计一个支持通用的系统的框架,估计这个工作量很大,如果不运用框架,做出来的东西很不好理解。而且费时确实稍长

对于大多数的应用来说,对象库就比较不错了,我甚至怀疑QTP使用对象库本身就是一套应用描述性编程的框架应用。

如果很复杂,非常复杂,或者说乱七八糟的系统,确实用描述性编程更好一点,但是,这样的系统,难道就不能改一改?

如果你一直用对象库,可以用一段时间来了解了解描述性编程,如果你一直用描述性编程,建议你从头开始用用对象库。
这样,可能大家会发现,原来事情本来就很简单,是我们自己把它弄复杂了
作者: yabest    时间: 2007-8-14 11:00
原帖由 mstiunicon 于 2007-8-14 08:55 发表
无聊,yabest觉得讨论这个话题很有趣么?
这两种方式你分别研究3个月了,再来说吧。

这两种方式我都用了好多年了,识别对象的原理是一样的,只是形式上的差别而已,没啥好神秘的!
对描述性,我深知其弊端,所以虽然也会用,但尽量少用,有节制的用.

本贴终结到66楼。
66楼的是猪,白痴!


这边论坛是用帖子的形式,帖子也有标题的,你不喜欢不感兴趣,就别点进来了,又没人强迫你进来!
反而是你想强迫别人,不许别人讨论,还用"是猪,白痴"这样的用语,真没素质!

[ 本帖最后由 yabest 于 2007-8-14 23:06 编辑 ]
作者: auqdppyv    时间: 2007-8-14 21:49
原帖由 danmy 于 2007-8-13 13:09 发表

受教~~ 不过本人还是对对象库持保留意见

就说这个例子吧
其实
Link("职员").SetTOProperty("text", datatable.value("职员",dtLocalSheet))
Link("职员").click

和Link("text:="& datatable.value(" ...



这哥们正解
我来个例子,一个工作流系统,发起工作流会生成一个以日期后加6位数字的ID
那么下一执行者,要点页面上的列表中的这个ID号的Link进入执行他的操作,(工作任务列表的排序为任务流转时间先后顺序)
有几个问题:
要是不用描述性,你怎么知道你发起的这个工作流ID是多少,
你知道到下一个执行者的界面中列表在哪个位置,难道就人一个测试人员在发起工作流?

[ 本帖最后由 auqdppyv 于 2007-8-14 21:50 编辑 ]
作者: yabest    时间: 2007-8-14 23:44
原帖由 auqdppyv 于 2007-8-14 21:49 发表



这哥们正解
我来个例子,一个工作流系统,发起工作流会生成一个以日期后加6位数字的ID
那么下一执行者,要点页面上的列表中的这个ID号的Link进入执行他的操作,(工作任务列表的排序为任务流转时间先后顺序) ...


你这样说不清楚,你就先用描述性脚本写出来吧,我用对象库脚本实现给你看!
除了不确定的对象,或者很难抓取的对象,对象库都能实现描述性的功能,只是把对象描述写在象库或脚本里的差别而已。

[ 本帖最后由 yabest 于 2007-8-14 23:48 编辑 ]
作者: loho1968    时间: 2007-8-15 09:06
原帖由 yabest 于 2007-8-14 23:44 发表


你这样说不清楚,你就先用描述性脚本写出来吧,我用对象库脚本实现给你看!
除了不确定的对象,或者很难抓取的对象,对象库都能实现描述性的功能,只是把对象描述写在象库或脚本里的差别而已。



SetTOProperty+正则表达式,就可以代替描述性编程,因为只要你能描述,就可以SetTOProperty。
作者: auqdppyv    时间: 2007-8-15 13:25
标题: 试试看
Function SearchList ( )

        Dim i,j,tempText,text,referOperation
        listOperation = DataTable("工作列表操作",dtGlobalSheet)
       
        '取要定位的表格行数

        rows=Browser("Browser").Page("Page").WebTable("innertext:="&innertext_v,"index:="&index).RowCount
                '循环查找
        For i=1 to rows
                tempText= Browser("Browser").Page("Page").WebTable("innertext:="&innertext_v,"index:="&index).GetCellData(i,3)
                If   StrComp(tempText,operation_number) = 0 Then
                        Browser("Browser").Page("Page").WebTable("innertext:="&innertext_v,"index:="&index).ChildItem(i,columns,"WebList", 0).Select listOperation
                        Browser("Browser").Page("Page").Sync
                        ExitAction
                End If
                If i=rows  Then
                        Reporter.ReportEvent micFail,"工作列表搜索","搜索的目标工作记录不存在!"
                End If
        Next

End Function
作者: yabest    时间: 2007-8-15 16:17
原帖由 auqdppyv 于 2007-8-15 13:25 发表
Function SearchList ( )

        Dim i,j,tempText,text,referOperation
        listOperation = DataTable("工作列表操作",dtGlobalSheet)
       
        '取要定位的表格行数

        rows=Browser("Browser").Page("Page").WebTab ...



只要将WebTable添加进对象库,并起名WorkList,设置innertext和index两个特征属性。
你看这样子用对象库,脚本是不是更清晰更好看!

Function SearchList ( )

        Dim i,j,tempText,text,referOperation
        listOperation = DataTable("工作列表操作",dtGlobalSheet)
      
        '取要定位的表格行数

        Browser("Browser").Page("Page").WebTable("WorkList").SetTOProperty("innertext", innertext_v)
        Browser("Browser").Page("Page").WebTable("WorkList").SetTOProperty("index", index)

        rows=Browser("Browser").Page("Page").WebTable("WorkList").RowCount
                '循环查找
        For i=1 to rows
                tempText= Browser("Browser").Page("Page").WebTable("WorkList").GetCellData(i,3)
                If   StrComp(tempText,operation_number) = 0 Then
                        Browser("Browser").Page("Page").WebTable("WorkList").ChildItem(i,columns,"WebList", 0).Select listOperation
                        Browser("Browser").Page("Page").Sync
                        ExitAction
                End If
                If i=rows  Then
                        Reporter.ReportEvent micFail,"工作列表搜索","搜索的目标工作记录不存在!"
                End If
        Next

End Function
作者: auqdppyv    时间: 2007-8-15 16:49
Browser("Browser").Page("Page").WebTable("WorkList").SetTOProperty("innertext", innertext_v)
Browser("Browser").Page("Page").WebTable("WorkList").SetTOProperty("index", index)

脱裤子的技术果真高
作者: walker1020    时间: 2007-8-15 23:51
讨论非常深入,值得学习
作者: jackymail    时间: 2007-8-16 15:13
原帖由 auqdppyv 于 2007-8-15 16:49 发表
Browser("Browser").Page("Page").WebTable("WorkList").SetTOProperty("innertext", innertext_v)
Browser("Browser").Page("Page").WebTable("WorkList").SetTOProperty("index", index)

脱裤子的技术果真高

这个问题谈不上脱裤子,yabest的方法类似于
set EditDesc = Description.Create()

EditDesc("Name").Value = "userName"

EditDesc("Index").Value = "0"

Browser("Welcome: Mercury").Page("Welcome: Mercury").WebEdit(EditDesc).Set "MyName"
一次性声明描述性编程中使用的对象,在多次使用同一个对象的时候,节省了代码,这是任何编程语言都提倡的。
学习。支持。

ps: 最近连日收到鸡蛋,我都有些日子不来了,怎么还给我扔鸡蛋阿,现在鸡蛋那么贵,都省省不行啊!!
ps2: 我说怎么找不到自己的帖子了呢,原来到精华区了阿。。。嘎嘎

[ 本帖最后由 jackymail 于 2007-8-16 15:26 编辑 ]
作者: yabest    时间: 2007-8-17 01:27
精华区好虽好,帖子质量高,但是人气没外面的旺啊,很多人不习惯进精华区的!
作者: endales    时间: 2007-8-21 10:21
不错不错,比较赞成yabest
作者: lecher    时间: 2007-9-4 11:33
法国改革
作者: xiaofeng_zou    时间: 2007-9-5 23:48
太精彩了sdlkfj3
作者: yqx    时间: 2007-9-11 17:37
对象库和描述性编程配合使用,在对你要进行测试的测试项进行脚本设计的时候,最好优先使用对象库录制,碰到识别困难的控件可以使用描述性编程来找到最容易标识对象控件的元素来写脚本,总之达到了对测试点很好的测试就可以了。。
作者: hgl    时间: 2007-10-9 17:19
看完了,受益了,顶一下
作者: fish_yy    时间: 2007-10-21 22:09

作者: hsjzfling    时间: 2007-10-25 21:28
唉,这么精彩的帖子今天才发现,看来要多来精华转转~

Browser("Browser").Page("Page").WebTable("WorkList").SetTOProperty("innertext", innertext_v)
Browser("Browser").Page("Page").WebTable("WorkList").SetTOProperty("index", index)
这两句话其实都可以省掉的,只要在对象库中将innertext和index两个属性点#参数化就好了,可以根据需要参数化为正则表达式或者某个环境变量,工作量差不多,不过感觉更不容易出错~

还是支持Yabest的观点的,对象库毕竟是已经封装好的东西,使用起来很方便,而且就效率来说使用对象库>=使用描述性编程,对新手来说很容易让描述性编程代码的执行效率非常低下,记得两个月前我写了个完全用描述性编程的脚本,输出100个链接花了10m+(那时候刚学不到1个月,还很生疏,vbs以前也没接触过,只能硬来。。。),后来改为用对象库,效率高了5倍多。。。当然现在再用描述性编程写个同样功能的脚本肯定不会再执行那么长时间了~

以前刚学了描述性编程,就想把所有的脚本都改写为充满描述性语言的脚本,确实费了很多功夫,唯一达到的效果就是脱离了对象库,现在想想感觉那时就像是写字时明明有手闲着不用却非要用脚。。。

现在用描述性编程最多的地方就是使用ChildObjects方法,其它地方几乎都不太用了~但依旧不可忽视它存在的价值,很多时候使用对象库能办到的,描述性编程也能以差不多的效率办到,偶尔甚至会更方便~(项目中全是这种'偶尔'情况的除外~~)

以对象库为主,必要的时候以描述性编程为辅,感觉这样运用到项目之中应该适合多数人吧~
作者: 木卫十二    时间: 2007-10-26 10:01
同意楼上的!
说实在的我也不想使用对象库,但它的确好用
不想使用它是因为程序员的思维,总想一切用代码来做,不喜欢用鼠标操作呵呵
作者: pxwcypx    时间: 2007-10-30 13:42
hsjzfing虽然你不是什么版主,但每次的回帖都能让人很臣服的确佩服,跟你后面也学了不少东西,哈哈大家就别争论了还是帮我看看我发表的话题吧半天都没人回复:
http://bbs.51testing.com/thread-95081-1-1.html
作者: lantianwei    时间: 2007-10-30 20:00
个人观点:
对象库和描述性编程没有好坏之分,只有是否合适之分.我个人认为对象库是适合大多数情况的,也就是说应该以对象库为主.比方说我曾经做过一个项目,在一个窗体中有87个编辑框,并且要一一验证是否可编辑,如果是把所有的对象都加入到对象库中显然不太好,所以这时用描述性编程就会比较好,

[ 本帖最后由 lantianwei 于 2007-10-31 10:10 编辑 ]
作者: lantianwei    时间: 2007-10-30 20:03
接上(按错了一个键没写完)
而且我只用一句话就可以代替这87个对象,效率很高吧!但描述性编程只适合少数情况下,并且在这些少数情况下才能发挥最大的效果.
作者: yabest    时间: 2007-10-30 20:41
原帖由 lantianwei 于 2007-10-30 20:03 发表
接上(按错了一个键没写完)
。。。


想多发一个帖子,多骗点积分就直说嘛!

还找这么烂的借口,说什么按错键了,按错键你可以再编辑帖子继续写啊!
作者: hsjzfling    时间: 2007-10-31 02:11
51testing测试培训中7天的课是QTP(其中不少时间其实是在介绍vbs),其中就有介绍到参数化能应用到的几处地方,而其中之一就是对象库中对象属性的值~~~(至少songfun老大的课是讲到了的)

而QTP提供的这个参数化功能似乎被大多数人忽视掉了,于是很多时候就产生了描述性编程能轻易完成使用对象库很麻烦才能完成的需求的错觉~

并不是使用对象库做不到,而是大多数人没认识到如何简便的使用对象库去做到罢了~
少数情况下描述性编程的优势是存在的,只是不在于91-92楼所举的例子~
作者: lantianwei    时间: 2007-12-5 20:36
最近做了一个QTP的项目,因为QTP9.2没有共享对象库,所以自己也懒的一个个添对象到对象仓库中去,于是就用了描述性编程,刚开始觉得挺方便的,就用描述性编程做了一个模块,但到后期发现问题来了,因为项目还不稳定,老是改UI对象,而每次跑时总要再到脚本里面去改,对于我来说可能修改起来还算方便,因为是我开发的,对脚本都比较熟悉,而我的自动化脚本以后是用来给手工测试人员来用的啊,他们会知道在哪里修改吗?我想他们即使可以找到,也要花很大的力气.对于后期项目的维护,描述性编程真是太麻烦了!我不知道是我的描述性编程用的不对还是怎么的,我对描述性编程真的有点失望,如果哪位大哥大姐可以告诉我如何可以对描述性编程进行很好的维护,小弟感激万分!不过暂时我还是用对象库吧.
作者: yabest    时间: 2007-12-6 06:55
呵呵,明白QTP搞对象库的意义了吧,集中、统一、清晰简洁的管理对象描述,避免重复、冗余、混乱的在脚本里写对象描述!

其实QTP9.x也是支持共享对象库的,但是比QTP8.x退步的是,它不支持直接录制添加对象到共享对象库(手工抓取添加的除外),而只能直接录制添加对象到Action对象库。

这有个变通的方法,就是只在一个固定的Main Action里录制、添加脚本,然后将Main Action的对象库export成共享对象库供各个Action使用,将Main Action里的脚本分散复制到各个Action里,各个Action只用来运行,不在里面做涉及对象库变化的修改。只是这样麻烦很多。

目前我们还是用QTP8.2!
作者: badguy    时间: 2007-12-18 16:05
用了一阵对象库,总觉得多了个对象库以后维护会比较麻烦
所以后来又用描述性编程.效率的确没有以前高了
这篇帖子也让我发现自己认识的错误
不过还是先用用看吧,如果维护起来真的很麻烦那就再修改了
作者: mfjin    时间: 2008-3-5 16:49
,今天才看到这么好的帖子阿。
作者: tiger_86    时间: 2008-3-6 16:05
不管怎么样   两者 结合起来是很不错的! 很适合我们这样的新手的!
等以后有能力了!再好好的说吧!
作者: lilysun0411    时间: 2008-3-7 10:39
好帖!都是高手实践经验的总结,学了不少.
我还是比较喜欢用对象库




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2