51Testing软件测试论坛

标题: 看Robot不顺眼,特来踢馆子 [打印本页]

作者: yabest    时间: 2006-12-14 08:48
标题: 看Robot不顺眼,特来踢馆子
呵呵,开个玩笑,希望大家不要介意.大家可以探讨一下.
  主要是用了很长时间的QTP,现在刚试用了Robot,觉得很不习惯,也很不理解.

1.为什么Robot没有QTP的对象仓库

  (1)没有对象仓库,没有在一个地方集中统一的定义对象,对象特征分散在各个脚本里,一旦对象变了,怎么维护脚本啊?
    比如说,有个按钮,文字是Cancel,现在改为Cancel Testing,那要怎么更新脚本啊?
    可能这个按钮在脚本里出现的地方就有成百上千处,而且有其它窗口的按钮也有Cancel按钮(不用修改的),不能混淆的.想起来就头大!

  (2)直接在脚本里写对象特征,写出来的脚本实在是太难看了,看惯了QTP简洁直观的脚本,实在看不下Robot的脚本格式.
    比如  Robot:  ObjectClass Click "Type=xxx;ObjectIndex=3" ,这样的脚本叫人看了,哪里知道点的是什么按钮啊,可读性太差,难以维护
    而在QTP里, 我就会定义此对象,并起个名字如 Create User, 然后脚本内容就是 Window("User Management").ObjectClass("Create User").Click, 这样的脚本看起来实在是太舒服了.

  大家都在用Robot, 是怎么看待这些问题的啊?
作者: yabest    时间: 2006-12-14 08:58
想了个法子处理这个问题

  如果是我用Robot,我就会写一个库函数,相当于QTP的仓库文件,内容就下:

  User_Win = "Caption=User Management"
  User_Create_User_Button = "Caption=Create User"
  User_Test_User_Object = "Type=xxxx;ObjectIndex=3"

  Group_Win = "Caption=Group Management"
  Group_Create_Group_Button = "Caption=Create Group"
  Group_Test_Group_Object = "Type=xxxx;ObjectIndex=3"

  然后在Robot教本里都引用这个库函数,这样写出来的脚本就如下:
  Window SetContext, User_Win , ""
  Button Click, User_Create_User_Button
  Object Click, User_Test_User_Object

  Window SetContext, Group_Win , ""
  Button Click, Group_Create_Group_Button
  Object Click, Group_Test_Group_Object

  用这个方法就能比较粗糙的解决楼上的两个问题, 可以集中的定义和维护对象, 教本也比较直观好看.  但是比起QTP的方法,还是差了不少
作者: guirongb    时间: 2006-12-14 14:51
1)没有对象仓库,没有在一个地方集中统一的定义对象,对象特征分散在各个脚本里,一旦对象变了,怎么维护脚本啊?
    比如说,有个按钮,文字是Cancel,现在改为Cancel Testing,那要怎么更新脚本啊?
    可能这个按钮在脚本里出现的地方就有成百上千处,而且有其它窗口的按钮也有Cancel按钮(不用修改的),不能混淆的.想起来就头大!

Robot 不需要对象仓库
如果,一个按钮的仅仅文字从 Cancel 改为 Cancel Testing Robot 照样能识别,不需要改任何代码
而QTP 就挂了,你需要重新维护一次对象库

(2)直接在脚本里写对象特征,写出来的脚本实在是太难看了,看惯了QTP简洁直观的脚本,实在看不下Robot的脚本格式.
    比如  Robot:  ObjectClass Click "Type=xxx;ObjectIndex=3" ,这样的脚本叫人看了,哪里知道点的是什么按钮啊,可读性太差,难以维护
    而在QTP里, 我就会定义此对象,并起个名字如 Create User, 然后脚本内容就是 Window("User Management").ObjectClass("Create User").Click, 这样的脚本看起来实在是太舒服了.

你根本就没有识别出来该控件

