Rational Robot是通过录制用户操作进行功能,性能和兼容性测试的自动化测试工具。通过回放录制脚本进行功能和可靠性测试。本文主要介绍Rational Robot针对java程序和applets如何进行功能测试。
Rational Robot当前版本支持用以下类库开发的Java程序和applet程序:
lJava Foundation Classes(JFCs)
lSun的Swing 和 Abstract Windowing Toolkit(AWT)
lSymantec的Visual Café
lSitraka 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模板被放在项目目录下
[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
ljava.awt.TextField是com.Borland.jbcl.control.TextFieldControl的根源。
ljava.awt.TextField来自于AWT,这是一个可以被Rational Robot明确支持的类库。
ljava.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代理: JfcButtonProxy。这种情况下,JfcButtonProxy可以完全与ButtonControl交互,因为JfcButtonProxy执行了IrtButton(pushbuttons的接口),同时只是使用了Jbutton 和ButtonControl的根源 Jcomponent的函数。
com.borland.jbcl.control.TreeControl
com.Borland.jbcl.control.TreeControl作为最后一个例子,它的层次结构展示如下:
Java.lang.Object
+-Java.awt.Component
+-Java.awt.Container
+-Javax.swing.JComponent
+-Javax.swing.JScrollPane
+-- com.Borland.jbcl.view.TreeView
+--com.Borland.jbcl.control.TreeControl
TreeControl最近的父类是可支持的类javax.swing.JScrollPane。JScrollPane映射到SQABasic的对象JavaObject,然而TreeControl映射到JavaTree。
在默认情况下,Rational Robot将把TreeControl看成JavaObject进行交互,JavaObject可以调用所有Java组件的常用函数。对于TreeControl,使用Rational Robot 的JTree (如:JfcTreeProxy)代理,它将不能正常工作。TreeControl不能完全执行JTree的函数,所以他需要第三方控件。
JBCLControls的单个实例
为了更好的阐明这个问题,我们将使用一个简单的例子JBCL Controls,它包括三个Java GUI组件,这三个组件在先前的章节中已经作过介绍。
在附录A中,我们可以看到相应的JBCL Controls代码
为了编译这个应用程序,你将需要:
JBuilder 4专业版提供的针对JBCL组件的The Borland类库jbcl.jar和dx.jar
Sun公司提供的SDK1.3版本
1.复制dx.jar和jbcl.jar到目录 (e.g., d:"jbcllib).
2.复制JBCLControls.java到目录d:"jbclcon.
3.在用户的classpath environment下增加如下语句:
D:"jbcllib"jbcl.jar;D:"jbcllib"dx.jar;D:"jbclcon
4.改变目录d:"jnclcon,并且执行如下语句编译:
javac JBCLControls.java
5.通过Rational Robot运行应用程序,如下图2
图2: 通过Rational Robot运行应用程序JBCLControls.java
另外,你可以向运行applet一样地运行应用程序,使用附录B中的HTML代码。为了运行applet,你必须安装Sun公司的swing类库。
现在,再回到前面使用Rational Robot测试应用程序,然后根据上面讨论的方法检查Robot生成的SQABasic脚本。
如何写一个Java代理
为了开发一个使用于Rational Robot的Java代理,你必须熟悉Java内部的反省,Java外部接口,和被用于开发应用程序或者applet的类库。
为了证明如何写一个嗲里,让我们使用我们前面讨论过的com.Borland.jbcl.control. TreeControl开发一个程序。
一个Rational Robot的Java 代理只不过是一个Java类,它为被测试的SQABasic对象提供了一个特殊指定的接口。就像先前提及的,TreeControl映射到SQABasic的JavaTree对象。IRbtTree是JavaTree的一个接口,它扩展于IRbtBase。这意味着TreeControl代理必须执行IRbtTree的指定函数(包括IrbtBase的指定函数)。
事实上,Rational提供的一些代理服务于基本类代理开发。TreeControl作为javax.swing.JComponent和java.awt.Component的父类。AwtBaseProxy或者JfcBaseProxy(这两个都被Rational支持)能够服务于基本类代理的开发。在本文中,能实现IRbtBase的AwtBaseProxy用于基础类服务。现在还需要实现的是指定在IRbtTree里的剩余的功能(或函数)。
代理类的编写开始时,需要列出属于代理的包和写代理需要的包:
package beech;
import Java.lang.Object;
import Java.awt.Point;
import rational.robot.awt.*;
import rational.robot.openapi.*;
接下来是类的主体:
public class JBCLTreeProxy extends AwtBaseProxy implements IRbtTree
{
public JBCLTreeProxy(){}
...
}
假如构造类被使用,那么公用的关键字将被使用。否则,Robot将无法找到代理或者是在试图调用代理时返回一个错误的信息。
Java proxy is unavailable: Proxy [
完成的代码见附录C。源代码展示的代理仅仅调用了被测是组件中的某个方法。举个例子,接口函数getNodeImage被用于区的每一个TreeControl对象的节点内容。Robot经过getNodeImage节点上的每一个对象,使用TreeControl的get函数的方法。Robot经过的getNodeImage 各节点上的内容被get函数返回。
编译源程序
为了编译源程序,环境变量类路径的设定需要修改。修改方法见最后一部分的描述,如下:
- 运行Java Enabler(见图3)
Start->Program->Rational SuiteTestStudio->Rational Test-> Java Enabler这步骤为Rational Robot和Java 过程的通讯而准备的。
图3:运行Rational Test Enabler for Java
点击安装程序的Complete去搜索所有可以安装的Java环境。一台机器通常有多个Java环境。
图4:选择Java Environments for Testing Runs
从展示的Java环境列表中,选择你需要运行的AUT(见图4)。你只要选择需要支持的JVM,你所选择的所有环境将会用于测试Java应用程序和applets。
点击Next完成安装,安装时将在sqarobot.jar文件中,加上classpath环境变量。
- 发布命令
javac JBCLTreeProxy.java -d
这将在当前路径下创建一个分支路径,在那里放置JBCLTreeProxy.class。
- 发布命令
jar fcv beechProxy.jar beech
这命令将压缩JBCLTreeProxy.class为beechProxy.jar.
发布Java代理
当类文件被压缩成jar格式,该代理已经做好了发布的准备。发布的过程如下:
- 从Rational Robot目录,选择Tools-> Extension Manager
确保Java的额外功能被选择(见图5)
图5:管理额外环境变量列表
- 直接编辑JavaClassMap.dat或者通过GUI去选择:
Tools -> General Options from Robot, 然后点击Java Class Mapping Tab.在Java object type选项中选择JavaTree,就像图6显示的。
图6: Java Class Mapping 对话框
点击Add确定TreeControlclass 和他的代理类(见图7)
图7: Component Class and Proxy 对话框
点击OK.
JavaClassMap.dat中的JavaTreesection将显示为:
[JavaTree]
com.Borland.jbcl.control.TreeControl=beech.JBCLTreeProxy
- 复制代理文件beechProxy.jar,并且Borland文件jbcl.jar和dx.jar到
- 运行Java Enabler:
Start->Program->Rational SuiteTestStudio->Rational Test-> Java Enabler
图8: Rational Test Enabler for Java
点击Special Java Proxies按钮(图8)去选择代理文件位于的项目。为了搜索和运用已经安装的Java环境,我们需要点击Complete或者Quick去安装它们。
- 使用JBCLControls 应用程序测试代理
结论
使用Java代理,Rational Robot能够支持所有的Java类库,只要应用程序是使用可接受的JVM进行开发的。我们已经看到当需要第三方代理,Rational Robot是如何使用和如何编写Java代理去扩展它的能力。你能够使用附录A的应用程序(或者附录B中将其视为Applet运行的HTML页面)去测试你开发的Java代理。
附录
附录A:BCLControls应用程序的源程序
附录B:将JBCLControls作为Apple运行的HTML页面
附录C:BCLTreeProxy的源程序