51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 8083|回复: 26
打印 上一主题 下一主题

[讨论] 做了一段时间QTP, 发现趋向于"尽可能少用对象库", 不知道大家以为然否

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2012-1-17 21:26:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
做了QTP快两年了, 主要做了两套基于QTP测试框架, 分别是Web和Eclipse平台的应用.  不知不觉的, 发现自己在朝"尽可能少用对象库"这样的一个方向前进.

因为自己以前的自动化测试项目都是比较"低级"的, 没有基于商业的测试工具, 而是用Java, Ruby, Shell, 等等这样语言构建起来的. 所以骨子里有"自己控制一切"的倾向. 对于QTP本身, 我还只是半瓶子水, 所以我不敢确定这是否是一条正确的道路? 不知道各位资深的QTP测试开发人员是否同意我的观点?

突然有这样一个反思, 是因为前几天, 我在试图实现这样这样的一些函数: 通过函数调用(不用访问对象库), 就能在当前window把一些GUI元素找出来, 比如Button, Edit, Table, List, 等等.

  1. Function FindButton(strText)
  2.          '找出当前的window, 逻辑大概是这样
  3.          Set cw = Nothing
  4.          if 有popup window Then
  5.                set cw = popupWindow
  6.           else
  7.                Set cw = mainWindow
  8.          End If
  9.          
  10.          '用 DP找出此button
  11.          set desc = Description.create
  12.          desc("to_class").value = "Button"
  13.          desc("index").value = 0
  14.          desc("attached text").value = strText
  15.          Set ele = cw.Button(desc)
  16.         
  17.         ' 如果不能找到, 那么引用对象库
  18.          if Not ele.Exist(0) Then
  19.                Set ele = win.Button(strText)
  20.          End if
  21.         
  22.           Set FindButton = ele
  23. End Function
复制代码
为什么要实现这样一套函数库是因为 在写 testcase script的时候, 常常不得不中断下来, 把对象加入对象库. 而这样的"中断" 让我很恼火, 因为它破坏了写代码的流畅性.

如果有比较完善的这样的"找出对象"的函数库, 那么在写testcase script的时候, 几乎不会为录制"对象"而中断, 这样就更像我用Java, Ruby, Shell等语言开发的状态.

这种方法的缺点也很明显. 因为QTP对象库提供了一层中间层, 所以GUI元素发生了改变, 比如改名, 那么仅仅需要修改对象库里对象的定义, 而不需要修改任何引用它的code.

想听听大家的意见.
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

2#
发表于 2012-1-18 14:24:24 | 只看该作者
为何不直接用描述性编程?

以前喜欢用对象库,后来也淡化了,改成描述性为主,对象库为辅。

赞成 <"自己控制一切"的倾向>,所以会尽量用代码,而不用QTP自带的检查点之类。
回复 支持 反对

使用道具 举报

该用户从未签到

3#
 楼主| 发表于 2012-1-18 14:53:08 | 只看该作者
回复 2# 木卫十二



"不直接用DP?" 你是指直接用 win.Button("attached text:="&xxx, ...)这样的形式吗?
主要有下面三点考虑
1) FindButton函数把 查找当前window的逻辑包含进去了
这样调用FindButton函数的时候不用考虑是在main window还是popup window

2)FindButton(text)里的产生text可以有更丰富的含义
在测试web的框架里, 有一套 灵活且强大 的机制来通过各种途径查找对象, 以先后为序
     1. label名字(找到label, 然后通过label的for属性找到对应控件的id)
     2. button控件的id
     3. button控件name
     4. 对象库里对象的名字 (实在没有办法的情况下, 找对象库里的对象)
如果直接用DP是不能达到这样效果的

3) 更简洁的代码
对比

  1. FButton(xxx)
  2. win.Button("attached text:="&xxx, ...)
复制代码
我现在也描述性为主, 对象库为辅的方式来访问对象. 对象库主要存放顶级的window和比较特殊, 通过已有机制不能够找出的 GUI元素.