Robot 是复杂了点,但是相对于简单的QTP 而言,提供了更为灵活的脚本,比如 Robot 能调用WINAPI ,而QTP 只是 Vbscript
另外,楼主,你 试试看去一个 webeidt 这种控件里 模拟一个 键盘操作,比如做个下拉键的模拟,做个Enter 键的模拟,就知道QTP的缺陷了
作者: yabest    时间: 2006-12-14 16:26
标题: 没有正面回答我的问题
楼上的没有正面回答我的问题!sdlkfj2

我只是初次使用Robot,不是要全面争论谁好谁坏。这种问题不争也罢,各有长处,没有意义的。sdlkfj3

我只是很不理解Robot为什么不设置对象仓库,以及很好奇大家是怎么克服我提出的两个问题的?sdlkfj5
如果只是简单的写少量代码,那维护量很小,无所谓。
可是如果是做正式的自动化测试,要写大量的Case,那你们都是怎么维护的啊?sdlkfj4

我觉得这两个问题可是很致命的!sdlkfj8

希望大家直接回答我的问题,而不是仅仅针对我随便提出的两个例子。sdlkfj2


>Robot 不需要对象仓库
>如果,一个按钮的仅仅文字从 Cancel 改为 Cancel Testing Robot 照样能识别,不需要改任何代
>码,而QTP 就挂了,你需要重新维护一次对象库
  如果从 Cancel 改为 Delete 呢?依赖模糊匹配并不是好办法。

> 你根本就没有识别出来该控件
   随意举个例子而已
作者: 5am    时间: 2006-12-14 18:26
用RFT吧 有 Object Map

楼主用的是QTP什么版本啊?

我维护300多个脚本 也没有感觉到需要对象库 我们软件成型稳定以后不会有特别大的改动的

另外我觉得可读性还可以啊 看习惯了就很明了了
作者: yabest    时间: 2006-12-15 14:49
我用的是QTP8.2。

楼上的测试的是什么样的软件啊,真是幸福,没什么界面改动。
要知道界面改动对QTP、Robot等界面测试工具来说是很麻烦的问题啊。
自动化主要适合做回归测试,被测试的软件产品会不停的出新版本,
新版本的界面都会有变动,测试脚本也都要更新。

界面变动了,只要相应的改一下对象仓库,脚本不用改,很方便的。
作者: yabest    时间: 2006-12-15 14:52
我试着分别用QTP和Robot录制了段同样的脚本,比较了一下,感觉可读性还是差别很大啊,大家可以自己对比一下后面的脚本。

另外,对Edit、ComboBox、List等本身没有文字的对象,Robot为什么不会象QTP那样自动用其左边的标题文字来识别呢?都是用index来识别,阅读代码时怎么知道是哪个按钮啊,可读性差,又容易出错。

QTP:

JavaWindow("拓扑管理").JavaMenu("配置").JavaMenu("创建网元").Select
JavaWindow("拓扑管理").JavaDialog("添加网元").JavaEdit("网元名称(*)").Set "111"
JavaWindow("拓扑管理").JavaDialog("添加网元").JavaList("网元类型").Select "CE"
JavaWindow("拓扑管理").JavaDialog("添加网元").JavaList("软件版本").Select "222"
JavaWindow("拓扑管理").JavaDialog("添加网元").JavaList("硬件版本").Select "333"
JavaWindow("拓扑管理").JavaDialog("添加网元").JavaEdit("IP地址").Set "4"
JavaWindow("拓扑管理").JavaDialog("添加网元").JavaEdit(".").Set "5"
JavaWindow("拓扑管理").JavaDialog("添加网元").JavaEdit("._2").Set "6"
JavaWindow("拓扑管理").JavaDialog("添加网元").JavaEdit("._3").Set "7"
JavaWindow("拓扑管理").JavaDialog("添加网元").JavaEdit("SNMP端口号").Set "888"
JavaWindow("拓扑管理").JavaDialog("添加网元").JavaList("SNMP版本号").Select "v2c"
JavaWindow("拓扑管理").JavaDialog("添加网元").JavaList("getCommunity").Select "99"
JavaWindow("拓扑管理").JavaDialog("添加网元").JavaList("writeCommunity").Select "100"
JavaWindow("拓扑管理").JavaDialog("添加网元").JavaEdit("位置信息").Set "111"
JavaWindow("拓扑管理").JavaDialog("添加网元").JavaEdit("描述").Set "222"
JavaWindow("拓扑管理").JavaDialog("添加网元").JavaButton("取消").Click


