GUI 对象分布在两种相关的层次结构中:父子和所有与被所有。 父子关系的例子是对话框和包含的按钮。 所有和被所有关系的例子是顶级窗口和对话框。使用对象的任意一种层次结构类型。
在代理实现中,对于底层的对象模型(例如 Java™ 和 HWND)来说,通常会混淆这两种关系,并将所有和被所有关系视为非对称的父子关系。在这种情况下,如果首选关系模型是所有/被所有,那么代理不能包含父代。整个层次结构中均可使用的方法有 getParent()、getChildren()、getOwner() 和 getOwned()。
属性是命名的值。属性本身不包含类型;但值包含类型。避免代理返回不同类型的相同属性。有时属性值可能是对象引用,而不是值引用。如果将该值返回到脚本,那么将其返回为 TestObject。 访问属性的方法包括 getProperty()、setProperty()、getProperties() 和 getNonValueProperties()。
缺省情况下,新的代理对象不会包含对象识别属性和权重。使用对象库来分配识别属性和权重。访问对象识别属性和权重的方法是 getRecognitionProperties() 和 getRecognitionPropertyWeight()。如果父代对象内存在相同类的多个对象,那么添加 .classIndex 属性(负的数字值,由 0 开始)作为子代对象的识别属性。
通常,对象的整个层次结构均是可映射的。但是,某些对象很可能会在测试应用程序构建之间频繁更改。例如在 Java 中,最常见的是将面板一起添加到集群对象。使用 Functional Tester,用户可以指定不要映射代理对象。即使非映射对象不在测试对象映射中,在穿过父子层次结构时,对象层次结构还是会列出它们。管理可映射层次结构的方法包括 shouldBeMapped()、getMappableParent() 和 getMappableChildren()。
某些情况下,底层的对象模型支持属性概念,例如,Java、HTML 和 .NET。Functional Tester 允许代理实现其他属性。如果代理直接实现属性,那么属性名称必须是其他模式,以避免和对象的其他属性混淆。 可能用于识别的常规属性名应该以一个点 (.) 开始。. 某些无法用于识别的框架可以使用某些管理属性,这些属性名以数字符号 (#) 开始。
很多情况下,底层对象包含可以查找和调用的方法。框架和域实现通常直接管理这些方法,但 getMethod() 通常在域中的基本代理上实现。
只要可能,即从类中执行鼠标操作回放。如果方法名称包含“click”或“drag”,那么鼠标事件执行操作。如果没有使用鼠标事件来实现操作,那么不要使用诸如“click”或“drag”此类的方法名称。如果键盘事件没有实现操作,那么请勿使用引用键或键盘的方法名称。使方法反映回放期间要执行的可靠操作。避免启发式引用。
对象可以包含其他对象,并且包含的内部结构不能显示为嵌套对象或对象。例如,列表中可能包含项,但不能按照列表对象将项显示为对象本身。这种行为在基于 HWND 的对象中比较常见。处理 subitem 的最常用方法是 getSubitem() 和鼠标操作方法,例如 click()、drag() 和doubleClick()。getSubitem() 方法返回 null 或字符串。
如果不希望 subitem 中的对象显示为完整的对象,那么请使用以下任意一种策略:
声明 subitem 代理为不可映射。点上的对象与其父代进行对话,从而父代代理负责针对聚集对象的录制操作并负责支持基于 subitem 的 GUI 操作的回放。
录制期间,subitem 代理将 processMouseEvent() 调用传递至其父代。父代代理负责针对聚集对象的录制操作并负责支持基于 subitem 的 GUI 操作的回放。
录制期间,subitem 代理处理 processMouseEvent() 调用,并在父代对象上生成方法调用。父代代理不负责针对聚集对象的录制操作,但负责支持基于 subitem 的 GUI 操作回放。
包含已标记的新类型对象引用,这样将其作为锚点使用后,即可注销引用。 这可以锚定使用其他对象 subitem 的对象。您可以将嵌套对象映射为父代对象的子代。
实现异常和错误时请遵循以下这些规则:
请勿从代理中抛出专用或内部异常。您的代理 API 文档可能不可用。 使用标准异常,首选 RationalTestExceptions。
复用 com.rational.test.ft package(Java 格式)或 Rational.Test.Ft namespace(.Net 格式)中的异常。如果 java 代理抛出 com.rational.test.ftMethodNotFoundException 异常,且在 VB 中编写脚本,那么 VB 脚本得到 Rational.Test.Ft.MethodNotFoundException 异常。如果在 com.rational.test.ft 下抛出的异常名称不以 com 开头,那么将其反序列化 (marshal) 为WrappedException 异常。
所有可反序列化 (marshal) 的 RationalTestExceptions 必须支持接受单一字符串参数的构造函数。
如果您在以 Java 实现的代理中添加期望能够返回客户机的新异常,那么请确保以 .Net 格式实现同一异常。
在 Java 中,必须声明异常,这对某些测试人员来说可能是无用的。几乎所有 GUI 方法均会出现很多异常,因此使用运行时异常而不是 Java 异常。避免使用错误。错误会造成整个回放或录制器会话停止。
如果未找到对象,那么框架抛出 ObjectNotFoundException 异常。如果找到对象,但未找到指定的 subitem,那么代理必须抛出 SubItemNotFoundException 异常。框架会检测SubItemNotFoundException,该异常会自动重试。
如果输入的坐标单击超出区域的对象或 subitem,那么请更改坐标,以包含对象或 subitem 中的区域。出现这种情况时,请在日志中添加机制以生成警告。代理可能必须使用基于坐标的单击,因为无法完全显示对象屏幕布局。例如,在 JTree 上,PLUS_MINUS 布局未知,但可以根据其应用的 subitem 将其找到。代理可以展开 subitem 区域来包含 PLUS_MINUS。您可以为 subitem 使用负坐标。存档正常行为的所有违例。请确保除对象外不再有包含指定坐标单击的 subitem。
如果单击了错误的对象,那么抛出 com.rational.test.ft.CoordinateOnWrongObjectException 异常。错误对象可能会重叠正确的目标。您可以更改坐标,从而忽略容器中的子代对象。忽略指定的点,并查找相应的对象单击的其他点。避免录制包含可映射子代的对象上的坐标,避免录制包含可映射子代的对象上的坐标,且不允许单击错误对象。
如果单击了错误的 subitem,那么抛出 com.rational.test.ft.CoordinateOnWrongSubitemException 异常。此异常不适用于与没有指定 subitem 的对象关联的单击。只有单击对象及对象中的所有 subitem 时,才应用此类型单击。在这种情况下,错误的 subitem 重叠正确的目标,且是子代对象。避免录制包含嵌套 subitem 的 subitem 上的坐标,从而避免此类异常。 忽略指定点,并查找相应的 subitem 上要单击的其他点。