51Testing软件测试论坛

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

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 20832|回复: 88
打印 上一主题 下一主题

[讨论] 一定不要把qtp神话了,所谓的框架是忽悠人的

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2009-7-7 14:06:26 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
qtp说白了就是一个界面搜索工具+编辑界面+vb脚本,其使用过程中,受限因素特别多,光维护脚本,就需要惊人的工作量,用在那里合适?
1 界面和开发用组件基本极少改变的情况
2 反复简单的压力测试
3 被测系统构造数据每个版本基本一样
4 动态构造界面少的情况
完全基于界面的测试是不合理的,qtp仅仅适合作为测试中一个补充,投入过多精力 搞框架是得 不偿 失 的。不要完全拒绝界面测试,更不要认为它是万能的
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

89#
发表于 2009-7-28 11:15:33 | 只看该作者
补充一下,你前面三句话和第四句的前半部分我是坚决同意的
回复 支持 反对

使用道具 举报

该用户从未签到

88#
发表于 2009-7-28 11:02:27 | 只看该作者
原帖由 兰兰 于 2009-7-22 11:44 发表
部门也在评估实施自动化测试的代价以及必要性。
      就我自己最近一段时间的研究来说,此工具有一定的可用性,但是前提条件要在适合的产品类软件或者在周期交长的项目中才可以试用;
      在前期引入代价太高, ...

最后一句不太同意,就是关于反向用例维护起来代价太高的观点,纯学术讨论,没有其他意思。
无论是什么工具,自动化测试贯彻的基本思想是一样的,那就是数据驱动测试。具体到测试实现上,那就是我们要用不同的数据作为输入,驱动脚本去执行测试。举一个简单的例子,用户登录,正向用例成功登录没问题,但是反向用例登录失败时的操作会与正向用例不同,有的人因此把正向反向分别录成了两个脚本,这样维护的代价肯定就高了。而我们采用的做法是,写一个通用的方法login,然后在该方法中用if else来判断登录是否成功,这样自动化测试的数据就与相关的操作分离了。操作是可以重用的,不同的数据对应着不同的测试结果。当然这个例子很简单,它只说明了一种最常见的情况,但是我相信这个理论是通用的,就是说我们要将测试过程中不变的东西抽像出来,形成通用的方法或者组件,这样一来维护的工作量自然也就小了。
到现在我一直都有这样的结论:如果自动化测试失败了,原因会很多,但是肯定跟工具无关;同样,楼主说的反向用例的设计和维护代价高,我相信这也应该和工具是没关系的,而是和你们进行自动化测试的方式有关(直言,请见谅),不然我们可以提另外一个问题:如果你们换一套其他的工具,那么代码维护的工作量就一定能减少吗?我想答案是显而易见的
回复 支持 反对

使用道具 举报

该用户从未签到

87#
发表于 2009-7-27 15:59:11 | 只看该作者
这是一个百家争鸣的好帖
回复 支持 反对

使用道具 举报

该用户从未签到

86#
发表于 2009-7-23 09:07:08 | 只看该作者

通过QPT录入数据来练习使用QTP

QTP一直不用,最近公司要录入数据,觉得QTP不错 录入速度挺快的 就决定选他来录入
现在就是QTP不能重复选择上传的数据,这里有点麻烦
回复 支持 反对

使用道具 举报

该用户从未签到

85#
发表于 2009-7-22 14:22:02 | 只看该作者
看公司和项目的规划了,投入是不是能接受,值不值得了
回复 支持 反对

使用道具 举报

该用户从未签到

84#
发表于 2009-7-22 11:44:45 | 只看该作者
部门也在评估实施自动化测试的代价以及必要性。
      就我自己最近一段时间的研究来说,此工具有一定的可用性,但是前提条件要在适合的产品类软件或者在周期交长的项目中才可以试用;
      在前期引入代价太高,最好能成立一个专门的研究小组来研究自动化测试;
      不能指望让QTP工具来给你发现缺陷,因为他只能发现一些旧的缺陷;
      在实施自动化测试之前,要对具体的框架以及用例做很好的规划,并不一定所有类型的测试都适合QTP测试,在具体的实施过程总,一些正向类的验证可以来利用工具,但是一些反向的测试(例如校验类,流程回退类的测试等)这样的测试如果也用QTP来测试,那真的是代码设计以及维护量就不可预估了。
回复 支持 反对

使用道具 举报

该用户从未签到

83#
发表于 2009-7-21 00:05:38 | 只看该作者
xuexile
回复 支持 反对

使用道具 举报

该用户从未签到

