手动将新的 Rational Functional Tester 脚本合并到现有的自动化套件中

一个使用 Rational Software Architect 自动化套件作为用于测试的应用程序的案例分析

本文将介绍手动合并 Rational Functional Tester 脚本的步骤和调整它们的方式。我们使用 Rational® Software Architect 自动化套件的一个案例分析作为示例。

Siddharth Kaushal, 系统测试工程师, IBM

http://www.ibm.com/developerworks/i/p-skaushal.jpgSiddharth Kaushal 是一位资深软件开发人员,在测试和软件测试自动年规划工具方面拥有 8 年多的经验,这些工具包括 Rational Functional Tester、Selenium、Visual Studio Team Test 和 Rational Robot。他获得了以下认证:Sun Certified Java Programmer、QAI Global Institute Certified Software Tester 和 International Software Testing Qualifications Board。



Amit Srivastava, 高级软件工程师, IBM

http://www.ibm.com/developerworks/i/p-amsrivastava.jpgAmit Srivastava 是一位 IBM 高级软件工程师。他研究软件测试自动化工具已有 7 年,包括使用 IBM Rational Robot 和 IBM Rational Functional Tester 的测试自动化项目。



2013 年 11 月 11 日

开始之前

Rational Functional Tester 是一个基于 GUI 的自动化和回归测试工具,用于对跨各种组织的许多产品的测试场景执行自动化。测试团队使用它创建一组自动化脚本。这样一组脚本也称为一个自动化套件。然后,测试团队会使用各种自动化框架运行这些自动化套件。一些人使用在 Rational Functional Tester 中构建的标准框架,另一些人则根据需要创建自己的框架。

在不同框架上工作并使用 Rational Functional Tester 的团队有时会遇到问题,这些问题要么是其框架中所独有的,要么是大多数框架中普遍存在的。但是,一些问题非常普遍,以至于它们的解决方案可为其他组织的人提供帮助。一个示例是手动合并不同时区和地区的不同成员在自己的工作区依照自己的对象映射创建的自动化脚本。

合并脚本看起来是一个简单的过程,但在没有配置管理工具的情况下,它会成为一项困难的工作。您必须让每个脚本按预期方式运行,并且不需要更改自动化套件的现有文件夹结构。但是,如果您需要更文件夹结构,该怎么办?

本文将帮助您了解并克服在手动合并自动化文件夹或调整其结构时会遇到的问题。通过在自动化 Rational Software Architect 产品期间捕获的真实示例,我们将解释这些技巧的使用。这是使用 Rational Functional Tester 进行测试的这些场景中所测试的一个应用程序。当 Rational 软件系统验证测试 (SVT) 团队遇到此问题时,他们必须浏览各种论坛来查找有效的解决方案。本文以解决了该问题的研究结果作为基础。

通过分析真实的示例,本文将帮助读者轻松地与其场景相联系起来,进而帮助他们使用手动合并 Rational Functional Tester 脚本或调整自动化文件夹结构的技巧/诀窍。

本文还将展示如何使用 Rational Functional Tester 应用编程接口 (API),避免在合并期间携带包含脚本的测试对象映射文件的麻烦。


从本文中受到的启发

Rational Functional Tester 已成功用于自动化 Rational Software Architect 的开发场景。该自动化套件是在整个测试团队的帮助下创建的。因为 Rational Software Architect 拥有众多要测试的功能,所以创建来自动化 UI 场景的测试人员脚本形成了一个包含 250 多个脚本的测试套件。测试团队中几乎每个人都有一些功能并完成了自己的部分工作。这增加了覆盖面,但也增加了脚本格式的不一致性。一些脚本遵循使用某种确定的文件夹结构的规则,而一些脚本稍微进行了更改。

创建 Rational Functional Tester 脚本后,任务很简单:将新脚本合并到现有的自动化套件中。事实证明,这个看似简单的任务是最大的挑战,这激发了我们编写这个案例分析。现有的自动化套件是在一种预定义的文件夹结构中创建和维护的。当我们尝试将新脚本与旧套件合并时,出现了许多问题,这迫使我们尝试了多个解决办法来让合并生效。

严格的时间限制和工具经验的缺乏导致我们生成了主要基于对象映射的脚本,只要对象分层结构发生任何变化,这些脚本就很容易出错。所以我们必须返回去检查所有脚本,引入 Rational Functional Tester find() API 来查找几乎所有对象。这成为了我们撰写本文的第二个动机。

在以下各节中,我将使用我们对 Rational Software Architect 自动化套件的案例分析,介绍如何克服在手动将 Rational Functional Tester 脚本合并到现有的自动互框架中时遇到的任何阻碍。


问题和解决方案

在本节中,我们介绍每个问题,然后介绍避免该问题的解决方案或途径。

