Rational Robot是通过录制用户操作进行功能,性能和兼容性测试的自动化测试工具。通过回放录制脚本进行功能和可靠性测试。本文主要介绍Rational Robot针对java程序和applets如何进行功能测试。
Rational Robot当前版本支持用以下类库开发的Java程序和applet程序:
l Java Foundation Classes(JFCs)
l Sun的Swing 和 Abstract Windowing Toolkit(AWT)
l Symantec的Visual Café
l Sitraka Software的JClass库
还有一些Java类超出了Rational Robot支持的范围,但是需要注意的是这些超出Robot支持的Java类中的一些类继承自Rational Robot支持的类。测试人员可以通过编写Java代理来扩展Rational Robot识别对象的能力。使用Java扩展API,需要注意的是,这些代理只能够测试在SUN的JVM上运行的类,并可以运行在Netscape和IE上的程序和Applet。
本文将讨论,Rational Robot怎样使用Java代理并且当需要第三方Java代理的时候怎么做。示范如何开发Java代理,怎样用Java扩展Api支持Rational软件。
Rational Robot怎样用Java代理
执行功能,性能或者可靠性测试的时候,Rational Robot通过AUT监控用户交互进而生成Rational的SQABasic脚本,不必管开发程序的语言是什么,当录制的脚本回放,他通过AUT再现用户的操作行为。测试Java程序和Applets的时候,SQABasic有一套定义好的图形界面(GUI)对象.
表格一:展示了一组SQABasic 测试Java程序和Applect的GUI对象
|
JavaMenu |
JavaMenuItem |
CheckBox |
RadioButton |
|
ComboBox |
ComboListBox |
Label |
ListBox |
|
ScrollBar |
EditBox |
TrackBar |
TabControl |
|
ProgressBar |
JavaPanel |
JavaWindow |
JavaTree |
|
JavaSplitPanel |
JavaSplitter |
JavaMenuBar |
JavaObject |
|
JavaCheckBoxMenuItem |
PushButton |
Toolbar |
JavaListView |
|
JavaMenuSeparator |
JavaTable |
JavaCanvas |
|
|
JavaPopupMenu |
JavaTableHeader |
|
|
这些SQABasic GUI对象表现为他们的属性和功能表现。这些功能定义允许Robot模拟用户操作和对象进行交互。Robot知道怎样处理SQABasic GUI对象。测试Java和applets,Java对象必须映射为SQABasic GUI对象。比如JFC 中的Jbutton组件需要映射为SQABasic 对象的PushButton。
通过反射或者说反映,Rational Robot可以动态地决定加载到JVM中Java GUI组建的类、功能和属性。它使用包含在JavaClassMap.dat中的信息确定什么样的SQABasic对象可以映射到相关类,也可以确定使用什么样的代理与Java组建相互交互。
Rational提供的JavaClass模板被放在项目目录下\TestDatastoe\DefaultTestScriptDataStore\TMS_scripts\dat JavaClassMap.dat信息格式如下:
[SQABasic Object]
Java GUI component=proxy
图一描述的过程展现了Rational Robot是如何使用代理与Java应用程序交互的。对于Rational 所支持的Java代理类,包含在JavaClassMap.dat 里的信息在Robot内部有效。