Robot:

    Window SetContext, "Caption=拓扑管理", ""
    JavaMenu MakeSelection, "JavaCaption=拓扑管理\;Type=JavaMenu;Index=1;Path=配置", ""
    JavaMenu Click, "JavaCaption=拓扑管理;\;Type=JavaMenu;Index=1;Path=配置->创建网元", ""
   
    Window SetContext, "Caption=添加网元", ""

    InputKeys "111"

    Browser SetApplet,"JavaCaption=添加网元",""
    ComboBox Click, "Type=ComboBox;Index=1", ""
    ComboListBox MakeSelection, "Type=ComboListBox;Index=1", "Text=CE"

    ComboBox Left_Drag, "Type=ComboBox;Index=2", "Coords=63,8,-18,7"
    InputKeys "222"

    ComboBox Left_Drag, "Type=ComboBox;Index=3", "Coords=69,10,-43,9"
    InputKeys "333"

    EditBox DblClick, "Type=EditBox;Index=2", "Coords=31,9"
    InputKeys "4{RIGHT}{DELETE}5{RIGHT}{DELETE}6{RIGHT}{DELETE}7"

    EditBox Click, "Type=EditBox;Index=6", "Coords=51,14"
    InputKeys "{BKSP}{BKSP}{BKSP}8"

    ComboBox Click, "Type=ComboBox;Index=4", ""
    ComboListBox MakeSelection, "Type=ComboListBox;Index=4", "Text=v1"

    ComboBox Click, "Type=ComboBox;Index=5", "Coords=57,10"
    InputKeys "9"

    ComboBox Left_Drag, "Type=ComboBox;Index=6", "Coords=52,10,-32,13"
    InputKeys "10"

    EditBox Click, "Type=EditBox;Index=8", "Coords=20,7"
    InputKeys "11"

    EditBox Click, "Type=EditBox;Index=9", "Coords=35,22"
    InputKeys "12"

    PushButton Click, "Type=PushButton;Name=取消"
作者: 5am    时间: 2006-12-16 15:22
Robot当然可以用Text和caption之类的识别 在recording option里面有吧  懒得打开看了 反正是有的。。。
作者: szstc    时间: 2006-12-27 15:12
对象识别方法改了吧,ROBOT也可以使用Text和Caption的
QTP更适用于初学者,特别是对于编程没有经验的人,因此占领了很大一部分市场
但是大规模的企业还是用ROBOT多一点
测试工具是死的,但是我们能把测试做得活一点
过于在乎工具之间的差异对自动化测试的学习没有好处
作者: yabest    时间: 2006-12-29 17:08
大规模的企业用Robot,肯定会很惨!

只要有开发经验的人都知道 “重用代码、避免冗余”、“良好的命名增加可读性” 这些基本的原则,写出来的代码才有可维护性和可读性。

QTP和WinRunner有对象仓库,每个对象的特征只要在仓库里描述一次即可,不用在每处代码里都重复描述一遍,遵守了“重用代码、避免冗余”的原则,同时可以给对象起个好名字,遵守了“良好的命名增加可读性”这个原则。

