RFT经典案例集合演示教学_第1页
RFT经典案例集合演示教学_第2页
RFT经典案例集合演示教学_第3页
RFT经典案例集合演示教学_第4页
RFT经典案例集合演示教学_第5页
已阅读5页,还剩161页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Good is good, but better carries it.精益求精,善益求善。RFT经典案例集合测试框架设计的几点原则本系列从如何构建结构良好的测试框架、高效的对象缓存机制,以及测试Windows应用程序的技巧和方法等方面,介绍如何运用RFT测试Windows/.NET应用程序。HYPERLINK/developerworks/cn/rational/r-cn-rftwindows2/一种高效的对象缓存机制在测试框架中的应用HYPERLINK/developerworks/cn/rational/r-cn-rftwindows3/利用WindowsDomain测试Windows控

2、件HYPERLINK/developerworks/cn/rational/r-cn-rftwindows4/对TestObject.find()方法的扩展与改进一个好的测试框架需要具备哪些元素呢?虽然对不同的项目而言,答案可能有所不同。但总的来说,一个好的测试框架通常具有以下的共同特点:分层结构关注分离代码重用结构清晰易于维护方便调试可扩展性好除了以上所述的几点外,一个好的框架还应该提供相应的通用服务,以使得脚本开发者可以很容易而且快速地基于它来开发脚本。比如象错误处理,本地化版本支持,日志服务等。HYPERLINK/developerworks/cn/rational/r-cn-rftwi

3、ndows1/index.htmllibm-pcon回页首定义良好的层次结构如何定义一个良好的层次结构,是我们在构建测试框架首先需要考虑的问题。通常我们会把最基本的一些原子操作放在最底层,而在较上层封装这些操作,并开放相应的接口供最终的脚本开发者进行调用。这样往往会使得Case更加简洁易读。根据面向对象基本理论,我们首先要定义一些基础的控件类,用来代表那些需要在测试中进行操作的基本界面元素,象按钮,输入框等。如果你使用RFT测试Java或Web应用,那么你可以直接使用IBMPackage,在这个包里封装了所有的在Java和Web这两个Domain下的基本控件。通过在你的脚本中调用这些类,你就可

4、以很方便地实现对被测应用的操纵。但是,我们所测试的应用是基于Windows.Net的,在这个包里没有对应的控件类可以利用,因此,第一步,我们要开发自己的控件类。其实,我们也可以不定义基础类,而直接使用GUITestObject来操纵每一个界面对象,但这样做的代价是显而易见的,会有很多重复且不易读的代码充斥在我们的脚本中。这显然不是我们所想要的。好在虽然各种控件的种类繁多,但对于每一个控件而言,需要封装的主要是一些我们在测试中经常需要调用的简单方法,比如说Click(),或SetText(),因此工作量并不太大。在实现了这一层之后,理论上说,我们可以直接在Case脚本里调用这些方法来实现对测试对

5、象的操作。但这样做也有一个问题是,如果以后你对这些方法的名称进行了修改,或者因为程序实现的改变,原来的A类控件被B类代替,这时,势必会对所有已经编写好的Case脚本造成很大的影响,带来很大的代码维护量。因此为了隔离下层代码对上层Case的影响,我们在其中又加入了新的一层。最后的层次结构如下:图1.层次结构以下是对每一层的具体解释:NetWidgets:这一层封装了所有的基本Windows控件,它与具体的应用无关,可以看作是测试.Net应用的基础类库。对应于Windows的每一个控件,在这一层里,都有一个对应的Class,其中包括对该控件的基本操作,以及一些在测试过程需要使用的验证方法,比如验证

6、某个属性的值。AppLib:所有与当前测试应用相关的方法及对象在这一层定义。它包括2部分:Dialogs:正如名称所示,在这一部分中,主要保存所有的对话框或其他窗口对象,以及对这些窗口上控件的操作方法。他们通过调用下一层的基本控件函数来实现。与NetWidgets不同,在这一层定义的方法,是与应用中具体的控件名称所绑定的,具有明确的含义,如SetPassword();而在NetWidgets层中,仅仅是某一类控件的一个通用的方法而已,如SetText()。除了窗口对象外,一些其他的经常需要乃至的对象,如应用中的菜单,工具栏等,也在这一部分定义。Wizards:在这一部分所定义的方法,他们包含是

