Rational Functional Tester 进程通讯模型里的每一个进程都需要借由测试上下文(TestContext)对象来管理它的进程间通讯的调用和请求。Rational Functional Tester 客户端进程会和多个被测应用程序(AUT)进程交互,以 Rational Functional Tester 回放时的客户端 Find 进程为例,它会和所有的被测应用程序进行通讯来确定被寻找的控件对象。但在同一时间里,每个被测应用程序进程只能和唯一的 Rational Functional Tester 客户端进程交流。
对象管理器(ObjectManager)处理所有服务器端的进程通讯,以及与被测程序交互的元动作。对象管理器会有多个代理(Agent),每个对象管理器代理负责一类测试上下文对象的相关元动作。
在测试上下文(TestContext)对象里,域(TestDomain)对象是用于管理与它相关的特定通讯。例如,对于被测应用的浏览器进程,一个 HTML 测试上下文对象和一个 Java 域对象会被创建,因为浏览器里包含了隶属于 HTML 域的 HTML 元素,以及隶属于 Java 域的 Java Applets。
而在域(TestDomain)对象里,代理对象(ProxyObject)的作用是管理控件一级的通讯。它被 Rational Functional Tester 创建出来,用以和控件通讯,来操纵它们完成指定的功能测试动作。代理对象和被测应用程序的控件间有着一一对应的关系,任何控件间的交互都是通过代理对象这一媒介来达成。比如,各种不同类型的按钮分别会映射到不同的代理对象。
注:上下文对象,对象管理器,域对象和代理对象都是创建在被测应用程序进程里。
Rational Functional Tester 代理结构
Rational Functional Tester 与被测应用程序控件的交互,有两个必不可少的要素:代理对象(ProxyObject)和测试对象(TestObject)。代理对象包裹着实际的被测应用程序控件,测试对象则是该控件在脚本层面的展现,两者遥相呼应,传递测试的动作和信息。
图 6. Java 代理对象结构图
注:为节约篇幅,这里仅以Java域的内容作介绍,.Net域的情况也大致相似。
通过代理对象进行交互
代理对象(Proxy objects)有些类似于实际图形界面控件的包裹类。Rational Functional Tester 与被测应用程序并不发生直接接触,任何与被测应用程序的通讯都需要对应的代理对象。代理对象创建后,被放置于被测控件能够访问并获取信息的地方。代理类可以用 Java 语言或者 C# 语言来开发,来实现规定的 Rational Functional Tester 与被测应用程序界面控件通讯的接口。
当您的应用程序实施了前文所提到“启用被测应用程序”操作后,它对应的代理类就会被加载到应用程序,成为被测应用程序的一部分。代理对象包裹着实际 GUI 测试对象(原生对象),使得它们可以被 Rational Functional Tester 识别和测试。以 HTML 程序为例,HTML 应用程序的浏览器被启用后,浏览器及其 HTML 控件的代理类都会被加载到浏览器中。对于 Windows Internet Explorer 浏览器,“启用被测应用程序”则会把 Internet Explorer 浏览器相关的代理类——浏览器辅助对象(Browser Helper Object)RTXIEEnabler.dll 文件作为第三方插件装入 Internet Explorer 浏览器插件集,RTXIEEnabler.dll 在启动后还将加载另外两个文件 rtxivsys.dll 和 rtxiedomain.dll,并与它们共同负责 Rational Functional Tester 和 HTML 被测程序间的交互行为。( 该过程和木马病毒的工作原理类似 )
另外,Rational Functional Tester 设计领先、开放灵活的架构允许用户可以创建新的 ProxyObject 类,或拓展某个现有的 ProxyObject 类来支持新的界面控件。
通过测试对象进行的交互
测试对象(TestObject)是被测对象控件的脚本端接口,界面控件在自动测试脚本里会表现为测试对象。例如,一个按钮控件被表述为 GuiTestObject,顶级容器对象如对话框或者框架控件被表述为 TopLevelTestObject。
测试对象(TestObject)方法的执行需要通过相应的代理对象(ProxyObject),测试对象驻留在 Rational Functional Tester 客户端,它拥有指向被测应用程序的代理对象的句柄。
图 7. 测试对象和代理对象间的交互
Rational Functional Tester 对于每个支持的测试环境都已经提供了域对象,如 Java,HTML,.Net 等,并且在每个域里,还提供了所支持的各种被测应用程序控件的代理对象(ProxyObject)类。代理对象类与被测应用程序控件之间的映射关系被保存在 Rational Functional Tester 的安装路径下的可定制文件里,Rational Functional Tester 通过这些可定制信息来确定对于某种被测控件该使用哪种合适的代理对象。
注:被测控件和代理对象间的映射关系主要保存在文件C:\Program Files\IBM\SDP\FunctionalTester\bin\rational_ft.rftcust里。在相同路径下,还存有其他领域的,以及扩展的rftcust定制文件。
图 8. rftcust 定制文件
图 9 是打开后的 rational_ft.rftcust 文件,内容以 XML 格式展示,层次清晰,条理分明。大家可以看到代理管理器(ProxyManager)下辖五类测试域的代理对象,分别是 Java、HTML, .Net, Win 和 ActiveX。展开的 ActiveX 部分里还可以看见映射关系的细节:该领域的 DispHTMLObjectElement 控件对应着 Rational Functional Tester 提供的 Rational.Test.Ft.Domain.ActiveX.IEHtmlObjectElementProxy 类,自动测试脚本将通过这个类来操控 DispHTMLObjectElement 控件上的各种动作,完成既定测试。
图 9. rational_ft.rftcust 文件内容局部