51Testing软件测试论坛

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

QQ登录

只需一步,快速开始

微信登录,快人一步

楼主: volvoo
打印 上一主题 下一主题

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

[复制链接]

该用户从未签到

61#
发表于 2009-7-10 17:09:37 | 只看该作者
讨论框架有没有用,根本毫无意义,事实胜于雄辩
QTP本身就是基于关键字驱动的自动化测试框架。
感觉很多人都没理解什么是框架,建议大家去了解一下HP BTO的思想
框架的目标在于统一管理,质量可控,所以HP推出了质量中心的概念Quality Center + QTP
通过质量中心,就能对脚本、对象库等进行统一管理和度量,这就是很好的框架。
同样,HP还推出了性能中心的概念Performance Center +LoadRunner
还有安全性中心的概念Application Security Center
回复 支持 反对

使用道具 举报

该用户从未签到

62#
发表于 2009-7-10 18:32:16 | 只看该作者
楼主肯怕是不明白什么叫框架,如果框架就是用QTP的话,我只能说很遗憾,你还没到谈论框架的这个阶段,等你做两年自动化以后再回过头来看吧。
回复 支持 反对

使用道具 举报

该用户从未签到

63#
发表于 2009-7-11 12:49:02 | 只看该作者
框架很大程度依赖于,该工具支持的语言。
没类,没封装、没派生、没重载、没继承等等利于框架实现的因素
的语言来支架。框架!No way!
回复 支持 反对

使用道具 举报

该用户从未签到

64#
发表于 2009-7-11 13:34:16 | 只看该作者
原帖由 lvguobin 于 2009-7-11 12:49 发表
没类,没封装、没派生、没重载、没继承等等利于框架实现的因素
的语言来支架。框架!No way!


虽然我对QTP这个工具很是不屑(虽然它比较丰富的插件弥补了VBS语言的不足),但我很不赞同你把框架提升到神仙才能触及的理念。
我觉得能解决实际问题用起来OK能提高效率的都能称为框架!

不可否认支持OO语言的框架有着原生优越的可扩展性,但这是语言所带来的便利,即使支持OO语言框架的设计者起初把方法封装地支离破碎,后来者如果有兴趣也可以利用OO语言的优势去修复或者重写它。但这并不是说采用像VBS这样对OO支持不好的语言的工具所采取的提高效率的写法所生成的脚本合集就不能算作框架,因为不要忘了对大部分公司来说测试的投入并不多,VBS这样的语言能快速地上手节省雇人的成本(国内D版的成本相当低),而且VBS的开发效率也非常高(HP QTP得感谢微软,猩猩会VB不会Java )。

PS:我用C++、C#做过框架类的开发,也看过不少C#、Perl等脚本语言开发的框架。

[ 本帖最后由 shanxi 于 2009-7-11 14:36 编辑 ]
回复 支持 反对

使用道具 举报

该用户从未签到

65#
 楼主| 发表于 2009-7-12 09:49:26 | 只看该作者

qtp 严重点说

有点象玩具,怎么玩都可,就是不能玩大了
回复 支持 反对

使用道具 举报

该用户从未签到

66#
发表于 2009-7-12 10:34:06 | 只看该作者
额。。。对楼主的观点不予置评,说说本人公司用QTP的情况吧:
有一套完整的框架(楼主要鄙视了?)
测试对象是一个安装包3个G的产品(不算小了?)
升级维护该产品十几年了(算有年头了吧?)
耗时9个月采用QTP开发出2000个case(虽然case覆盖率仅有20%)
在统一框架的管理下可在windows2003各版本、windows2008个版本下运行(至少4个环境,有强大的平台兼容性)
并且可向下兼容一到二个版本(即该case可用于该产品前一到两个release)

而这一切,和一个强大的框架密切相关的。
PS:不知道楼主用的是正版还是盗版,你要相信,没有公司会花几百万去买一个软件就给你当个小工具偶尔用用的。
回复 支持 反对

使用道具 举报

该用户从未签到

67#
发表于 2009-7-12 13:20:49 | 只看该作者
mark一下,吵架挺有意思的!楼主呢?~
回复 支持 反对

使用道具 举报

该用户从未签到

68#
发表于 2009-7-13 11:08:13 | 只看该作者

这个帖子要顶,支持技术讨论!

这个帖子要顶,支持技术讨论!
回复 支持 反对

使用道具 举报

该用户从未签到

69#
 楼主| 发表于 2009-7-13 15:12:00 | 只看该作者

回66楼

1 如果不算泄密 ,你可以说说你们是如何框架的
2 你们的被 测程序界面是否经常发生变化?
3 有多少人在维护这些脚本
4 全部执行完毕,需要多长时间 ?是否需要人工干预?
5 20%是需求覆盖率吗 ?还是占总 用例数的20%
6 是b/s结构的web程序还是c/s结构的程序?
回复 支持 反对

使用道具 举报

该用户从未签到

70#
发表于 2009-7-13 15:54:25 | 只看该作者
我喜欢看人吵架,很有趣哎
俗话说得好:话不说不明,理不辩不透。
不过加上人身攻击的话,就是另一回事了
回复 支持 反对

使用道具 举报

该用户从未签到

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

关于qtp

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

使用道具 举报

该用户从未签到

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 编辑 ]
回复 支持 反对

使用道具 举报

该用户从未签到

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

再 牛,你有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更好的发挥左右而已,它确实不神奇,但是很重要。

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

使用道具 举报

该用户从未签到

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

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

使用道具 举报

该用户从未签到

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是一个回归测试工具而已。
回复 支持 反对

使用道具 举报

该用户从未签到

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


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

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

使用道具 举报

该用户从未签到

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

是ibm还是ibm的外包

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

使用道具 举报

该用户从未签到

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

所谓的框架

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

使用道具 举报

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

    连续签到: 1 天

    [LV.2]测试排长

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

    使用道具 举报

    本版积分规则

    关闭

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

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

    GMT+8, 2024-5-13 19:48 , Processed in 0.079289 second(s), 21 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

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