问题 1. 无法将新创建的脚本导入自动化套件中的一个已定义的文件夹中

Rational Software Architect 示例

Rational SVT 团队有一个文件夹结构,它将所有脚本保存在此分层结构中的 testcases 下:
...\com\ibm\xtools\rsa\testcases\

对于新添加的功能,我们在 Rational Functional Tester 中的同一级别上创建了新的文件夹,我们还尝试在此级别导入了新创建的脚本。但是,Rational Functional Tester 仅允许在根级别导入脚本,不允许将脚本导入到特定的文件夹中(如图 1 所示)。

图 1. 尝试将 Rational Functional Tester 脚本导入一个特定的文件夹中
导入向导屏幕

解决方案

  1. workspace/resources/.../destination folder 和 /workspace/.../destination folder 下手动创建一个文件夹。备注:用您自己的信息替换斜体文字。
  2. 现在手动将以下文件复制到此路径下的目标文件夹中:workspace/resources/.../destination folder
    • *.rftdef
    • *.rftxmap
    • *Helper.class
    • *.java
  3. 类似地,将 *.class 和 *.java 文件复制到目标文件夹中:workspace/.../destination folder
  4. 重新启动 Rational Functional Tester,您可能注意到这些文件夹(以及脚本)现在已在您希望它们所在的位置上(参见图 2)。
图 2. 手动将脚本复制并粘贴到正确的文件夹中
脚本现在显示在 Rational Functional Tester 中

问题 2. 更改的包信息和无组织的导入导致了脚本级别的编译错误

Rational Software Architect 示例

问题 1 的解决方案导致了这个问题。打开脚本后,我们注意到出现了包级别的编译错误,如图 3 所示。

图 3. 指向错误的包的脚本
脚本中的编译错误

解决方案

  1. 使用快速修复方法将旧包信息替换为新包信息,也就是说,在 Rational Functional Tester 编辑器中选择 organize imports 选项。
  2. 要删除编译错误,请右键单击项目,然后选择 reset Java build path(如图 4 所示)。
图 4. 脚本中已更正的包信息
脚本中已修复的编译错误

问题 3. 由于更改了包信息,在脚本帮助器级别上发生了编译错误

Rational Software Architect 示例

解决问题 2 后,似乎一切正常,直到我们尝试回放脚本。由于脚本帮助类中使用了旧包信息,所以回放失败(如图 5 所示)。在理想情况下,我们应将脚本帮助器连同脚本本身一起更新,但没有显示针对脚本帮助器的编译错误,所以我们错误地假设脚本帮助已自动更新。

图 5. 脚本帮助器类指向错误的包
脚本帮助器中的编译错误

解决方案
打开脚本帮助器类,将旧包信息替换为新包信息,以消除编译错误(如图 6 所示)。

图 6. 脚本帮助器中更正的包信息
脚本帮助器中已修复的编译错误

问题 4. 由于在脚本帮助器级别上使用了脚本名称路径,出现了运行时错误

Rational Software Architect 示例

解决问题 3 后,我们再次回放脚本,结果发现了一个运行时错误(如图 7 所示)。Rational Functional Tester 无法找到脚本定义文件,该软件仍在根级别上搜索该文件。

图 7. 回放期间未找到脚本定义文件
控制台中显示的运行时错误

解决方案

  1. 打开脚本帮助器类并搜索 setScriptName() 函数调用。
  2. 现在将脚本名称参数更新为脚本的完整路径(如图 8 中所示)。

这将帮助 Rational Functional Tester 在回放期间找到脚本定义文件。

图 8. 已更新的脚本定义文件路径
修改后的 setScriptName() 函数的参数

问题 5. 脚本文件、数据池文件和对象映射文件导致的运行时错误

Rational Software Architect 示例
解决问题 4 后,我们再次回放脚本,但发现了另一个运行时错误(如图 9 所示)。Rational Functional Tester 无法找到脚本文件、数据池文件和对象映射文件,但它仍在根级别上进行搜索。

图 9. 回放期间未找到对象映射文件
缺少文件导致的控制台中的运行时错误

解决方案

  1. 打开脚本定义文件 (*.rftdef),更新脚本文件、数据池文件和对象映射文件的路径(参见图 10)。这将帮助 Rational Functional Tester 在回放期间找到所需的文件。
  2. 更新代码清单 1、清单 2 和清单 3 中所示的标记,以便应用此解决方案。
清单 1. 更新 ScriptName 标记(示例)
<ScriptName>com.ibm.xtools.rsa.testcases.REST.ClassCreationInPE_Recording</ScriptName>
清单 2. 更新 Map 标记(示例)
<Map>resources/com/ibm/xtools/rsa/testcases/REST/ClassCreationInPE_Recording.rftxmap</Map>
清单 3. 更新 Datapool 标记(示例)
<Datapool/>