7、一些基本操作的组合,用来完成某项具体的功能,如Login()。这些功能都是大部分Cases需要经常调用,或者是特定的测试步骤组合。通过将它们纳入这一层统一管理,可以很方便地起到代码重用的目的。通常这些Wizard是对同一个Dialog上的操作组合,但这并不是必须的。有时候跨多个Dialog的组合操作在测试用例中也是很常见的,因此也需要归纳从而提高重用性。TestCases:很明显,这是最上一层,也就是保存所有测试脚本的地方。通过调用中间AppLib层的方法来实现所有测试功能,包括执行操作,检查状态并记录测试结果。在描述完整个框架的大致结构后,我们来看看这种结构的优点:代码隔离。通过引入AppL

8、ib中间层,对最上层TestCases屏蔽最底层实现,也就是将测试逻辑与具体功能实现逻辑分开。TestCasse层只关注具体的测试步骤,而NetWidgets完成最终的功能实现。通过这种方式,使得TestCases层的代码简单明了,可读性好;另外未来对NetWidgets的改变将不会对TestCases层造成任何影响,也就是提高的程序的可维护性。结构清晰。各层所定义的方法及功能也十分明确。每一层仅通过调用其直接下层来实现功能,禁止跨层调用保证代码之间的多重依赖。这对编码调试或测试运行时对问题的快速定位很有帮忙。可扩展性好。软件产品总是在不断地发展,新功能不断地引入。在使用这种三层结构的框架以后

9、,当需要增加新的Cases时,只需先加入对应的对话框及窗口对象到AppLib,然后再通过调用它们来完成代码编写。新加的AppLib对象不会对原有的对象造成任何影响,因为每个对象都有仅属于自己的代码文件。而原有的AppLib对象则可以简单地在新的Case中重用。采用这样的框架,只开放相应的接口供最终的脚本开发者进行调用,会使Case更加简洁易读。在GUI界面发生变化时,也不需要对TestCase做任何修改,大大提高了程序的可维护性和可扩展性。HYPERLINK/developerworks/cn/rational/r-cn-rftwindows1/index.htmllibm-pcon回页首在R

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

11、将3层所对应的Project都共享给他。Dialogs和Wizards目录中定义了所有与具体被测应用相关的方法,而位于SuiteProject中的TestCase则调用他们来进行测试。在这里我们列出一些代码以便大家能够更清楚地了解它们之间的调用关系。这是一段摘自LoginDlg.java的代码(Dialog):图3.LoginDlg.java代码片断(Dialog)这是一段摘自Login.java的代码(Wizard):图4.Login.java代码片断(wizard)从上面的代码可以看出,在Dialog对象中,所定义的方法都是对该Dialog中控件的基本操作方法,象点击一个按钮,在编辑框里输

12、入字串等。但在Wizard中,则通过将这些Dialog中的基本操作串联起来完成一个简单任务,如登录。相类似的功能则放入同一个Wizard。HYPERLINK/developerworks/cn/rational/r-cn-rftwindows1/index.htmllibm-pcon回页首框架中的其他公用服务通过在框架中提供一些公用服务,可以使得该框架更加易于使用,并且功能强大。在前面的图2中,可以看到在Utils目录下有3个Class。它们分别提供不同的功能,让我们做一下简单的介绍。对于自动化测试而言,有一个很重要的环节是用一种统一的方式来记录测试的结果,从而可以方便地进行统计或生成报表。所

13、以第一个要提到的是TestResult。TestResult这个Class用来记录每个Case的名称和执行结果。它读取一个Xml模板文件,这个文件定义了哪些内容需要在测试结果中显示。在自动执行完成后,包括Suite名称,测试环境,Case信息,测试结果等这些数据将会被写入,生成结果文件。最后通过一个事先定义好的样式表文件进行格式化,用网页的形式呈现。另外,对于失败的Case,最主要的错误信息及屏幕截图也会一并记录下来,以方便进行分析查错。LibException这个Class作为所有运行时异常的基类。这个父类里增加了以下功能:当有错误发生时,抓取屏幕截图,保存到本地文件,同时将文件路径写入一字

14、符串属性中。当有错误发生时,保存错误的Stacktrace到文件中,同时将文件路径写入一字符串属性中。通过这些功能,结合使用上述的TestResult类,就可以很方便地保存每个错误发生时的详细信息,而不仅仅是一个简单的错误消息。ObjectFinder一般来说,在RFT测试中,通常使用ObjectMap来在回放中定位界面对象。ObjectMap是在测试脚本录制中自动生成的,因此使用起来较为方便。但它有一个缺点是,它记录了所有对象的层次结构,并据此进行查找。一旦对象的关键属性或层次发生改变,则必须重新录制以更新ObjectMap。当项目里Case比较多的时候,这就变成了一项费时费力的工作。因此,

