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间通讯功能。