说到检查点, 我实现了完整的一套AssertXXX函数(参照Junit), QTP提供的Checkpoint很少用.
回复 支持 反对

使用道具 举报

该用户从未签到

4#
发表于 2012-1-18 16:45:01 | 只看该作者
对象库是QTP的一个很精髓的东西,这个建议用
回复 支持 反对

使用道具 举报

  • TA的每日心情
    郁闷
    2014-12-17 09:47
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]测试小兵

    5#
    发表于 2012-1-18 17:12:34 | 只看该作者
    哎呀!无论描述性编程还是对象库只是个描述方式而已。
    得看具体情况采用哪种方式!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2018-9-27 10:05
  • 签到天数: 36 天

    连续签到: 1 天

    [LV.5]测试团长

    6#
    发表于 2012-1-18 17:39:25 | 只看该作者
    我有时候写着写着也会慢慢的向脱离对象库走,也是觉得添加对象比较麻烦。尤其有时候给客户的是特别定制的版本的时候,有些名词改了几个字,但脚本就回放不了了,还得去对象库找到底哪个对象改变了。可能是不太知道如何更好地管理对象库吧。
    继续观望,看看有什么高手有自己的管理方式或解决方法
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    7#
     楼主| 发表于 2012-1-18 19:57:06 | 只看该作者
    回复 4# lixudong3032

    对象库提供了一层对GUI元素的封装, 理论上可以做到 GUI元素变化, code不用修改的效果。

    比如在一个html page中, 有一个edit input, 其name属性的值为“type”, 在对象库里通过”name=type“来识别. 在新版本中, 其name值发生了变化, 比如改变为“name=category”.  这时通过修改其在对象库里的定义就可以了, code不用做任何修改。

    我推测这就是对象库最核心的价值。 ”通过对象库来隔离GUI元素的变化“。 对于比较依赖于record的开发模式, 这种方法是比较有效的。 因为对"对象的引用”在很多地方都会出现, 通过“对象库”这样一个中间层, 即使GUI元素的改变, 引用对象的代码却不用改变, 显然可以降低测试套件维护的成本。

    如果换一种思路, ”通过函数来隔离GUI元素的变化“。 通过大量的细粒度的函数来对 产品的 功能逻辑或者页面逻辑 进行封装。 这样就可能出现, 在极端的情况, 所有对GUI元素的访问都是通过一个函数或者有限的几个函数调用进行的。 这样即使GUI元素出现了变化, 也只需要修改几个函数就可以了。 调用此函数的任何testcase script不用修改。在这种开发方法下, 同样达到了 “隔离对象改变”, 却不依赖于对象库。

    我个人的经验, 对于通常的中型和大型的QTP项目, 基于record的开发模式不太合适。我倾向于开发大量的函数来封装 业务操作逻辑或者页面操作逻辑。 所以不知不觉的就越来越远离对象库。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    8#
    发表于 2012-1-19 09:26:35 | 只看该作者
    无论是不是需要用对象库,其实这只是一个思想进步的过程

    开始依赖OP,好简单啊,啥都可以自动搞定,动动鼠标就行了
    然后开始依赖DP,完全看自己,清清楚楚,了然于胸
    最后还是走回OP,既然最终还是要自己去简化DP,还不如用QTP自带的OP,都帮你该考虑的考虑到了,何必自己给自己找麻烦呢?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2012-1-19 09:28:52 | 只看该作者
    让QTP做它擅长的工作,不用对象库的QTP,好像是让研究生卖猪肉,虽然效果未必差,但是不是主流。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2012-1-19 09:29:16 | 只看该作者
    云层兄的想法跟我一致,OP也可以玩得很简单,自动化关键在于多用脑子去思考,用活了,你就会发现OP简单的多,这个是QTP的精华中的精华,我的理念是OP为主,DP为辅
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    11#
    发表于 2012-1-19 12:07:47 | 只看该作者
    这需要个过程的,一般都是OR->DP->? 只有对OR DP都有足够的认识的基础上才能够根据实际情况作出最合适的选择,本人也是自4年前开始就一直坚定拥护OR为主的
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    12#
     楼主| 发表于 2012-1-19 14:05:38 | 只看该作者
    本帖最后由 lifr 于 2012-1-19 14:08 编辑

    回复 8# 云层

    你指的麻烦是 "写复杂的description来定位对象"? 我想你误解了我的意思, 这应该是因为我之前的表达并不精确, 我再重新明确一下.

    我赞同你的观点. 对于需要比较复杂的条件才能定位的GUI元素, 用对象库更有效率.   所以, 在 FindButton函数逻辑里, 在用DP查找失败的情况下, 还会通过对象库来查找.

    通过DP就能找到的GUI元素, 恰恰不是这种"需要复杂条件才能"的元素, 反而是有规律的, 简单的方式就可以定位的元素. 这样的所谓的简单的GUI元素, 我个人经验是占总量的80%以上.

    所以, 重新回到以前的问题, 对于这一些"简单的GUI元素", 是通过对象库来引用有效率, 还是写一些像FindButton这样的函数来引用比较有效率? 这里的效率既包括开发效率, 也包括后期维护的效率.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
     楼主| 发表于 2012-1-19 14:11:21 | 只看该作者
    回复 10# yujie6832

    能否详细阐述"OP简单的多", 或者举例一二.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    14#
     楼主| 发表于 2012-1-19 14:25:46 | 只看该作者
    本帖最后由 lifr 于 2012-1-19 14:27 编辑

    回复 9# davy_chen

    我想是否我真的很"非主流"的使用QTP, 下面是我做QTP项目的特点.

    1) 重度的 函数 使用者.
    关于函数库的设计, 我也许会另开一贴讨论. 我的项目中确实使用了大量的函数.
    2) 绝不使用ReusableAction
    3) 从不使用Keywork View
    3) 尽可能少用Checkpoint, 而使用AssertXXX函数
    4) 尽可能少用对象库, 而使用建立在DP之上的对象识别机制
    5) 没有(机会)使用QC, 使用自己的Batchrun脚本和report生成工具(都是用VBS开发)
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    15#
    发表于 2012-1-19 16:12:59 | 只看该作者
    描述性编程,封装得好,跟用对象库效果一样的。
    封装的原则:页面上一个元素的改动,脚本也应该只改动一个地方。

    我不仅使用函数,还使用Class,总之,一个项目全是脚本+数据,编写用例的时候甚至不需要打开QTP。
    使用PsPad管理项目脚本。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    16#
     楼主| 发表于 2012-1-19 17:10:53 | 只看该作者
    回复 15# 木卫十二

    看来你更"严重". . 我在QTP的IDE里面写testcase script. 用vim写外部函数.

    有个问题? vbs支持class吗?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2018-2-28 18:04
  • 签到天数: 40 天

    连续签到: 1 天

    [LV.5]测试团长

    17#
    发表于 2012-1-19 17:18:28 | 只看该作者
    高手云集。激活一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    18#
    发表于 2012-1-19 17:50:07 | 只看该作者
    回复 16# lifr
    支持,但功能不强。参考:
    http://www.51testing.com/index.p ... wspace-itemid-64875
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    19#
    发表于 2012-1-19 20:19:54 | 只看该作者
    回复 12# lifr


        我的意思是简单的东西用OP,略微复杂的可以用DP来辅助,因为总是调整OP来配合某些对象很麻烦,特别麻烦的成套对象还是用OP好
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    20#
     楼主| 发表于 2012-1-20 08:53:35 | 只看该作者
    回复 18# 木卫十二


    恩,  知道了.  多谢.
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-24 17:02 , Processed in 0.082527 second(s), 28 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表