82#
发表于 2009-7-16 11:44:15 | 只看该作者

回复 80# 的帖子

怎么感觉你这话说的不伦不类呢?
回复 支持 反对

使用道具 举报

该用户从未签到

81#
发表于 2009-7-16 11:07:37 | 只看该作者
原帖由 47385024 于 2009-7-16 11:04 发表
楼主的话 貌似太偏激了吧  即使是王麻子菜刀也不一定会适合所有的厨子  你用他来切生鱼片 效果就不一定好  对吧  呵呵  适合自己的才是最好的  一切工具皆为我所用才是正道

这个说得好,顶
回复 支持 反对

使用道具 举报

  • TA的每日心情
    开心
    2020-6-28 13:31
  • 签到天数: 4 天

    连续签到: 1 天

    [LV.2]测试排长

    80#
    发表于 2009-7-16 11:04:35 | 只看该作者
    楼主的话 貌似太偏激了吧  即使是王麻子菜刀也不一定会适合所有的厨子  你用他来切生鱼片 效果就不一定好  对吧  呵呵  适合自己的才是最好的  一切工具皆为我所用才是正道
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    79#
     楼主| 发表于 2009-7-15 14:57:28 | 只看该作者

    所谓的框架

    我们也有一个所谓的框架,通过调用qtp自动化接口执行用例 ,通过框架管理多个用例执行和参数传递,作了一个公共脚本库。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    78#
     楼主| 发表于 2009-7-15 14:52:21 | 只看该作者

    是ibm还是ibm的外包

    如果你是ibm的正式员工,而不用本公司开发的RFT作为界面 测试工具,我只能无语了.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    77#
    发表于 2009-7-14 17:33:32 | 只看该作者
    原帖由 wtucel 于 2009-7-7 20:13 发表


    楼主也在忽悠人,第一次听说用QTP做压力测试的

    其实QTP是可以做压力测试的哦 呵呵
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    76#
    发表于 2009-7-14 16:57:16 | 只看该作者
    原帖由 volvoo 于 2009-7-13 20:11 发表
    使用 IBM Rational Functional Tester(RFT)测试 Windows 应用程序: 如何构建结构良好的测试框架  

      文档选项
      打印本页

       将此页作为电子邮件发送




    级别: 中级

    陈 昱旻, 测试工程师,  ...


    是的,框架就是这些东西了,我们公司的也有自定义的testresult,不需要qtp自带的。我们也有error handling,自己写的,我们也有自己的log日志,可以轻易知道脚本运行时候的错误。

    框架就是这样一种东西而已,没有什么过多的api定义,重载,继承..........................,过于复杂的东西你也不想用,也不愿意去弄,毕竟qtp是一个回归测试工具而已。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    75#
    发表于 2009-7-14 00:17:51 | 只看该作者
    原帖由 volvoo 于 2009-7-13 20:13 发表
    请参照上篇

    如果我告诉你,我是IBM的,不知道你会怎么想?呵呵。。。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    74#
    发表于 2009-7-14 00:16:20 | 只看该作者
    原帖由 volvoo 于 2009-7-13 15:12 发表
    1 如果不算泄密 ,你可以说说你们是如何框架的
    2 你们的被 测程序界面是否经常发生变化?
    3 有多少人在维护这些脚本
    4 全部执行完毕,需要多长时间 ?是否需要人工干预?
    5 20%是需求覆盖率吗 ?还是占总 用例数 ...



    可以稍微回答一下。。。
    1. 这个无可奉告。。。
    2. 恩,作为一个十几年的产品了,一年一个release,总是难免有些变化的。花在这方面的effort是在所难免,不过,花费的时间不太多。
    3. 十个左右的automation QA在开发cases和维护脚本。
    4. 这个不太确定。根据不同的模块写的测试用例,效率是不同的,有的300个case5个小时就够,有的复杂的50个case就要12个小时。
    5. 20%是占所有用例的比例,其实可能还不到20%,总的测试用例过万是肯定的。需要做的事情还很多。

    其实无意进行争吵,只是想用平常心进行一下讨论。我们的框架也有很多的不足,还有待于改进,但是至少,它有序的支撑起了上千个case的运转。
    关于QTP这样一个产品,license卖的如此只贵,却还能每年给HP带来不小的收益,说明它的市场还是很大的。如果只是作为测试工作中的辅助工具,难免暴殄天物了。
    由于QTP本身的一些不足之处,需要设计框架对case进行管理,让开发人员更方便、高效的进行分模块的测试,个人认为也是不可缺少的。
    一个健壮的框架并不是说可以消除你在各个方面繁琐的花销,相反的,有时候也会带来一些负面影响。但是,它带来的是很好的维护性,移植性,以及在某些方面可以减少一些不必要的effort。
    框架的存在,目的是为了让QTP更好的发挥左右而已,它确实不神奇,但是很重要。

    自动化测试需要公司下大功夫投入,需要有经验的研发工程师参与,而这些确实很多公司没有办法做到的。和微软比起来,大多数公司的自动化测试还有很多的路要走。。。不要抱怨,多从自己找原因,大家一起努力吧。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    73#
     楼主| 发表于 2009-7-13 20:13:42 | 只看该作者

    再 牛,你有ibm牛吗

    请参照上篇
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    72#
     楼主| 发表于 2009-7-13 20:11:51 | 只看该作者

    http://www.ibm.com/developerworks/cn/rational/r-cn-rftwindows1/

    使用 IBM Rational Functional Tester(RFT)测试 Windows 应用程序: 如何构建结构良好的测试框架  

      文档选项
      打印本页

       将此页作为电子邮件发送




    级别: 中级

    陈 昱旻, 测试工程师, IBM
    祝 天光, 测试工程师, IBM
    张 捷, 测试工程师, IBM


    2009 年 3 月 27 日

    在进行 IBM Rational Functional Tester(RFT)自动化测试脚本开发时,我们往往需要首先创建一个测试框架,然后基于此进行测试脚本的开发。一个设计良好的测试框架会给以后的脚本开发带来很多便利。在这篇文章里,我们结合一个实际的项目来介绍一下如何使用 RFT 构建一个结构合理、可扩展的,用于测试 Windows .Net 应用程序的测试框架。
    测试框架设计的几点原则

    本系列从如何构建结构良好的测试框架、高效的对象缓存机制,以及测试 Windows 应用程序的技巧和方法等方面,介绍如何运用 RFT 测试 Windows/.NET 应用程序。

    一种高效的对象缓存机制在测试框架中的应用
    利用 Windows Domain 测试 Windows 控件
    对 TestObject.find() 方法的扩展与改进


    一个好的测试框架需要具备哪些元素呢?虽然对不同的项目而言,答案可能有所不同。但总的来说,一个好的测试框架通常具有以下的共同特点:

    分层结构
    关注分离
    代码重用
    结构清晰
    易于维护
    方便调试
    可扩展性好
    除了以上所述的几点外,一个好的框架还应该提供相应的通用服务,以使得脚本开发者可以很容易而且快速地基于它来开发脚本。比如象错误处理,本地化版本支持,日志服务等。






    回页首




    定义良好的层次结构

    如何定义一个良好的层次结构,是我们在构建测试框架首先需要考虑的问题。通常我们会把最基本的一些原子操作放在最底层,而在较上层封装这些操作,并开放相应的接口供最终的脚本开发者进行调用。这样往往会使得 Case 更加简洁易读。

    根据面向对象基本理论,我们首先要定义一些基础的控件类,用来代表那些需要在测试中进行操作的基本界面元素,象按钮,输入框等。如果你使用 RFT 测试 Java 或 Web 应用,那么你可以直接使用 IBM Package,在这个包里封装了所有的在 Java 和 Web 这两个 Domain 下的基本控件。通过在你的脚本中调用这些类,你就可以很方便地实现对被测应用的操纵。但是,我们所测试的应用是基于 Windows .Net 的,在这个包里没有对应的控件类可以利用,因此,第一步,我们要开发自己的控件类。

    其实,我们也可以不定义基础类,而直接使用 GUITestObject 来操纵每一个界面对象,但这样做的代价是显而易见的,会有很多重复且不易读的代码充斥在我们的脚本中。这显然不是我们所想要的。好在虽然各种控件的种类繁多,但对于每一个控件而言,需要封装的主要是一些我们在测试中经常需要调用的简单方法,比如说 Click(),或 SetText(),因此工作量并不太大。

    在实现了这一层之后,理论上说,我们可以直接在 Case 脚本里调用这些方法来实现对测试对象的操作。但这样做也有一个问题是,如果以后你对这些方法的名称进行了修改,或者因为程序实现的改变,原来的 A 类控件被 B 类代替,这时,势必会对所有已经编写好的 Case 脚本造成很大的影响,带来很大的代码维护量。因此为了隔离下层代码对上层 Case 的影响,我们在其中又加入了新的一层。最后的层次结构如下:


    图 1. 层次结构


    以下是对每一层的具体解释:

    NetWidgets:这一层封装了所有的基本 Windows 控件,它与具体的应用无关,可以看作是测试 .Net 应用的基础类库。对应于 Windows 的每一个控件,在这一层里,都有一个对应的 Class,其中包括对该控件的基本操作,以及一些在测试过程需要使用的验证方法,比如验证某个属性的值。
    AppLib:所有与当前测试应用相关的方法及对象在这一层定义。它包括 2 部分:
    Dialogs:正如名称所示,在这一部分中,主要保存所有的对话框或其他窗口对象,以及对这些窗口上控件的操作方法。他们通过调用下一层的基本控件函数来实现。与 NetWidgets 不同,在这一层定义的方法,是与应用中具体的控件名称所绑定的,具有明确的含义,如 SetPassword();而在 NetWidgets 层中,仅仅是某一类控件的一个通用的方法而已,如 SetText()。除了窗口对象外,一些其他的经常需要乃至的对象,如应用中的菜单,工具栏等,也在这一部分定义。
    Wizards:在这一部分所定义的方法,他们包含是一些基本操作的组合,用来完成某项具体的功能,如 Login()。这些功能都是大部分 Cases 需要经常调用,或者是特定的测试步骤组合。通过将它们纳入这一层统一管理,可以很方便地起到代码重用的目的。通常这些 Wizard 是对同一个 Dialog 上的操作组合,但这并不是必须的。有时候跨多个 Dialog 的组合操作在测试用例中也是很常见的,因此也需要归纳从而提高重用性。
    TestCases:很明显,这是最上一层,也就是保存所有测试脚本的地方。通过调用中间 AppLib 层的方法来实现所有测试功能,包括执行操作,检查状态并记录测试结果。
    在描述完整个框架的大致结构后,我们来看看这种结构的优点:

    代码隔离。通过引入 AppLib 中间层,对最上层 TestCases 屏蔽最底层实现,也就是将测试逻辑与具体功能实现逻辑分开。TestCasse 层只关注具体的测试步骤,而 NetWidgets 完成最终的功能实现。通过这种方式,使得 TestCases 层的代码简单明了,可读性好;另外未来对 NetWidgets 的改变将不会对 TestCases 层造成任何影响,也就是提高的程序的可维护性。
    结构清晰。各层所定义的方法及功能也十分明确。每一层仅通过调用其直接下层来实现功能,禁止跨层调用保证代码之间的多重依赖。这对编码调试或测试运行时对问题的快速定位很有帮忙。
    可扩展性好。软件产品总是在不断地发展,新功能不断地引入。在使用这种三层结构的框架以后,当需要增加新的 Cases 时,只需先加入对应的对话框及窗口对象到 AppLib,然后再通过调用它们来完成代码编写。新加的 AppLib 对象不会对原有的对象造成任何影响,因为每个对象都有仅属于自己的代码文件。而原有的 AppLib 对象则可以简单地在新的 Case 中重用。
    采用这样的框架,只开放相应的接口供最终的脚本开发者进行调用,会使 Case 更加简洁易读。在 GUI 界面发生变化时,也不需要对 TestCase 做任何修改,大大提高了程序的可维护性和可扩展性。






    回页首




    在 RFT 里的具体实现

    在定义完整个测试架构以后,接下来是在测试工具中用代码加以实现。在本项目中,我们使用的是 RFT,现在,让我们来看看在 RFT 里的具体实现。


    图 2. 在 RFT 里的实现


    从上图可以看到,我们使用 3 个 Project 来对应 3 个不同的层,而不是象通常的项目一样,将所有的代码放在一起,层次结构通过不同的包结构来体现。这样做的主要原因是让各层之间更加独立,而且更易于管理。另一个好处是,多个 Project 的设计可以让复制和共享更加灵活。例如,当其他 Team 也想要利用 NetWidgets 时,只需要简单地将对应的 Project 共享给他们即可;而另一个 Team 如果需要某一个 Suite 来验证某项具体功能,则可以将 3 层所对应的 Project 都共享给他。

    Dialogs 和 Wizards 目录中定义了所有与具体被测应用相关的方法,而位于 Suite Project 中的 Test Case 则调用他们来进行测试。在这里我们列出一些代码以便大家能够更清楚地了解它们之间的调用关系。

    这是一段摘自 LoginDlg.java 的代码(Dialog):


    图 3. LoginDlg.java 代码片断(Dialog)


    这是一段摘自 Login.java 的代码(Wizard):


    图 4. Login.java 代码片断 (wizard)


    从上面的代码可以看出,在 Dialog 对象中,所定义的方法都是对该 Dialog 中控件的基本操作方法,象点击一个按钮,在编辑框里输入字串等。但在 Wizard 中,则通过将这些 Dialog 中的基本操作串联起来完成一个简单任务,如登录。相类似的功能则放入同一个 Wizard。






    回页首




    框架中的其他公用服务

    通过在框架中提供一些公用服务,可以使得该框架更加易于使用,并且功能强大。在前面的图 2 中,可以看到在 Utils 目录下有 3 个 Class。它们分别提供不同的功能,让我们做一下简单的介绍。

    对于自动化测试而言,有一个很重要的环节是用一种统一的方式来记录测试的结果,从而可以方便地进行统计或生成报表。所以第一个要提到的是 TestResult。

    TestResult

    这个 Class 用来记录每个 Case 的名称和执行结果。它读取一个 Xml 模板文件,这个文件定义了哪些内容需要在测试结果中显示。在自动执行完成后,包括 Suite 名称,测试环境,Case 信息,测试结果等这些数据将会被写入,生成结果文件。最后通过一个事先定义好的样式表文件进行格式化,用网页的形式呈现。

    另外,对于失败的 Case,最主要的错误信息及屏幕截图也会一并记录下来,以方便进行分析查错。

    LibException

    这个 Class 作为所有运行时异常的基类。这个父类里增加了以下功能:

    当有错误发生时,抓取屏幕截图,保存到本地文件,同时将文件路径写入一字符串属性中。
    当有错误发生时,保存错误的 Stack trace 到文件中,同时将文件路径写入一字符串属性中。
    通过这些功能,结合使用上述的 TestResult 类,就可以很方便地保存每个错误发生时的详细信息,而不仅仅是一个简单的错误消息。

    ObjectFinder

    一般来说,在 RFT 测试中,通常使用 Object Map 来在回放中定位界面对象。Object Map 是在测试脚本录制中自动生成的,因此使用起来较为方便。但它有一个缺点是,它记录了所有对象的层次结构,并据此进行查找。一旦对象的关键属性或层次发生改变,则必须重新录制以更新 Object Map。当项目里 Case 比较多的时候,这就变成了一项费时费力的工作。因此,RFT 还提供了另一种动态查找的方法 TestObject.Find(),在编写脚本时可以即时地调用该函数,通过给定的属性值进行查找定位。目前它的效率已经与通过 Object Map 定位不相上下。

    ObjectFinder 类是一个用来动态查找对象的工具类,它通过调用 TestObject.Find() 来实现,并提供多种不同的查找方法。最常见的是指定对象的 .class 和 .text 属性来在某个窗口中进行查找。这个类主要在 AppLib 层中的 Dialog 对象中使用,在那些对窗口中对象进行操作的函数中,第一条语句很可能就是调用 ObjectFinder.getObject(className, captionText, parent) 来找到所要操作的界面对象。

    另一个使用动态查找的好处是,可以将那些用于识别界面元素的关键属性保存到一个配置文件中。当有属性值变化时,就可以很简单地通过修改配置文件实现,而无需修改脚本。同时,如果需要进行其他语言版本的测试,也可以直接将配置文件替换为其他语言版本的文件来实现对多语言版本测试的支持。在我们这个项目中,我们还有另外一个工具可以直接从源码的资源文件中提取界面上的文本资源,自动生成我们所需的属性识别配置文件中,从而大大简化了手工编写的工作量,同时也可以轻松应对因界面文本改变而带来的查找修改的困扰。






    回页首




    结束语

    开发一个适合自己项目的 RFT 自动化框架,需要了解架构设计方面的基础知识,以及清楚地知道一个好的测试框架所需要提供的功能。但这并不很困难,因为有很多这方面的文章和经验可供参考,同时也有很多成熟的框架可资借鉴。

    除了结构清晰,关注分离,易于扩展之外,一些通用服务也是一个好的测试框架不可或缺的部分。通过利用这些服务,RFT 的脚本开发人员可以更方便、快捷地开发出自动化脚本,同时保证使用统一的方法,生成格式一致的测试结果。这些也是使用框架的意义所在。

    http://www.ibm.com/developerworks/cn/rational/r-cn-rftwindows1/

    [ 本帖最后由 volvoo 于 2009-7-13 20:12 编辑 ]
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    71#
     楼主| 发表于 2009-7-13 19:52:40 | 只看该作者

    关于qtp

    如果说qtp是一个强大的工具,我很赞成,
    如果你说你用qtp自动化接口 ,开发了一个万能的框架,投入很少的维护工时,就能顺利在每个版本执行,这我只能说忽悠 了。
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

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

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

    GMT+8, 2024-11-11 07:04 , Processed in 0.110637 second(s), 28 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

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