详解RFT的工作原理

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

详解IBM Rational Functional Tester
的工作原理
Rational Functional Tester 测试的前提
相信很多读者在接触 Rational Functional Tester 这类自动化测试工具后,都会有这样的疑问:它为什么可以操纵 Java 程序或者浏览器呢?
Rational Functional Tester 可以操控被测控件、完成用户指定的自动测试动作,但前提是它需要具备与被测应用程序(Application Under Test,AUT)进行通讯的能力。

要做到这一点,Rational Functional Tester 首先必须建立自身与被测应用的沟通渠道,该过程对于 Rational Functional Tester 而言,被称为“启用被测应用程序”。

目前 Rational Functional Tester 可以支持如下领域的被测应用程序:基于 Java 平台的程序、基于 .Net 平台的程序、HTML 程序,以及基于 Siebel、SAP、Flex 等特定平台的应用程序。

Rational Functional Tester 提供了这样的一个向导窗口来帮助用户“启用被测应用程序”,在这个简洁的对话框的“启用(Enable)”按钮和“测试(Test)”按钮的背后,还隐藏着更多的细节。

图 1. 启用环境向导对话框
在 Rational Functional Tester 的术语词典里,这里的每一类应用程序都
被称为“域”(domain)。

建立沟通渠道的操作,都是作用在某个特定的“域”上,你可以在 Rational Functional Tester 和“Java 域”之间建立沟通渠道,这就是在 Rational Functional Tester 中启动 Java 被测应用程序的过程;依此类推,你也可以为 .Net 程序、 SAP 程序建立它们和 Rational Functional Tester 之间的特有的沟通渠道,使得 Rational Functional Tester 可以进而对 .Net 程序、 SAP 程序进行测试。

在为每类程序(或进程)建好沟通渠道后,你还需要对渠道进行必要的测试,检验通讯是否能正常工作。

Rational Functional Tester 正是通过这些沟通渠道来对被测程序(或进程)的控件发出指令、执行动作的。

建立沟通渠道时,Rational Functional Tester 对于被测应用程序,会新建一个 DomainImplementation 对象实例,由它来抽象出一个接口,提供具体的域相关细节给 Rational Functional Tester。

DomainImplementation 对象的使命有:
获取该域最高级别的对象
注册该域可用的代理对象
为指定的控件创建代理对象
下图是启用浏览器环境的测试结果,可以看见 Java,HTML 两种DomainImplementation 对象都被加载,来完成 HTML 被测应用的测试。

(因为HTML 应用程序在呈现时会涉及到 Java 内容)
图 2. 浏览器启用的测试结果
“域”、“顶级对象”、“测试对象”、“代理对象”,又有这么多新名词出现,它们和 Rational Functional Tester 的运作有着怎样的关系呢?下面我们会逐一介绍它们的作用和典型动作。

Rational Functional Tester 进程级交互
Rational Functional Tester 进程模型
我们知道,运行中的程序和软件是以进程的形式存在的。

首先我们来看一下Rational Functional Tester 和被测程序间的进程相关细节。

在 Rational Functional Tester 的设计规划里,各个相关进程按照所处位置和相对关系分成两类:客户端进程和服务器端进程。

被测应用程序进程被称为“Rational Functional Tester 服务器端进程”,而录制,回放,对象查看器,和集成开发环境(IDE,Eclipse 或 Visual Studio .Net)等进程则被称为“Rational Functional Tester 客户端进程”。

不论用户使用的是 Java 编程环境还是 .Net 编程环境来进行脚本开发,进程间的关系皆是如此,如下图所示。

更直观地说,与Rational Functional Tester 直接相关的进程是客户端,与被测程序直接相关的进程是服务器端。

图 3. 客户端进程和被测应用程序(服务器端进程)
Rational Functional Tester 与被测应用程序的进程级交互
Rational Functional Tester 客户端进程与被测应用程序进程进行交互,并从中获取必要的相关信息来完成录制、回放、对象查看之类的动作。

它们借助进程间通讯(IPC)层的共享内存进行通讯。

图 4. 进程和测试上下文
Rational Functional Tester 给每个相关进程(包括客户端及服务器进程)创建测试上下文(TestContext)对象,并在共享内存里进行注册,该测试上下文对象
是测试过程中用来操作被测程序的句柄(reference)。

已注册的测试上下文对象将承担关联进程的所有通信。

通常情况下,测试上下文对象会关联到一个操作系统级的被测进程,或测试客户端。

当然,有时会有多个测试上下文对象关联到同一个进程。

两个被测应用程序的测试上下文(TestContext)对象是无法直接通讯的,它们需要一个中介:Rational Functional Tester 客户端进程的测试上下文对象,来传递通讯信息。

图 5 的上半部是 Rational Functional Tester 客户端进程,下半部是各类服务器端进程,即被测程序,它们之间的交流和通讯只能在共享内存区域完成的。

图 5. 进程和测试上下文内部结构
注:侦窥内存,英文术语为Spy Memory,即共享内存,其中的各类测试上下文承担被测程序及Rational Functional Tester间通讯功能。

详解IBM Rational Functional Tester 的工作原理(2)
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 客户端,它拥有指向被测应用程序的代理对象的句柄。

相关文档
最新文档