每个 Rational Functional Tester 支持的实际控件都会对应着一个代理对象(ProxyObject),但有时也会有多个不同的控件对应同一代理对象的情况,如下图所示。出现这种情况的原因是,开发设计人员认为该代理对象提供的通用性接口已经足以覆盖这些控件的测试需求。当然,如果用户对某些控件有着更为细致的操控要求,可以自行拆解、拓展这一部分,使得 Rational Functional Tester 可以完成更细微的测试动作。
图 10. 一对一、一对多的映射关系(rational_ft.rftcust 文件内容局部)
即使是在默认配置下不为 Rational Functional Tester 所支持的新界面控件,用户也可以通过创建对应的代理对象类来拓展 Rational Functional Tester 的支持范围。例如,为了支持 .Net 域的 .Net 2.0 DataGridView 控件,用户可以开发一个代理类 Rational.Test.Ft.Domain.Net.DataGridViewProxy,并把它的声明插入到 rational_ft.rftcust 文件里对应的位置。下面的代码就是更新后的 rational_ft.rftcust 文件片段。
图 11. 用户定制的代理对象映射
Rational Functional Tester 实际运行场景中的交互动作
介绍了相关的众多复杂概念后,接下来我们以最常见的录制、回放动作为例,剖析录制和回放的动作实质。
总体上看,录制和回放的过程会牵涉到对象管理器、域对象、代理对象、测试上下文之间形形色色的交互。
录制过程的交互动作详解
下面是录制测试步骤时,对象管理器和对象管理器代理间的动作:
定位屏幕上某处的对象。例如,proxyAtPoint 方法。
在对象图中获取识别属性,或者初始化对象句柄。例如,getMappedTestObject 方法。
而对于代理对象,录制时会调用到代理类里的以下方法:
表 1. 录制操作所涉代理类方法列表
动作 | 调用方法 |
进程级底层事件 | processMouseEvent() |
定位拖拽动作的目标对象 | getMethodSpecForPoint() |
验证点相关方法 |
getTestDataTypes() getTestData() getProperties() getStandardProperties() getProperty() |
对象结构相关方法 |
getMappableParent() getParent() getChildren() getMappableChildren() getOwner() getOwned() |
对象识别相关方法 |
getRecognitionProperties() shouldBeMapped() getRole() getTestObjectClassName() getRecognitionPropertyWeight() |
某个录制动作的细节如下:
Rational Functional Tester 录制器启动,从对象管理器中取得当前点的代理对象;(实际动作在之后的第二步、第三步完成)
获取所在域的顶级容器对象,返回;
在顶级容器对象的子对象里查找,得到当前点的代理对象,返回;
录制器得到当前操作的代理对象句柄;
处理鼠标事件;
设置事件或动作细节,返回并完成录制
图 12. 录制动作时序图
(查看图 12 大图)
回放过程的交互动作详解
Rational Functional Tester 使用的识别属性值和控件层次结构来识别被测控件,这些信息被集中储存在对象图(Object Map)里。回放时,这些信息被取出来用以选择唯一的界面控件。在必要的时候,Rational Functional Tester 也会搜集诸如屏幕坐标,控件属性等,连同界面控件一起,被表征为脚本端的测试对象(TestObject)。录制时,用户的各种点击、双击或拖拽动作都是被封装为独立的测试对象的方法,比如 button().click(atPoint(10,10)),回放时,Rational Functional Tester 用对象图里保存的识别属性找到对应的按钮型测试对象,再调用点击方法来施加测试动作。
回放时,Rational Functional Tester 客户端进程将请求发送到所有的测试域,在对象图里通过录制的可识别属性辨识出目标对象,不同的识别结果会引发 Rational Functional Tester 不同的后续动作。
表 2. 回放操作对象查找结果及后续行为
结果 | 动作 |
未发现目标对象 | 抛出对象未发现的程序异常 |
发现多个目标对象 | 将对象查找分值和阈值比对,来确定唯一的目标对象;如果不能确定,将抛出对象不确定的程序异常。 |
发现唯一的目标对象 | 代理将启动回放动作。例如,回放之前录制下来的、诸如点击的动作。 |
在识别阈值内,发现多个目标对象 | 抛出对象不确定的程序异常。 |