15、RFT还提供了另一种动态查找的方法TestObject.Find(),在编写脚本时可以即时地调用该函数,通过给定的属性值进行查找定位。目前它的效率已经与通过ObjectMap定位不相上下。ObjectFinder类是一个用来动态查找对象的工具类,它通过调用TestObject.Find()来实现,并提供多种不同的查找方法。最常见的是指定对象的.class和.text属性来在某个窗口中进行查找。这个类主要在AppLib层中的Dialog对象中使用,在那些对窗口中对象进行操作的函数中,第一条语句很可能就是调用ObjectFinder.getObject(className,captionText,

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

17、n-rftwindows1/index.htmllibm-pcon回页首结束语开发一个适合自己项目的RFT自动化框架,需要了解架构设计方面的基础知识,以及清楚地知道一个好的测试框架所需要提供的功能。但这并不很困难,因为有很多这方面的文章和经验可供参考,同时也有很多成熟的框架可资借鉴。除了结构清晰,关注分离,易于扩展之外,一些通用服务也是一个好的测试框架不可或缺的部分。通过利用这些服务,RFT的脚本开发人员可以更方便、快捷地开发出自动化脚本,同时保证使用统一的方法,生成格式一致的测试结果。这些也是使用框架的意义所在。免责声明本文包含解决方案。IBM授予您(“被许可方”)使用这个解决方案的非专有的

18、、版权免费的许可证。然而,解决方案是以“按现状”的基础提供的,不附有任何形式的(不论是明示的,还是默示的)保证,包括对适销性、适用于某特定用途或非侵权性的默示保证。IBM及其许可方不对被许可方使用该软件所导致的任何损失负责。任何情况下,无论损失是如何发生的,也不管责任条款怎样,IBM或其许可方都不对由使用该软件或不能使用该软件所引起的收入的减少、利润的损失或数据的丢失,或者直接的、间接的、特殊的、由此产生的、附带的损失或惩罚性的损失赔偿负责,即使IBM已经被明确告知此类损害的可能性,也是如此。在使用IBMRationalFunctionalTester(RFT)进行软件测试的时候,为了减少对象

19、层次结构发生变化带来的脚本维护的成本,通常我们会使用动态识别而不是静态识别机制。所谓动态识别,一般会使用TestObject.find()方法查找对象,而不去关心对象的层次结构。RFT对于对象层次结构相对复杂,或者编码不是很规范的控件的识别,尤其基于Windows开发的产品,在使用动态查找方法时会遇到一些困难,甚至有无法正确获取对象的情况。本文将结合实际应用TestObject.find()方法遇到的问题,分析并给出解决方案。理解并使用TestObject.find()方法在RFT提供的API包中TestObject.find()方法功能强大,使用灵活。通常情况下,只需要提供对象的属性值,并保

20、证属性的唯一性就可以查找所需的对象。TestObject.find()方法提供了以下几种使用方式:atProperty-Aname/valuepairrepresentingaTestObjectpropertyatChild-OneormorepropertiesthatmustbematchedagainstthedirectchildofthestartingTestObjectatDescendant-OneormorepropertiesthatcanbematchedagainstanychildofthestartingTestObjectatList-Asequentialli

21、stofpropertiestomatchagainst.ValidsubitemsforatListare:atChildatDescendantatProperty下面是一个简单的使用TestObject.find()方法查找button控件的例子:首先通过RFT自带的ObjectMaptool获取所要查找的控件的可用属性值,以便我们清楚的了解使用TestObject.find()方法查找时需要提供哪些属性。下图是一个button控件在objectmap中的表现形式:图1.button控件在objectmap中的表现形式objectmap下面是具体的实例(实例1):代码1.使用TestOb

22、ject.find()方法查找button控件的例子/*通过属性”.class”、”.name”和”.text”查找button控件对象*paramnameValuebutton的.name属性值*paramtextValuebutton的.text属性值*paramobjectbutton的父对象*returnTestObject*/publicTestObjectgetButtonTestObject(ObjectnameValue,ObjecttextValue,TestObjectobject)TestObjecttos=null;tos=object.find(atList(atDe

23、scendant(.class,”.Pushbutton”,.name,nameValue),atProperty(.text,textValue);if(tos.length0)returntos0;例如我们要查找到一个叫”Login”的按钮,现在我们可以调用上面的方法:getButtonTestObject(“Login”,”Login”,parentObj);HYPERLINK/developerworks/cn/rational/r-cn-rftwindows4/index.htmllibm-pcon回页首使用TestObject.find()方法时遇到的问题在RFT的script中,

24、我们经常使用的就是TestObject.find()方法的atDescendant()方式,它可以不用关注对象层次结构,直接对根对象的深层次子对象进行查找,但对于具有复杂的层次结构,编码又不是很标准的控件对象,尤其是基于windows开发的应用程序,使用atDesendant()经常会遇到查找超时或者根本无法查找到对象的问题。例如测试一个基于Office2007开发的Add-In产品,开发语言为.NETframework,如果要在一个search面板上查找一个Searchbutton,通过下面的ObjectMap图我们可以看到,它的层次关系十分复杂,searchbutton是作为顶层的Sear

25、chpane的多级子孙对象存在的。虽然这个button控件具有唯一的属性值,但我们尝试用TestObject.find()方法的各种方式去查找,返回值都为空,无法找到该对象。图2.NET开发的控件,被RFT识别为windomain而不是Netdomain通过上面的ObjectMap图,我们看到使用.NET开发的控件,被RFT识别为windomain而不是Netdomain,而且对象结构又比较复杂,这可能是造成atDescendant()方法无法识别对象的原因。可见,RFT的TestObject.find()提供的atDescendant()方法对于处理复杂的,编写不规范的对象控件,有其不足。对

26、于这个问题,在此我们不做过多讨论。我们所关心的是如何利用现有的技术和RFT提供的可用的方法,来解决这个问题,从而顺利的查找到我们需要的对象。HYPERLINK/developerworks/cn/rational/r-cn-rftwindows4/index.htmllibm-pcon回页首如何解决正如上面所提到的,RFT的动态识别方法,在解决复杂结构尤其是windows控件的查找时会出现一些问题,所以我们尝试用其他方法来查找对像,在实践中我们发现TestObject.getChildren()方法总是可用,不会出现查找超时而无法找到对象的情况,而且效率很好,所以如果我们利用getChildr

27、en()递归查找所有对象的各层子对象,并利用TestObject.getProperty()方法获取所需对象属性,进行比较筛选,这样,只要我们提供的属性能唯一标识该对象,利用递归的方法逐一进行查找比较,我们就能顺利找到这个对象。下面是递归结构图:图3.递归结构图下面给出一个简单的实现递归查找对象的例子(实例2):代码2.实现递归查找对象的例子/*递归遍历查找父对象的直接子对象,比较对象的属性值,如果找到则返回,若没有符合的条件的对象,*则进入二级子对象进行查找,依此类推,通过遍历查找所需对象。*例如,在Search面板中查找一个叫search的按钮,可以调用如下的方法:*getObjectBy

28、Property(.class,.Pushbuttn,.name,Search,searchPaneObject);*parampro1,欲查找控件对象的第一个属性,例如.class*paramvalue1,欲查找控件对象的第一个属性的值,例如.Pushbutton*parampro2,欲查找控件对象的第二个属性,例如.name*paramvalue2,欲查找控件对象的第二个属性的值,例如Search*paramtestObj,包含这个控件对象的父对象*returnTestObject返回找到的控件对象*/publicTestObjectgetObjectByProperty(Stringpr

29、o1,Objectvalue1,Stringpro2,Objectvalue2,TestObjecttestObj)/定义子对象的层次intlevel=0;TestObjectto1=null;/获取父对象的所有直接子对象TestObjectto=testObj.getChildren();/比较TestObject的长度是否大于0,其中isExist是一个全局标识,用来判断对象是否找到if(to.length0&!isExist)/循环查找直接子对象for(inti=0;i0)level=0;getObjectByProperty(pro1,value1,pro2,value2,toi);e

30、lselevel+;if(level=to.length)returntestObject;elsereturntestObject;returntestObject;这个例子中,我们提供了两个属性值对,对所需对象进行匹配查找,通常情况下,这个两个属性是.class和.name,当然,如果两个属性并不能满足唯一确定一个对象,你还可以扩展到三个或者多个属性作为函数的参数,从而实现准确查找匹配的对象,这里不再赘述。HYPERLINK/developerworks/cn/rational/r-cn-rftwindows4/index.htmllibm-pcon回页首改进并提高查找效率虽然随着现在电脑

31、的运算能力的提高,使得循环和递归查询效率在很大程度上提高了,但对于层次结构很深的对象的查询,简单的递归在效率上还需要做适当的优化。针对我们测试的不同产品,我们可以定义不同的规则来提高查询效率,例如我们要查找一个叫Search的button,它不可能作为scrollbar的子对象,所以我们可以在查找button时可以跳过对scrollbar的查找,从而提高效率。通过实践和总结,我们可以定义一些常用查找规则,在函数中调用这些规则,提高查找对象的效率。另外,我们还可以通过缩小所需查询的对象的相对父对象的层次结构,并利用cache对象的方法来提高查询效率,这里不再赘述。HYPERLINK/develo

32、perworks/cn/rational/r-cn-rftwindows4/index.htmllibm-pcon回页首与TestObject.find()方法结合RFT提供的TestObject.find()方法也有它的优点,我们并不想完全弃用,只是针对有些TestObject.find()方法无法找到的对象,结合以上方法,将大大提高对象的查找力度,既保证查找效率,又保证查找的准确性,从而更好的为产品的automation测试服务。下面是一个简单的结合TestObject.find()方法的示例:代码3.简单的结合TestObject.find()方法的示例/结合RFTframework提供

33、的find方法(实例1),/和本文介绍的通过属性-值递归查找子对象的方法(实例2),/我们就可以大大提高对所需对象的动态查找的准确率。publicTestObjectfindTestObject(Stringpro1,Objectvalue1,Stringpro2,Objectvalue2,TestObjectobject)TestObjecttestObj=null;/调用实例1testObj=getButtonTestObject(pro1,value1,pro2,value2,object);/如果没有找到,则调用实例2if(testObj=null)getTestObjectByPro

34、perty(pro1,value1,pro2,value2,object);HYPERLINK/developerworks/cn/rational/r-cn-rftwindows4/index.htmllibm-pcon回页首总结软件产品的开发人员注重的是功能的实现,不会关心复杂的对象层次结构或不规范的属性命名给测试人员编写自动化测试带来的困难,这就需要在编写测试脚步的时候考虑的更全面,并提高对象的查找识别能力,以保证automation测试顺利。RFT在基于Web和Java的测试中显示了强大的功能,但在windowapplication的测试中,还是有些不足的,没有一个测试软件能做到完美的

35、运行于各个平台,但遇到问题时,我们应该尝试用一些替代的方法去解决。本文所介绍的方法正在作者所在项目组实际使用,经检测在提高动态查找的能力和准确度上有很大的提高。免责声明本文包含解决方案。IBM授予您(“被许可方”)使用这个解决方案的非专有的、版权免费的许可证。然而,解决方案是以“按现状”的基础提供的,不附有任何形式的(不论是明示的,还是默示的)保证,包括对适销性、适用于某特定用途或非侵权性的默示保证。IBM及其许可方不对被许可方使用该软件所导致的任何损失负责。任何情况下,无论损失是如何发生的,也不管责任条款怎样,IBM或其许可方都不对由使用该软件或不能使用该软件所引起的收入的减少、利润的损失或

36、数据的丢失,或者直接的、间接的、特殊的、由此产生的、附带的损失或惩罚性的损失赔偿负责,即使IBM已经被明确告知此类损害的可能性,也是如此。据库测试许多测试人员对他们应用软件的数据库方面的测试很感兴趣。最具代表性的情节是,在您的应用软件中执行一些插入或者删除的行为,然后核查这个数据库是否已经进行了适当的更新。由于测试小组转向了自动化操作,这个数据库测试就变成了一个自然的需求。不幸的是,IBMRationalFunctionalTester并不为数据库的工作提供一个本地的方法。SQuirreLSQL是满足您数据库测试需求的一个很好的工具。当听到这个消息时,您可能会开发一个YetAnotherToo

37、lSyndrome的快速案例。毕竟,它实际上也是您需要的另一个工具。值得兴奋的是它是一个开源工具。这样您就可以免费下载和使用这个工具。更进一步说,万一您在使用这个工具时遇到一些问题,它还可以提供一定水平的支持。最后,它是用Java语言编写的。这样就为RationalFunctionalTester的录制和回放自动操作性能提供了一个理想的选择。这篇文章描述了一个“启动”指南的改编,这个“启动”指南帮助客户在他们的RationalFunctionalTester自动操作中接受SQuirreLSQL的使用。SQuirreLSQL为有抱负的数据库大师提供了过剩的功能。尽管如此,这个系列的目的还是使事情

38、保持简单,同时确保它能表达某些关键的概念,比如运行一个查询以及核查这个结果集合。它并不处理众多遗留下的性能,而是留给像您这样有寻根问底精神的人来研究。您会发现下面的文章十分有用。对于附加的透明度,如果您熟读这篇文章,那么就可以利用这篇文章中创建的脚本。您可以在这篇文章末尾的表格中下载。要注意的是,在执行这篇文章中的练习之前您要有RationalFunctionalTester经验(至少有录制和回放的经验)。这个系列的第1部分向您展示了如何为这些脚本功能配置RationalFunctionalTester。这篇文章将告诉您如何创建和捆绑脚本。这篇文章假定您已经完成了第1部分中详述的那些步骤。HY

39、PERLINK/developerworks/cn/rational/07/1225_gouveia/index.htmllibm-pcon回页首要中之首:先决条件在开始之前,确保您已经安装了RationalFunctionalTester,许可证,做好了开始的准备!这显然非常好,但是对您来说最重要的是成功地完成这篇文章中的任务。HYPERLINK/developerworks/cn/rational/07/1225_gouveia/index.htmllibm-pcon回页首数据库测试自动化:SQuirreLSQL对应的脚本下面的步骤将引导您完成创建脚本的四个步骤。开始的三个步骤重点强调具体

40、的SQuirreLSQL任务。最后一个脚本是一个命令脚本,汇聚这三个脚本来依次执行。第一个脚本录制SQuirreLSQL对应的第一个脚本:SQuirreL_SQL_Connect脚本。点击Record按钮。提供这个脚本的名称并点击Finish按钮来开始录制:如图1所示。图1.为这个脚本提供一个位置和名称选择StartApplication按钮,再选择squirrel-sqlexecutable作为您的应用软件,然后点击OK按钮,如图2所示。图2.选择这个应用软件双击这个ClassicsDatabase小程序(在SQuirreLSQL窗口),如图3所示。图3.选择一个别名点击Connect按钮(

41、这次也不需要User名称或者Password,如图4所示)。图4.连接到这个数据库点击RationalFunctionalTester中的StopRecording按钮。您现在应该拥有一个看起来跟列表1相似的脚本。列表1.RecordedSQLConnect脚本importresources.SQuirrel_SQL_ConnectHelper;/*Description:XDETesterScript*authorIBMRational*/publicclassSQuirrel_SQL_ConnectextendsSQuirrel_SQL_ConnectHelper/*ScriptName:

42、SQuirrel_SQL_Connect*Generated:Jun20,20079:51:08AM*Description:XDETesterScript*OriginalHost:WinNTVersion5.1Build2600(S)*since2007/06/20*authorIBMRational*/publicvoidtestMain(Objectargs)startApp(“squirrel-sql”);/Frame:SQuirrelSQLClientVersion2.5listOfDatabaseAliasesThatCanBe().doubleClick(atText(“Cla

43、ssicsDatabase”);connect().click();第二个脚本录制SQuirreLSQL对应的第二个脚本:SQuirreL_SQL_Simple_Query脚本。提供这个脚本的名称并点击Finish按钮开始录制它,如图5所示。图5.开始录制您的脚本选择SessionNewSQLWorksheet,如图6所示。图6.打开一个新的SQL工作表在SQL编辑区域点击,并键入SELECT*FROMORDERS,如图7所示。图7.键入SQL命令注意:您可能需要最大化您的窗口并重新调整这个RESULTS方框。点击RunSQL按钮(同样如图7所示)。创建VerificationPoint和Ac

44、tion向导,如图8所示。图8.选择一个对象利用ObjectFinder工具在SQuirreLSQL窗口中选择这个结果集合,如图9所示。图9.选择这个结果集合选择DataValue的TableContents,为VerificationPointName提供VerifyOrdersResultSet,然后点击Next按钮(如图10所示)。图10.插入一个验证点选择首5栏(为数据测试之用),并点击Finish按钮,如图11所示。图11.选择数据来进行测试注意:确定您已经选择了下拉菜单中的ColumnSelection。然后您可以选择第一栏(也就算,点击数据的第一个单元),并拖拽到右边。点击Rat

45、ionalFunctionalTester中的StopRecording按钮。您现在应用拥有一个看起来跟列表2相似的脚本。列表2.录制的SimpleQuery脚本publicclassSQuirrel_SQL_Simple_QueryextendsSQuirrel_SQL_Simple_QueryHelper/*ScriptName:SQuirrel_SQL_Simple_Query*Generated:Jun20,20079:54:46AM*Description:XDETesterScript*OriginalHost:WinNTVersion5.1Build2600(S)*since20

46、07/06/20*authorIBMRational*/publicvoidtestMain(Objectargs)/Frame:SQuirrelSQLClientVersion2.5mainFrameMenuBar().click(atPath(“Session”);mainFrameMenuBar().click(atPath(“Session-NewSQLWorksheet”);justToMakeGetToolTiptextToBeCa().click(atPoint(30,9);mainFrame().inputKeys(“CAPSLOCKSELECT*FROMORDERS”);ru

47、nSQLControlENTER().click();VerifyOrdersResultSetVP().performTest();注意:根据您使用的RationalFunctionalTester的版本,您的验证点基线看起来应该如下所示:dataSetViewerTablePanelMyJTabl().performTest(VerifyOrderResultSetVP();第三个脚本录制SQuirreLSQL对应的最后一个脚本SQuirreL_SQL_Close脚本。提供这个脚本的位置和名称,然后点击Finish按钮来开始录制,如图12所示。图12.开始录制在SQuirreLSQL中,选

48、择FileExit,如图13所示。图13.现存的SQuirreLSQL点击这个信息对话框中的Yes按钮,如图14所示。图14.确定您想要关闭这个会话如果您得到一个如图15所示的不要保存变更的对话框,只需点击No即可。图15.不要保存变更点击RationalFunctionalTester中的StopRecording按钮。您现在应该拥有一个看起来与列表3相似的脚本。列表3.录制的SQLClose脚本publicclassSQuirrel_SQL_CloseextendsSQuirrel_SQL_CloseHelper/*ScriptName:SQuirrel_SQL_Close*Generat

49、ed:Jun20,200710:01:03AM*Description:XDETesterScript*OriginalHost:WinNTVersion5.1Build2600(S)*since2007/06/20*authorIBMRational*/publicvoidtestMain(Objectargs)/Frame:SQuirrelSQLClientVersion2.5mainFrameMenuBar().click(atPath(“File”);mainFrameMenuBar().click(atPath(“File-Exit”);/yes().click();/no().cl

50、ick();第四个脚本将它捆绑在一起,创建这个命令脚本:SQuirreL_SQL_Shell。右键点击RationalFunctionalTester中FunctionalTestProject视图中的项目,然后选择AddEmptyScript,如图16所示。图16.添加一个空白脚本为这个脚本提供一个位置和名称,点然后击Finish,如图17所示。图17.开始录制一个空白测试脚本在/TODOInsertcodehere/后面创建一个新的命令行,点击这个空白命令行并将鼠标定位在这里。右键依次点击每个SQuirreLSQL脚本,并选择InsertAscallScript将它们添加到您的新的命令脚本

51、中,如图18所示。注意:注意要按照顺序添加这些脚本。图18.将脚本插入到您的命令中注意:注意要按照顺序添加这些脚本。您现在应该拥有一个看起来与列表4相似的脚本。列表4.完成的SQL命令脚本importresources.SQuirrel_SQL_ShellHelper;/*Description:XDETesterScript*authorIBMRational*/publicclassSQuirrel_SQL_ShellextendsSQuirrel_SQL_ShellHelper/*ScriptName:SQuirrel_SQL_Shell*Generated:Jun20,200710:0

52、9:19AM*Description:XDETesterScript*OriginalHost:WinNTVersion5.1Build2600(S)*since2007/06/20*authorIBMRational*/publicvoidtestMain(Objectargs)callScript(“SQuirrel_SQL_Connect”);callScript(“SQuirrel_SQL_Simple_Query”);callScript(“SQuirrel_SQL_Close”);HYPERLINK/developerworks/cn/rational/07/1225_gouvei

53、a/index.htmllibm-pcon回页首好戏上演!回放这些脚本既然您已经创建了您的SQuirreLScripts,回放它们只是小菜一碟。值得注意的有两点:当回放这些脚本时,您应该注意一些时间掌握的问题。只需将waitForExistence()程序命令添加到某些对象中就可以解决这个问题。例如,在第一个脚本中,将它添加到这个数据库应用程序对象中。我使用的代码行看起来如下所示:listOfDatabaseAliasesThatCanBe().waitForExistence();您可以将同步化添加到您另两个脚本中。主要是,您要确定第一个脚本是否已将离开了SQuirreLSQL处理数据,第二

54、个脚本要等到它完成才可以开始。HYPERLINK/developerworks/cn/rational/07/1225_gouveia/index.htmllibm-pcon回页首结束时的思考:从此处进行到哪里?研究SQuirreLSQL为您提供的广泛将对您有很大的帮助。如果您今天所看到的这些简单的功能能够满足您的需求那就更好了。然而,您或许能发现利用这个工具您还能做出更了不起的事情来。更值得人骄傲的是,您能够利用RationalFunctionalTester自动化操作这些程序。作为一个自动化工程师,您不需要创建仅仅为数据库测试利用的测试项目(当然,除非那是您所做的所有事情)。相反,而是您把

55、这种自动化置入到您的应用软件脚本中。这里有几种操作方法。方法之一是使这些脚本变成通用的方法,意思是它们能为各种参数所用(比如SQL查询字符串),并能动态核实结果集合。然后您可以创建自定义HYPERLINK/developerworks/rational/library/1093.htmlSuperHelperClasses并将这些普通的方法置于其中。这样您就可以简单地从您的测试脚本中调用必要的方法(例如在一个表格中查询)。另一种方法,或许更简单,就是将这些保存作为脚本。您仍然需要使它们为普通可用的(例如,接受不同的参数,等等),但是它们是从命令脚本中被调用的(与您在这个练习中创建的命令脚本类似

56、)。您如何来操作这些事情完全取决于您自己。任何案例的最终结果都是,您现在知道如何利用RationalFunctionalTester和SQuirreLSQL来成功地对您的数据库测试进行自动化操作。使用IBMRationalFunctionalTester(RFT)测试Windows应用程序:利用WindowsDomain测试Windows控件HYPERLINK/developerworks/cn/rational/r-cn-rftwindows3/index.htmllauthor1杨莉,测试工程师,IBMHYPERLINK/developerworks/cn/rational/r-cn-rf

57、twindows3/index.htmllauthor2陈昱旻,测试工程师,IBMHYPERLINK/developerworks/cn/rational/r-cn-rftwindows3/index.htmllauthor3祝天光,测试工程师,IBM简介:本文首先介绍了IBMRationalFunctionalTester(RFT)提供的对Windows应用程序和WindowsDomain的支持,然后用一系列的例子说明使用RFT开发针对测试Windows程序的脚本时会遇到的问题和利用Domain来作为解决方案。HYPERLINK/developerworks/cn/views/rationa

58、l/libraryview.jsp?&search_by=%E4%BD%BF%E7%94%A8+IBM+Rational+Functional+Tester%EF%BC%88RFT%EF%BC%89%E6%B5%8B%E8%AF%95+Windows+%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F查看本系列更多内容HYPERLINK/developerworks/cn/rational/r-cn-rftwindows3/index.html标记本文!发布日期:2009年3月27日级别:中级访问情况123次浏览建议:0(HYPERLINK/developerworks/

59、cn/rational/r-cn-rftwindows3/index.htmllicomments添加评论)平均分(共0个评分)概述本系列从如何构建结构良好的测试框架、高效的对象缓存机制,以及测试Windows应用程序的技巧和方法等方面,介绍如何运用RFT测试Windows/.NET应用程序。HYPERLINK/developerworks/cn/rational/r-cn-rftwindows1/如何构建结构良好的测试框架HYPERLINK/developerworks/cn/rational/r-cn-rftwindows2/一种高效的对象缓存机制在测试框架中的应用HYPERLINK/de

60、veloperworks/cn/rational/r-cn-rftwindows4/对TestObject.find()方法的扩展与改进IBMRationalFunctionalTester(RFT)是用来自动化测试Java和基于Web应用的工具。但是,RFT是否能够良好的支持一直是讨论的热点话题。RFT7.0目前可以支持录制和回放使用MicrosoftWin32控件构建的应用程序。同时,RFT7.0也支持Microsoft.NETFramework2.0。RationalFunctionalTester支持自动化测试的GUI控件包括Java、.Net、HTML、Siebel、SAP、Ajax

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论