备注:
验证点文件 (*.rftvp) 的路径应保持与新创建的脚本中一样。

图 10. 更新了所需路径后的脚本定义文件
一个示例脚本定义文件的内容

问题 6. 由于对象识别或分层结构中的一个更改,对象识别失败

Rational Software Architect 示例
基于各自的 Rational Functional Tester 知识,不同的测试成员向自动化套件贡献了不同的部分。结果,一些脚本更加依赖于对象映射,而且在对象属性或分层结构中出现更改时容易出错。新版 Rational Software Architect 中的 IBM® Eclipse Software Development Kit 中发生更改后,这些脚本开始出错(参见图 11)。

图 11. 回放期间未找到 SWTTree 对象
回放期间的异常窗口

解决方案

  1. 使用 find() API 找到并操作任何容易出错的对象,而不是依据对象映射来使用它。
  2. 在记录的脚本上创建一个抽象层,以便处理与容易出错的脚本的交互。

我们可以通过三个选项完成此任务:

  • 从头编写抽象层,找到每个容易出错的对象,然后对它执行操作。
  • 重用 IBM Business Logic Utilities Environment (BLUE) Test Automation(Blue Package 或 ITCL Framework)的现有类和功能,或者使用 Rational Software Architect 自动化测试团队创建的类和功能。二者都是使用 Rational Functional Tester 公开的 API 编写的。
  • 将现有的对象转换为动态测试对象,然后选择应用程序的根测试对象作为父节点来定位。

资源缺乏、专业经验水平,以及第 2 和第 3 个选项的易用性,促使我们使用它们来实现我们的目标。对现有代码的重用(如图 12 所示)和动态测试对象转换(如 图 13 所示)能帮助我们更快地实现目标。

但是,我们还使用 find() API 的一个变体,编写了代码来查找容易出错的对象。语法如清单 4 所示,示例代码如清单 5 所示。您可以在 Rational Functional Tester 信息中心找到 find() API 的其他变体(参见 参考资料)。这使得您可以选择最适合具体情形的解决方案。

图 12. 使用现有的类查找放错位置的对象
这些屏幕显示了为查找对象而重用的代码
清单 4. 一个 find API 变体的语法
public TestObject[] find(Subitem properties)

清单 4 中的代码会找到所有与给定搜索条件匹配的候选对象。以下是属性 subitem 的有效值:

atProperty
一个名称-值对,表示一个 TestObject 属性。
 
atChild
包含一个或多个必须与开始的 TestObject 的直系子对象相匹配的属性。
 
atDescendant
包含一个或多个可与开始 TestObject 的任何子对象相匹配的属性。
 
atList
用于指定将用于匹配操作的一个属性顺序列表。以下 subitem 可用于 atList:
  • atChild
  • atDescendant
  • atProperty

第一个列表项用作一个匹配值来获取候选对象列表。然后匹配这些候选对象的后辈来获得下一个列表项。

备注:
在清单 5 中,要查找的对象的识别属性和它们的值作为参数传递,以查找根测试对象的特定自对象。

清单 5. 查找/使用缺少的 SWTTree 对象的示例代码
RootTestObject root = getRootTestObject();
//Get all test objects of type JFrame (dialog) for RSx 9.0
TestObject[] tree_parent = root.
find(atDescendant(".class", "org.eclipse.swt.custom.CTabFolder",".tabs",
"{Project Explorer,Inheritance Explorer}"));
		
//Identifying tree under project explorer
TestObject[] tree_PE = tree_parent[0].find(atDescendant("class", 
"org.eclipse.swt.widgets.Tree"));
		
//Getting hold of tree under project explorer as SWTTree object
SWTTree SWTTree_PE = new SWTTree(tree_PE[0]);

//Performing some actions on the SWTTree object
SWTTree_PE.click(atPath("REST->Models->REST Service Model"));
SWTTree_PE.click(RIGHT, atPath("REST->Models-
>REST Service Model"));

//Unregister after object is used
SWTTree_PE.unregister();
图 13. 将一个对象转换为动态测试对象
在脚本中插入一个动态测试对象的向导

结束语

在手动将 Rational Functional Tester 脚本合并到现有自动化套件中的时候,或者在调整自动化的现有文件夹结构期间,可能出现许多问题,本文帮助您克服其中的大多数问题。通读这些解决方案后(它们基于一份 Rational Software Architect 案例分析),您就能够更加实际地发现类似问题并轻松地解决它们。

参考资料

学习

获得产品和技术

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Rational
ArticleID=952438
ArticleTitle=手动将新的 Rational Functional Tester 脚本合并到现有的自动化套件中
publish-date=11112013