内容


怎样解决基于 Eclipse 的应用程序测试自动化脚本的回放问题

使用 Rational Functional Tester API 改进测试脚本的三个场景

免费下载:IBM® Rational® Functional Tester 试用版  |  IBM® Rational® 测试人员资源工具包
下载更多的 IBM 软件试用版,并加入 IBM 软件下载与技术交流群组,参与在线交流。

引言

IBM® Rational® Functional Tester 是用于功能性和回归线测试的高级测试自动化工具,它可以在一个基于图形化用户界面(GUI)的程序上录制测试场景,并回放测试场景以实现测试自动化。在录制期间,您可以插入确认点,这些确认点可以从您正在测试的程序中获取特定的数据或者属性。然后在回放期间,这些确认点用来将录制的信息,与现场信息进行比较以确保稳定性。工具会搜索映射的对象,并在测试期间对其执行一系列的操作。

但是,由于对象不存在或者不适当的状态,Playback 特性通常会遇到一些失败情况,在回放期间,如果 GUI 响应时间或者 GUI 到达预期状态所花费的时间,要远远高于录制时间,那么工具所执行的操作就不能在适当的位置找到适当的对象或者它们的状态或属性了,这样脚本回放就会失败。通过按照本文中所介绍的步骤进行操作,您将会学到怎样利用 Rational Functional Tester 程序编程界面(API),来改进脚本以实现基于 Eclipse 程序地可靠测试自动化。

前提条件

如果您拥有下述的知识,那么您就能从本文中学到更多的信息:

  • 熟悉 Eclipse 环境以及为测试下程序配置 Rational Functional Tester
  • 熟悉录制和回放测试脚本,并理解测试脚本的内容

场景

注意:
对于这些范例,IBM® Rational® Software Architect(一种基于 Eclipse 的程序)用作测试下的程序。

本文将会涉及到测试自动化中以下的失败场景,并解释在 Eclipse 工作区中遇到它们时的方案。

  • 场景 1:不匹配的 GUI 响应时间
    在回放期间,如果 GUI 响应时间要比录制期间的时间长,那么自动化工具将不会找到需要执行操作的对象,而测试脚本也将会失败。
  • 场景 2:未预期的活动窗口
    如果在自动化测试的回放期间,出现了一个未预期的活动窗口,那么在录制期间该窗口将不会出现,自动化脚本将会失败。自动化会因为未处理的窗口而停止。
  • 场景 3:不适当的对象状态
    当您在创建确认点时,如果对象没有处于它所预期的状态,那么它会获取所有需要的具体内容。同样,在回放期间,如果并不能确保相同的对象状态,那么确认点将会失败。

图 1 中的图表描述了处理这些场景的基本方法。

图 1. 方案的基本方法
改进脚本的流程图
改进脚本的流程图

图 1 的大图

方案方法基本上可以改进使用 Rational Functional Tester API 的脚本。作出的选择能够处理描述的场景,该场景可能发生在测试自动化场景之中。

创建 Eclipse:准备 Rational Functional Tester 以测试基于 Eclipse 的程序

为了对基于 Eclipse 的程序使用 Rational Functional Tester 自动化测试特性,您必须首先按照下面的方法来创建测试的环境:

  1. 点击 Configure > Enable environment for testing 以打开 Enable Environments 窗口(参见图 2)。
  2. 选择 Eclipse 实例,并点击 Enable。如果 Eclipse 环境尚没有列出,那您您可以点击 Search。
  3. 点击 Finish 以保存您所做的修改。
图 2. 激活环境窗口
激活 Eclipse 平台屏幕截图
激活 Eclipse 平台屏幕截图

修改代码:根据用例来更改自动生成的代码

在这一步中,会获得对自动生成代码所做的更改,以处理前面所描述的一个或者多个失败。每一个失败场景的解决方案,都与下述描述的子部分不同。

场景 1:不匹配的 GUI 响应时间

对于该场景有两个可能的解决方案:

方案 1a. 检查进度条的状态

当您在基于 Eclipse 的程序中创建一个项目时,项目构建和确认会在项目向导完成之后才启动,其中基于 Eclipse 的程序例如 Rational Software Architect 或者 IBM® Rational® Application Developer。有时所花费的时间要比预期的长,脚本回放会失败,因为项目构建没有完成,但是脚本会试着进一步地操作。为了避免这种失败情况的发生,您可以在 Eclipse 工作区右下角查看进度条的状态(参见图 3)。

图 3. Eclipse 工作区进度条
Eclipse 工作区的进度条

代码清单 1 中代码所示的 checkProgess_status() 函数会检查进度条的状态。如果进度条可见的话,那么这就意味着项目构建正在进行当中,而您必须等到它完成为止。当进度条消失时,就意味着构建已经完成,工具可以继续回放了。

清单 1. 检查进度条状态的范例代码
AppObject.ObjectMapper p1 = new AppObject.ObjectMapper();
boolean isProgress=true;
// p1 is the object of ObjectMapper script class.
// getProgressBar is the object map function of progress bar which is defined 
// in the ObjectMapper script class
public void checkProgress_status() {
		do {
			isProgress = p1.getProgressBar().isShowing();
			if (isProgress == false)
				break;
		} while (p1.getProgressBar().exists()
				&& p1.getProgressBar().isShowing());
	}

方案 1b. 回放期间在 TestObjects 之间维持同步化

当您在回放测试脚本时,如果 GUI 的活性很低,那么可能是由于此时它正在载入工作区中的模型,或者连接到一个数据库上或刷新浏览器,然后回放会由于操作所执行的对象并不存在而失败。然后方案就会等到对象出现为止才会进行下去。