Robot就破坏了这两个原则,代码里没有给对象起名字,可读性差,每个对象的特征都要在每处代码里重复描述一遍,对象有变动时都不知道要修改n处的代码,而且只有天知道n是多少,n处代码都在哪里!

因为有上述缺陷,Robot不适合做大的测试!
作者: net_ufo    时间: 2006-12-30 14:48
用熟了就惯了,刀,枪,叉,棍都可以作为武器。还有耙。。。
作者: 5am    时间: 2007-1-4 20:23
大规模的企业用Robot,肯定会很惨!

肯定不是了 我们不惨啊.....

QTP和WinRunner从什么版本开始有对象仓库的? 一开始就有 现在RFT也有啊

反正我们300多脚本维护起来也很轻松

对象有变动时都不知道要修改n处的代码,而且只有天知道n是多少,n处代码都在哪里!

我们的代码不会没事乱动的  成型的产品才能auto

另外  还是那句话 工具是死的  人是活的~
作者: wwwxzl    时间: 2007-1-21 14:18
学习
作者: imlele    时间: 2007-11-27 16:18
学习了~!
作者: andychen911    时间: 2009-3-3 20:58
标题: 请问下这个是如何用QTP录制的啊,请教下啊
JavaWindow("拓扑管理").JavaDialog("添加网元").JavaList("writeCommunity").Select "100"
JavaWindow("拓扑管理").JavaDialog("添加网元").JavaEdit("位置信息").Set "111"
JavaWindow("拓扑管理").JavaDialog("添加网元").JavaEdit("描述").Set "222"
JavaWindow("拓扑管理").JavaDialog("添加网元").JavaButton("取消").Click

请问下这个是如何用QTP录制的啊,请教下啊
作者: bb64844866    时间: 2009-3-4 09:17
标题: 发表下自己的观点!:)
个人感觉自动化测试本身的性质就是一项开发工作,因此脚本并不是录制出来的,而是编写出来的。如果单单靠录制就想实现软件测试的自动化工作,那我觉得还是不太现实的。这也应了楼上一些朋友的话,“工具是死的,人是活的”。
作者: dreamever    时间: 2009-3-4 09:29
原帖由 bb64844866 于 2009-3-4 09:17 发表
个人感觉自动化测试本身的性质就是一项开发工作,因此脚本并不是录制出来的,而是编写出来的。如果单单靠录制就想实现软件测试的自动化工作,那我觉得还是不太现实的。这也应了楼上一些朋友的话,“工具是死的,人是 ...


作者: willturner    时间: 2009-3-14 00:18
楼主,QTP其实可以抛弃对象库的,用描述性编程就可以了(Descriptive Programming),而且我觉得QTP维护对象库是件很麻烦的事情,我做的项目中,录制下来的对象库经常识别错误,所以后来被我干脆抛弃不用对象库,这样拷脚本只要拷script.mts就可以了。

Robot为什么没有对象库,我觉得从根本上说SQA这语言本身并不是面向对象的,而是面向过程的。SQA并不等同于VBscript, 因为在SQA里就不能像VBScript里面写个Class。虽然在Robot里面你可以创建对象类型Object,但是总体SQA还是基于面向过程的一个思路。所以写的测试脚本也是无法摆脱这样一个思路。 QTP相比较Robot,提供了很多可以操作的类,其实Browser, Page, WebEdit, Weblist等等都是QTP封装完以后的类,这点上相对方便一点,因为OO的思想就是让代码更接近于自然语言,容易阅读。

其实新一代的Rational Functional Tester是面向对象的,虽然我还没用过,但是应该是接近了。

我是先用了1年的Robot,后来又做了大半年的QTP,这么个体会。 说的不对的地方,请大家指正。
作者: xuefeng    时间: 2009-3-20 18:07
看了你们的话,才知道robot博大精深啊!我现在用的都是robot比较简单的功能
作者: jinlei303030    时间: 2009-9-25 00:43
恩,在各位的辩论中学到不少东西~~好~~




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