图 1: Rational Robot's 测试环境
此过程是如下工作的
1、 在录制的时候,Rational Robot侦查用户和AUT之间的交互;通过反省,他知道用户与什么样的控间的类交互。
2、 Rational Robot使用JavaClassMap.dat文件或者使用Robot内部可接受的相似信息,去决定这个类映射到的SQABasic GUI对象和与Java组件相互影响的代理。
3、 然后Rational Robot使用代理学习到关于Java组件的必要信息,生成适当的SQABasic代码。
4、 为了回放已录制的代码,SQABasic代码被转化为Robot可调用的适当的函数或者代理类的函数列表。这些列表一次触发被测组件中的适当的函数。
举个例子,模拟一个用户点击一个Java GUI组件(比如:Jbutton),Rational Robot生成如下SQABasic命令:
PushButton Click, recMethod
这里的recMethod是AUT一个唯一可识别的按钮名称。同样的命令别用于所有的按钮,不管它使用什么语言开发的。
什么时候需要第三方得Java代理
如果被开发的应用程序使用任何明确的可支持标准Java GUI组件的类库,那么Rational支持的代理对于与Robot交互的应用程序就足够了。本文中所说的标准Java GUI组件是指类中可被引用的组件。Jbutton, Jtree和Jplanel都是JFCs中标准的Java GUI组件。
如果客户化的类或者它的父类可以被映射到同一个SQABasic对象,那么使用这样的客户化标准Java GUI组件开发的应用程序也是不需要第三方Java代理的。举个例子,如果一个应用程序使用了BeechButton类,这个类继承了Jbutton(一个标准的Java GUI组件),那么Rational可支持的代理已经足够Robot与组建进行交互。因为BeechButton和Jbutton都可以映射到SQABasic对象,PushButton。
假如一个标准的被支持的类库被用户定制后,它的父类和它映射到不同的SQABasic GUI对象,那么我们将根据客户化类的使用情况确定第三方代理需不需要被使用。
举一个例子,我们假设Jpanel(JFC的组件)映射到SQABasic对象JavaPanel,它被客户制定为一个组件,名为TreeComp,这个组件被映射到SQABasic对象JavaTree。
l 默认不需要第三方代理,Rational Robot将于TreeComp相互关联,把它看成一个JavaPanelObject。在这种情况下,JavaTree的相关函数不能被使用。
l 假如TreeComp被映射到JavaClassMap.dat中的JavaTree,那么Rational Robot将使用Jtree代理与TreeComp进行交互,TreeComp被认为是JavaTree。假如TreeComp使用的所有功能属于Jtree,那么第三方代理将不需要被使用。
l 如果TreeComp执行的功能接近于Jtree,但使用不同的名字,那么Robot仍然会可以使用TreeComp与其进行交互,但是这样的交互式实际上是没有用的。这意味着尽管与TreeComp的交互可以被回放,但是点击树中某选项的动作只是某个坐标位上的点击,对这个对象的数据验证点也将不起作用。
假如这种程度上的交互(点击树中某选项)足够测试程序,那么第三方代理是不被需要的。然而我们需要记住的是,如果我们需要进行数据的验证、使用选择项的函数功能,那么第三方代理将需要被使用。
在测试应用程序和被不明显支持的类库开发的applets时,第三方代理总是被需要的。
举例:什么时候Java代理被Java GUI组建测试需要
为了演示如何决定在测试一个特殊的Java GUI组件时,是否需要使用Java代理。我将使用JBCL类库中的3个Java GUI组件,JBCL类库是Borland公司Jbuilder4提供的库类之一。这些Java GUI组件是:
1. com.borland.jbcl.control.TextFieldControl
2. com.borland.jbcl.control.ButtonControl
3. com.Borland.jbcl.control.TreeControl
我们将逐一讨论
com.borland.jbcl.control.TextFieldControl
它与com.Borland.jbcl.control.TextFieldControl的层级关系是:
java.lang.Object
+-java.awt.Component
+-java.awt.TextComponent
+-java.awt.TextField
+- com.Borland.jbcl.view.TextFieldView
+-com.borland.jbcl.control.TextFieldControl
l java.awt.TextField是com.Borland.jbcl.control.TextFieldControl的根源。
l java.awt.TextField来自于AWT,这是一个可以被Rational Robot明确支持的类库。
l java.awt.TextField和com.Borland.jbcl.control.TextFieldControl可以映射到SQABasic的EditBox对象。因此,Robot完全可以使用自带的AwtTextFieldProxy代理与这个组件交互。
com.borland.jbcl.control.ButtonControl
它与com.Borland.jbcl.control.ButtonControl的层级关系是:
java.lang.Object
+-java.awt.Component
+-java.awt.Container
+-javax.swing.JComponent
+- com.Borland.jbcl.view.BeanPanel
+- com.Borland.jbcl.view.ButtonView
+-com.Borland.jbcl.control.ButtonControl
此处,它的根源之一是javax.swing.Jcomponent,这是一个JFC可支持的类库。Jcomponent 映射到SQABasic的JavaObject,JavaObject仅仅拥有是没有开发过的普通的Java组件的函数功能。
com.borland.jbcl.control.ButtonControl映射到SQABasic的PushButton。默认的,Rational Robot将识别com.Borland.jbcl.conrol.ButtonControl为JavaObject。
对于一个com.Borland.jbcl.control.ButtonControl上的点击动作,Rational Robot将生成SQABasic代码
JavaObject Click, RecMethod, Coord
当RecMethod作为唯一识别的ButtonControl和Coord字段,根据坐标点击的动作将会发生。对象的属性将被取回,并且录制的代码将被成功回放。但是如果ButtonControl的坐标被改变,那么点击ButtonControl的动作将会失败。
为了录制与坐标无关的脚本,ButtonControl可以被映射到SQABasic的PushButton。使用Robot自带的Jbutton代理