代码清单 2 中的范例使用 waitForExistence 方法,它会等到一个对象出现时才会执行。该功能将会确定只有当适当的对象就位时脚本才会被执行。其他的改进还有,它还能够评测 AVT 对象的 GUI 性能,并报告测试日志之中的 GVT 延迟。相似的代码可以用来评测 Eclipse 项目的公布或者代码生成时间。

清单 2. 检查 TestObject 存在性并确定 GUI 延迟的范例代码
import java.util.GregorianCalendar;
public void check_object(TestObject target, long threshold) {
		long startTime = new GregorianCalendar().getTime().getTime();
		target.waitForExistence();
		long stopTime = new GregorianCalendar().getTime().getTime();
		long timeDifference = stopTime - startTime;
		if (timeDifference > threshold)
			logError("GUI performance degradation with TestObject  "
					+ target.toString());
		else if (timeDifference == threshold)
			logWarning("GUI performance criteria just met with TestObject "
					+ target.toString());
		else
			logInfo("GUI performance fine with TestObject " 
                    + target.toString());
	}      
Parameters:
target: Test Object whose existence is tested 
 threshold : Expected time in milliseconds for the object to load or pop up

场景 2:未预期的活动窗口

方案是为下述的场景所设计的。

方案:处理未预期的窗口

不管何时回放期间出现未预期的窗口时,录制和回放之间测试程序对象的同步化都会丢失,而脚本也会失败。出现 WindowActivateFailedException 的例外情况,而对象管理员也会调用 onTestObjectMethodException() 方法。代码清单 3 显示了该方法的语法。

清单 3. onTestObjectMethodException() 方法的语法
void onTestObjectMethodException(ITestObjectMethodState testObjectMethodState,
                                 TestObject foundObject) 
Parameters:
testObjectMethodState - the state of the TestObject method
foundObject - The object used in the method invocation when the exception occurred

代码清单 4 中的代码忽略了 TestObjectMethodException 事件。结果,不管何时未预期的窗口出现同时执行 GUI 操作时,TestObjectMethodException 的忽略函数都会得到调用,它指示了以下的操作:

  • Captures the title of the unexpected window as a warning
  • Captures a snapshot of the unexpected window as a warning
  • Presses the Enter key and continues to execute the script
清单 4. 处理未预期活动窗口的代码范例
public class Trans_01 extends Trans_01Helper implements
		IObjectManagerEventListener {
	public void onTestObjectMethodException(
		ITestObjectMethodState testObjectMethodState, TestObject testObject) {
		logWarning(getScreen().getActiveWindow().getText());
		logWarning("screenshot", getRootTestObject().getScreenSnapshot());
		getScreen().inputKeys("{ENTER}");
		testObjectMethodState.findObjectAgain();
	}
	public void testMain(Object[] args) {
// Testing Code
	}
}

场景 3:不适当的对象状态

方案是为下面所概述的场景而设计的。

方案:将程序对象引入适当的状态,同时获取确认点

确认点会获取关于程序中对象的信息,好为回放期间的比较建立基线信息。在开始创建确认点之前,程序需要在需要的状态之中。例如,如果确认点需要添加至 Eclipse Project Explorer 树形视图中,那么很关键的一点是,在选择测试对象时树会得到适当的展开,这样就可以获得所有需要的具体内容。对象在回放期间必须是同一状态,以便与基线进行比较。

代码清单 5 中的函数使用 Rational Functional Tester API,getTreeNodes,它会返回树形结构的节点。Expand_PE_tree() 函数会将测试对象和 rootnode_to_ignore 作为参数,并展开树形结构的所有节点,这样就可以创建一个适当的确认点了。

清单 5. 在 Eclipse 中展开树形视图的范例代码
	public void Expand_PE_tree( SWTTree tree, String rootnode_to_ignore ) { 
        ITestDataTree iTreeData = (ITestDataTree)tree.getTreeHierarchy(); 
        ITestDataTreeNodes i_Nodes = iTreeData.getTreeNodes(); 
        ITestDataTreeNode[] root_Nodes = i_Nodes.getRootNodes(); 
        for(int i = 0; i < root_Nodes.length; i++) { 
                String nodeData = root_Nodes[i].getNode().toString(); 
                if (!nodeData.equalsIgnoreCase(rootnode_to_ignore)) 

                        { 
                                ITestDataTree iTreeData1 = (ITestDataTree) 
                                tree.getTreeNodeHierarchy(RationalTestScript.atPath 
                                (root_Nodes[i].getNode().toString()), new   
                                String[]{}); 
                        } 
                } 
        }

图 4 显示了展开的 Eclipse Project Explorer,这样就可以在确认点中得到所有需要的具体内容。注意相同的函数可以用于在 Eclipse 工作台中展开所有的树形视图,例如 Properties 视图,Problem 视图,等等。

图 4. 展开的 Eclipse Project Explorer 树忽略了 .Net 方案节点
展开 Project Explorer 的屏幕截图
展开 Project Explorer 的屏幕截图

总结

通过使用 API 来改进脚本,就可以使测试自动化顺利进行,基于 Eclipse 程序地自动化测试就可以更加可靠了。使用标准和通用 API 可以帮助您确保得到完美的测试经验,这些经验可以让您改进测试的质量,并使得整个过程处理起来更加轻松而且快捷。


相关主题

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Rational
ArticleID=642654
ArticleTitle=怎样解决基于 Eclipse 的应用程序测试自动化脚本的回放问题
publish-date=03212011