(二)使用getProperty 和 invoke 方法测试定制的Java 控件

发表于:2007-8-06 15:43

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:Tim Snow    来源:网络转载

调用控件方法

        您可以使用 Rational Functional Tester的 TestObject 接口的 invoke 方法去调用 Java 控件的任何方法。因为每个 Java 属性都具有 get-and-set 方法,因此您可以使用 invoke 实现与 getProperty 相同的功能。您将会看到,invoke 方法可以做的更多。

        让我们应用 Editor applet 中的另一个控件,如图 5所示的 Color Canvas 下拉菜单。

图 5. Color Canvas 控件

          

        如果您在控件中选择了颜色,Editor applet 中的文本会显示所选的颜色。为了测试 Editor applet,您需要在控件中获得并设置颜色。

        虽然这个控件看起来像 Swing 或 AWT 组合框,但它并不是。它是由 Lotus 开发者创建的选择颜色的定制控件。由于它不是一个标准控件,Rational Functional Tester 并不知道如何使用它,因此您必须使用控件的方法实现自动化。

        首先,您需要知道控件拥有哪些方法。您可以查看源代码或使用 Java? Reflection? 找到它,您还可以使用 Rational Functional Tester 获得信息。方法如下:

        列表 5: 获得控件的所有方法

/**
* Prints out the methods of an object (omitting methods from java.lang.Object)
* @param to object whose methods you want to print
*/
public static void printMethods(TestObject to) {
MethodInfo[] m = to.getMethods();
for (int i = 0; i < m.length; ++i) {
System.out.println("Method " + i + ": name=" +
m[i].getName() + "; signature=" + m[i].getSignature());
}
}

        这种方法可以获取控件的所有方法并在控制台显示它们。它使用 TestObject 中的 getMethods 方法返回一个 MethodInfo 对象数组。 然后遍历所有成员,显示它们的方法名称。

        您可以像之前使用 printProperties 方法一样调用它,将由 Rational Functional Tester 的对象图(本例中称为 colorCanvas)返回的 GuiTestObject 传递进来,就像这样:

        列表 6: 调用 printMethods

        printMethods(colorCanvas());

        这种方法显示了您可以使用的控件中的所有方法。

        当我运行这段代码时,它显示了 307 种方法!不仅包含了类中定义的所有方法,还包括了其继承类的所有方法。其中的许多内容与您所需要的并不相关,但是显示在顶部的两种方法正是您所需要的:

        方法 1: name=getColor; signature=()Ljava/awt/Color;

        方法 2: name=setColor; signature=(Ljava/awt/Color;)V

        如果您想获取、设置控件的颜色,您必须使用 invoke 方法调用本控件的这两种方法。很明显您需要知道您想调用的方法的名称以使用 invoke 方法, 您还需要知道这个方法所必需的参数和返回值。因此需要知道方法的签名。

        签名以 JNI(Java? Native Interface)格式显示。 参数类型列于圆括号中,在最后列出了返回值的类型。表格 1 来自于 Java 文档,用来解释被用于 invoke 方法的类型符号。

        表格 1. 方法签名的 JNI 格式

Code  Type 
Z boolean 
B byte 
C char 
S short 
Z boolean 
I int 
J long 
Z boolean 
F float 
D double 
V void 
L fully-qualitied-class;;  例如:Ljava.lang.String

        第一个相关的方法,getColor,具有 ()Ljava/awt/Color; 签名。圆括号内是空的,表示了这种方法不包含任何参数。它返回一个 java.awt.Color 类型的对象。正如 L 所表示的那样,分号表示对象名的结束。第二种方法 setColor 具有 (Ljava/awt/Color;)V 签名。它具有 java.awt.Color 类型的参数,用来设置控件颜色。但正如 V所示(表示void),它不返回任何值。

        invoke 方法已被重载。根据是否给调用函数传递参数的不同,它具有两种形式。由于不包含参数的调用形式比较简单,因此我们从它开始。

        为了使用 invoke 方法的第一种形式,您需要做的仅仅是为 invoke 方法传递需要的方法名称。以下代码使用 ColorCanvas 的 getColor 方法,不包含任何参数:


        列表 7: 通知 invoke 您要调用的方法名

        java.awt.Color color = (java.awt.Color)colorCanvas().invoke("getColor");
        getColor 返回一个 java.awt.Color 对象。确保将其存储在变量中,因为那是您获得的信息。但是 invoke 方法(例如getProperty)返回一个 Object 类的对象。为了使用它,您需要将其转变为 java.awt.Color 对象。

注意: 
        正如您看到的,invoke 调用与 getProperty 调用十分相似。如果您认为 Java 对象的所有属性都具有 get-and-set 方法,那一点也不奇怪。事实上,本例中颜色是 ColorCanvas 控件的一种属性,因此您可以使用 getProperty 方法获取相同的信息。

        相比较获取颜色,设置颜色就变得有点复杂。因为 setColor 需要一个参数,您将不得不使用 invoke 的第二种重载形式,需要传递三个参数:

        您要调用的方法名称 
        以 JNI 语法表示方法签名的字符串 
        一组包含需要传递的实际参数值的对象 
        为了从 Rational Functional Tester 中调用 ColorCanvas 的 setColor 方法,您首先要做的就是要决定为 setColor 传递哪些参数。本例中,它只需要一个参数:设置文本的颜色。为了调用这个方法,您需要创建一个颜色对象,并传递给控件。但是 invoke 方法需要您把这种对象存入一个对象数组中,因为任何特殊方法都可能具有多个传递参数。因此,您需要将参数存入数组,然后将其传入 invoke 方法:

        列表 8: 将方法存入数组

Object [] color = {java.awt.Color.red};
colorCanvas().invoke("setColor",
"(Ljava.awt.Color;)V",
color);

        您能够用上述方法使用 invoke,任意设置 Editor applet 的文本颜色。

        虽然从技术角度 invoke 方法的使用效果很好,但仍然有一个问题:您使用了用户不能实现的方式操纵 GUI,但 GUI 自动化的关键点就是确保 GUI 如用户使用一样工作。所以这个例子并不现实,尤其当您试图测试 ColorCanvas控件自身的 GUI,而不仅仅是 applet 的文本。所以最好写入复杂些的代码并点击控件从结果显示中获取颜色。在下一部分,您将看到使用 invoke 后更复杂更现实的实例,它展示了当试图操纵 Java 控件。

一个更复杂的案例

        接下来让我们再看一个更复杂的例子 —— Action Button applet。这个例子的好处不仅在于展示了如何操纵一个 Rational Functional Tester 所不知道的控件,而且证明了如何获取并使用坐标操纵控件。这些都是测试定制控件时经常需要做的。

图 6 展示 Action Button applet 的形态

图 6. Action Bar applet

          

        Rational Functional Tester 将此控件看作一个矩形。回想一下它被映射的时候,它返回一个控件,如图 7所示。

图 7. Action Bar applet 的对象图

             

31/3123>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号