UML软件工程组织

使用 IBM Rational Functional Tester 6.1 进行功能测试: 第二部分:测试脚本扩展、测试对象地图和对象识别

 

来源: IBM

 

本文内容包括:

本文将介绍如何使用Rational Functional Tester中的脚本扩展、测试对象地图和对象识别的特性,创建出能够准确模拟现实测试操作的测试脚本。

Functional Tester 脚本简介

一个 Functional Tester 测试脚本的类层次结构

如果你使用的是Rational Functional Tester Java scripting,那么测试脚本是使用 Java 语言进行编写的。一个 Functional Tester 的测试脚本存在于一个类的层次结构中,并从相应的父类继承而来。下面的图显示了这个类的层次级别和每一个特定的级别所提供的功能。

 
  • Rational TestScript 提供了基础的功能,它是所有Functional Tester测试脚本的根层次。每一个测试脚本都从这个类扩展而来,例如,你能够重载缺省的事件处理器(event handler)来提供你自己的应用程序特定的事件处理器。
  • helper super 类 (可选的)提供了对基础级别方法的重载的支持。
  • script helper 类 提供了为访问测试对象和验证点特定的脚本方法。这些特定脚本的方法简化了脚本命令并改进了Functional Tester 脚本的可读性。但是你不应该去编辑 script helper 类。
  • Functional Tester script包含了被录制的或者脚本化的命令,这些命令构成了一个特定的功能测试。你能够通过与Functional Tester项目相关联的模板文件定制 Functional Tester script 类和 script helper 类的格式。

Functional Tester 脚本包含的内容

一个 Functional Tester 脚本是一个由 Java 语句组成的文本文件,它是由Functional Tester 在录制脚本过程中生成的,并且可以向其中手工添加语句。当测试脚本被回放时,Functional Tester 通过执行脚本中的语句来重现功能测试的动作。

一个Functional Tester 脚本包括四个主要的语句分类:

  • 由RationalTestScript 继承的方法,比如,startApp() 和logTestResult()。
  • 在测试对象上调用的方法,比如Click()或者 Drag()。
  • 执行验证点的语句。
  • 任何你需要的但没有被Functional Tester 生成的 Java 代码。

在Functional Tester 脚本中启动被应用程序

如果你没有手工修改脚本,在 Functional Tester脚本中的第一条语句应该 startApp()语句。例如:

public void testMain (Object[] args) 
{ startApp("ClassicsJavaA"); .... }

startApp()方法的参数是你要启动的应用程序的名字。

因为Functional Tester脚本应该能够在不同的计算机和操作系统下被执行的,因此Functional Tester 将应用的启动信息存储在一个配置文件中,而不是脚本中。

回放用户操作

用户操作包括所有在录制测试期间被测试应用在 GUI 对象上执行的动作。例如,包括点击一个按钮、选择一个列表中的某一项和向一个表单内输入数据。

在一个脚本中,点击动作表示为一个在对象上执行的方法,比如点击一个名为 PlaceOrder 的按钮。

Functional Tester 如何能够定位测试回放要点击的目标对象呢?

首先,当前脚本的 helper script 包含一个命名为 PlaceOrder 的相应的方法,这个方法会去与 PlaceOrder 按钮相关联的MappedTestObject的对象地图进行搜索。MappedTestObject包含了被测试应用中相应对象的识别属性。接下来,Functional Tester将 MappedTestObject中对象的识别属性与目标对象的属性进行比较。最后,如果比较结果是匹配的,PlaceOrder helper 就构建一个与 PlaceOrder关联的GuiTestObject 对象,然后Functional Tester 调用 GuiTestObject 对象上的 click 方法(执行点击动作)。
  验证点

脚本中的验证点也是以方法的形式表示的,验证点名字是在验证点被录制时由测试人员指定的验证点决定的。验证点的名字总是表示为 *** VP().performTest();

例如:

    Order_Total_AmountVP().performTest();

编辑脚本

脚本编辑特性

Functional Tester 的 Java Development Tooling (JDT)提供了一个编辑器,使用它你能够使用 Java 语言进行测试脚本的编辑。这个编辑器有以下特性:

  • 语法突出表示:帮助查找和编辑脚本中的不同元素。不同的语法元素(比如,注释、关键字和内建类型等)使用不同的颜色进行突出表示,这样能够使你更容易的查看和编辑脚本。

    上图中"注释是绿色的",绿字漏了

  • 内容(代码)助手:当你输入某些代码片断时,内容(代码)助手自动帮助你完成代码。在你想要自动完成代码的地方按住<Ctrl><Space bar>键。下图中的一个列表显示出来,你可以在列表中选择你需要的选项。

  • 代码格式化:当你正在编辑一个脚本时,这个特性可以通过上下文菜单得到。右键点击你想要格式化的代码,以显示上下文菜单。你能够通过窗口>首选项>Java >代码格式器来设置代码格式化的配置。

  • 文本提示:当你将鼠标光标放到一个对象或者方法上时,将会显示出这个对象的属性或者方法被定义在哪个Java包中。

  • 显示所有/显示部分源码:你能够隐藏你需要看到的脚本部分。你可以通过点击代码左侧的下拉箭头来显示和隐藏某些代码部分。

  • 导入助手:你能够通过导入向导来将各种外部的资源导入到选定的项目中。

集成开发环境

你可以使用 Java 编辑器来编辑一个脚本。

  • 你正在编辑的脚本的名字出现在编辑器窗口顶端的标签页上。名字左边的星号(*)代表这个脚本已经被修改但没被保存。
  • 你能够在Java编辑器中同时打开多个脚本,然后通过点击标签页在这些脚本间进行切换。
  • 如果脚本存在问题,一个问题标记将出现在有问题的代码行上。
  • 右键点击 Java 编辑器将显示能够帮助你编辑脚本的菜单。

  • 问题视图将显示错误、警告和其他被编译器自动产生的信息。

  • 为了打开问题视图,点击Test 透视图中的问题标签,或者点击窗口>显示视图>基本>问题。
  • 当你双击问题视图中的某一个问题项时,Functional Tester 将定位到这个问题在脚本中的代码行上。
  • 缺省情况下,问题视图显示所有的项目中的问题,你可以通过点击过滤器按钮来应用一个过滤器。
 

在参数页面的设置值将影响每一个Functional Tester 用户的全局设置。如果你想仅仅改变一个单独的测试脚本的设置,而不影响其他的脚本设置,你可以编辑脚本来覆盖被全局的设置。

你能够在脚本中使用一些方法(命令)来控制回放选项(参数设置):

  • getOption 返回当前的一个选项的设置值。
  • setOption 为一个选项指定值。
  • resetOption 重置一个选项的值到它的缺省值。

例如,为了对一个单独的脚本降低回放速度,你能够在脚本中改变时间累加器。Functional Tester 对所有的脚本应用在参数页面设置的时间累积器的值,除了在脚本中设置时间累加器的这种情况。设置参数的代码例子:

setOption(IOptionName.TIME_MULTIPLIER,10.0);被用来改变参数设置的方法(getOption, setOption, and resetOption)是被定义在IoptionName 接口中的,这个接口是 com.rational.test.ft.script 包中的一部分。要想了解这个接口的更多信息,你可以查看 Functional Tester 的API Reference 。 Functional Tester 的代码/内容助手特性能够帮助你准确并高效的编写设置参数的代码。


处理未预期的活动窗口

在 GUI 测试中的一个通常问题是未预期活动窗口的出现。如果你在录制期间点击一个窗口的 OK 按钮,点击动作将被录制下来。如果在回放的时候这个窗口没有出现,OK 按钮没有被找到,脚本将失败。如果你将按钮点击从脚本中删除,在回放时,如果这个窗口出现了脚本同样还是会失败。我们如何来处理这种情况呢?

在 Functional Tester 脚本中,onTestObjectMethodException 事件被用来处理一个未预期激活窗口出现的情况。

实现 onTestObjectMethodException 事件:

  • 添加一个方法来使用这个事件;
  • 调用一个 helper super script 来处理 Functional Test 脚本可以处理情况的事件;
  • 当未预期激活窗口的情况发生时,处理事件。

处理一个未期望的活动窗口What to do

为了处理一个未期望的活动窗口,修改脚本:

1. 添加一个方法来重载 onTestObjectMethodException 事件。

2. 添加 if 语句来判断 WindowActivateFailedException 异常是否发生。在这个循环中,调用 Iwindow接口来获取导致问题的活动窗口的信息。

3. 在调用 IWindow 接口下添加一个 if 语句来判断是否活动窗口已经出现。如果出现了,发送一个回车命令给它。活动窗口接到回车命令后,在期望的对象上执行命令。

代码例子:

public void onTestObjectMethodException (ITestObjectMethodState testObjectMethodState, 
    TestObject,foundObject)

场景1:录制一个脚本,向脚本代码添加一个消息框

步骤:

2. 启动 ClassicsJavaA 应用程序。

3.在目录树中展开 Haydn 节点,选择 Symphonies Nos. 99 & 101选项。

5.点击 Place Order 按钮。会员登陆对话框出现。

6.添加一个 Password 文本框的数据验证点。点击 OK 按钮。进入 Place an Order 窗口。

7.在 Card Number 域输入 12345678,在Expiration Date 域输入 05-012-30 。

8.点击 Place Order 按钮。

9.在记录监视器中停止录制。

10.测试脚本被生成,并在 Java 编辑器中打开。

11.回放脚本。

12.使用缺省的日志设置。

13.查看日志结果。

14.关闭日志。

15.在测试透视图中,确认 Script1已经在 Java 编辑器中打开。

16.在代码行 import com.rational.test.ft.vp.*; 的下一行,添加 import javax.swing.JOptionPane;

17.在 StartApp 的上一行添加一段注释。

19.确认代码的正确性,保存代码。

20.运行脚本 Script1。在回放监视器出现后,请注意一个消息对话框弹出。这个对话框正式我们在脚本中添加的代码所产生的。

21.点击确定按钮。ClassicsJavaA 应用程序启动。等到回放完成。

22.查看日志。脚本正确的执行了。日志中没有显示失败和警告。

场景2:在脚本中重载参数设置

步骤:

1. 点击 帮助 > Functional Test API Reference 。

 

2. 展开 API Reference

3. 选中 com.rational.test.ft.script 。



 

4. 点击 IOptionName 链接

5. 你可以在这里查看关于使用IOptionName 接口设置选项的内容。

6. 关闭帮助窗口。

7. 在测试透视图中打开场景1录制的脚本Script1。

8. 将在场景1中添加的代码注释掉。

9. 在StartApp行的下一行输入 setOption(IOptionName.



 

10. 在下拉列表中选择 TIME_MULTIPLIER 。



 

11. 再输入 ,10.0 ); 。

12. 完成以下代码。



 

13. 确保代码的正确性,并保存脚本。

14. 回放脚本。注意观察控制台视图的内容,显示出了我们添加的代码已经将时间累加器的值从1.0变为了10.0。



测试对象地图和对象识别

测试对象地图

Functional Test 测试对象地图列出了被测试应用中的测试对象。它是一个描述了在被测试应用中Functional Test 能够识别的测试对象的静态视图。

一个测试对象地图能够包括来自多个应用的对象。测试对象地图提供了一种向一个脚本添加测试对象的快速方法。因为测试对象地图包含了每个对象的识别属性,所以你能够在一个地方更新这些信息。任何引用了测试对象地图的脚本都会共享被更新的信息。

当你录制一个脚本时,Functional Test 创建一个对象地图(或者使用一个已存在的共享地图)。每个脚本与一个测试对象地图文件相关联。地图文件可以是仅仅被一个脚本专用的(*.rftxmap),或者是在多个脚本之间共享的(*.rftmap)。

你能够将专用的或者共享的测试对象地图合并成为一个共享的测试对象地图。



 

脚本与测试对象地图

每个Functional Tester 脚本都要与一个测试对象地图相关联。一个测试对象地图可以是专用的,也可以是共享的。

专用的:

  • 仅仅与一个脚本相关联
  • 当你录制测试脚本时自动生成


 

共享的:

  • 可以与一个或者多个脚本相关联
  • 必须与脚本录制分开创建


 

脚本与测试对象的引用

  • 一个 Functional Tester 脚本是一个在应用程序对象上执行的Java 指令序列,并搜寻关于对象的信息。
  • 一条指令命名一个对象并指定在对象上执行的动作。

  • 一个脚本是不包括测试对象的,它仅仅是对对象进行引用。
  • Functional Tester 的脚本浏览器列出了在脚本中引用的所有测试对象。

从下图中可以看到脚本代码与测试对象地图的映射关系。



 

从下图中可以看到脚本中应用的测试对象在脚本浏览器中显示出来。




  创建并使用一个测试对象地图

下面描述了如何创建和编辑一个在测试中能够使用的测试对象地图。你创建一个测试对象地图,然后对它进行细化以能够更加准确的描述应用,并且与你创建的其他脚本共享这个测试对象地图。

1. 使用 Functional Test Java Scripting 创建一个新的测试地图。注意: 当你录制一个脚本时,Functional Test 会创建一个测试对象地图(或者使用一个已存在的共享地图)。

为测试对象地图分配一个名字。

  • 启动要测试的应用。
  • 包括所有应用中你想要测试的对象。
  • 编辑对象属性。例如,你可以将一个识别属性值转化成一个正则表达式,这将使对象的识别更加灵活。
  • 为每个对象,描述它的目的以反映你为什么要创建它。

2. 录制一个脚本。

在选择脚本资产页面中的测试对象图域中点击浏览来选择一个你已经创建的共享对象图。



 

3. 回放脚本。

你现在拥有了一个用于测试你的应用程序的测试对象地图了。你能够将这个对象地图在其他脚本之间进行共享。如果测试对象地图被多个脚本使用,你就非常有必要改变对象地图中的识别和管理属性,这将允许被关联的脚本使用这个改进了的应用定义来运行。

创建一个新的测试对象地图

为了创建一个自定义的、共享的测试对象地图:

1. 启动创建新的测试对象地图向导:

  • 在Functional Test 工具栏中,点击创建测试对象地图按钮
  • 从Functional Test 菜单中,点击 文件 > 新建 > 创建测试对象地图。

2. 输入或者选择一个项目路径。

3. 在创建测试对象地图页面,图名称域中输入新的测试对象地图的名字。



 

4. 为了将新的对象地图作为项目的缺省地图,选中将该测试对象地图设置为新脚本的缺省选择检查框。无论你录制或创建一个新的脚本,Functional Test 都将使用这个测试对象地图。



 

提示: 为了清除这个缺省的分配:

  • 在项目视图中,右键点击测试对象地图,并点击作为项目缺省值清除。

  • 你也可以个通过在项目视图中右键点击测试对象视图,选择设置为项目缺省值来将一个测试对象地图设置为项目的缺省对象地图。

6. 点击 下一步。

7. 在将测试对象复制到新的测试对象图页面,选择你想要创建的测试对象图的类型:

  • 创建一个空的测试对象图:

    a. .点击不复制任何测试对象。

    b. 点击 完成。

  • 为了创建一个使用一个或者多个已存在的测试对象图作为模板的对象图:

    a. 点击选择要从中复制测试对象的测试对象图和脚本。

    b. 选择一个或多个对象图,为了选择多个对象图和脚本,按住 Ctrl 键。

    c. 为了继续使用你选择的脚本新建测试对象图,选择将选中的脚本与新的测试对象图相链接。

    d. 点击 完成。

Functional Tester 将合并来自被选中的对象图和脚本的测试对象成为一个测试对象图。

8. 如果有必要相对象图中添加测试对象。

9. 编辑对象属性。

向一个测试对象图中添加对象

为了向一个测试对象图中添加对象:

1. 从测试对象图的菜单中,点击应用程序>运行来打开选择应用程序对话框。



 

2. 在应用程序名称域,选择包含你想要添加的测试对象的应用,并点击确定。



 

3. 在测试对象图的工具栏,点击测试对象:插入对象按钮

Functional Tester 打开将 GUI对象插入对象图对话框。

4. 在选择一个对象页面,点击对象查找器图标 ,并将它拖到你想要添加的测试对象图中的对象上方。

5. 在选择对象选项页面,选择下列选项之一:

  • 仅选中的对象 - 选择你选中的对象插入到测试对象图中。
  • 包含所选中对象的兄弟对象 - 选中包含被选对象的直接子对象。
  • 包含本窗口所有可用的对象 - 选择包括当前窗口所有可见的控件对象进入测试对象图。

6. 点击 完成。

7. 如果有必要,重复上面的步骤添加其他的控件对象。

8. 保存测试对象图,点击文件:保存 按钮。

编辑对象属性

你能够在测试对象地图窗口的下方的区域编辑属性集合中的信息。为了编辑每个标签中的一个值,鼠标双击这个值。

识别标签显示出在执行期间被用于发现对象的数据。



 

例如,你能够为识别标签中的一项改变权重来设置执行过程中发现对象的强调程度。权重的值从100到0,100 表示最重要,0表示最不重要。

管理标签显示出测试对象的内部管理信息。这些属性被用来管理和描述测试对象。更新这个标签中的属性将会影响到使用这个测试对象的脚本代码的生成。例如,更新了描述性名称属性,将导致下一次这个测试对象的新名字被添加到脚本中。被标记为只读的属性是不可编辑的。



 

显示相关联的脚本

为了查看与一个测试对象图相关联的脚本列表:

1. 打开测试对象图。

2. 以两种方法之一开打关联的脚本对话框:

  • 在测试对象图的工具栏,点击关联的脚本 按钮。
  • 在测试对象图菜单,点击测试对象>关联的脚本。


 

Functional Tester 显示出一个与测试对象图相关联的脚本列表。

你能够使用这个列表选择多个脚本来向他们中添加测试对象。

添加测试对象到脚本

为了使用测试对象在一个或者多个脚本中包含一个对象:

1. 打开测试对象图。

2. 为了添加测试对象到多个脚本:

  • 点击 测试对象> 关联的脚本。

  • 在关联的脚本对话框,选择你想要向其中添加测试对象的脚本,并点击确定。

3. 在测试对象图中,选择你想要包含在测试脚本中的测试对象。

4. 在测试对象图的工具栏,点击测试对象:添加到脚本 按钮。

将被选中的对象放到了脚本浏览器中。



 

在Java 编辑器中,将鼠标的光标放置在你想要添加对象的地方。

5. 在脚本浏览器中,右键点击你在脚本中应用的对象。

6. 点击在光标处插入。



 

Functional Tester 显示了一个这个对象可用的方法列表。



 

8. 双击你想使用的方法。

Functional Tester 将在光标处插入对象和被选中的方法。

9. 重复步骤2到8,插入其他你想使用的测试对象到脚本中。
 对象识别

处理对象识别问题

如果日志显示识别警告和失败,我们应该怎么办?

如果一个测试对象明显的变化了,我们该如何确保 Functional Tester 还能发现它?

例如,Functional Tester 在回放时发现一个按钮,它如何知道这个按钮就是和录制时相同的按钮?



 

解决这个问题的方法是控制并使用对象识别值。

为了在回放期间识别到测试对象,Functional Tester 使用:

  • 识别属性权重。
  • ScriptAssure 设置。

进一步观察测试对象

每一个测试对象的属性都有一个相应的识别权重。

下图显示的例子中,Button 对象有五个属性:Name、Type、Role 和 Class 属性的权重都是100,而 Index 属性的权重是50。



 

每个测试对象图中的对象在他们的识别属性中都具有一个权重值。这个权重值从 0 到 100。



 

对象识别记分

在对匹配到对象图中的一个对象的每次查找期间,Functional Tester 将比较每一个匹配候选的属性值和对象地图中的属性值。在比较结束的时候,每个匹配候选都会收到一个基于每个属性权重的识别记分。例如,如果匹配候选与对象图中的某个属性值不同,并且这个属性具有一个100 的权重,那么匹配候选将收到一个值为 10,000 的识别记分。

识别记分反映了匹配候选与对象图中的对象的差异程度。一个完美的匹配将收到一个值为 0 的记分,这意味着两个对象完全相同。一个与对象图中对象差异很大的匹配候选将收到一个值很高的记分。



 

ScriptAssure 设置

ScriptAssure 设置定义了 Functional Tester 应用的规则,Functional Tester 使用这个设置规则来指定识别记分,一个候选是否是匹配的。

ScriptAssure的设置分为标准和高级两种:

标准的 ScriptAssure设置包括了识别基本和警告级别。



 

识别级别决定了Functional Tester 确定一个对象的识别属性与匹配候选之间差异的严格程度。

警告级别决定了在哪一个点上Functional Tester 将向测试日志报告一个匹配差异。

ScriptAssure 设置: 高级的 ScriptAssure



 

设置包含可ScriptAssure的容错级别,你可以通过设置数值为各项设置新的分数和阀值。

为了设置 ScriptAssure :

  1. 选择 窗口 > 首选项 。
  2. 展开 Functional Test 。
  3. 点击 ScriptAssure 。
  4. 通过滑杆的移动改变识别级别和警告级别的设置。
  5. 点击应用或者确定保存设置变更。

基于模式的对象识别

另一种影响Functional Tester处理对象识别的方法是扩展可接受属性值的范围。使用下面描述的基于模式的对象识别技术通过更加可靠的对象识别来设计更加灵活的测试。

  • 正则表达式
    • 描述将通过测试的字符串集合,而没有必要列出所有的字符串。
    • 根据一个模式匹配字符串。
  • 数字范围
    • 指定一个将通过测试的数值范围。

使用正则表达式

你的应用可能有一个动态的对象,或者一个应用有几个版本,每个版本中的同一个对象有明显的不同。使用正则表达式能够接受更多的属性值。



 

在这个例子中:

  • 使用 [cC] 来接受大写或者小写的字母C。
  • 设定一个多选的场景,每一个被指定的字符串都是被接受的。使用数字范围

你能够使用一个数字范围来允许更多的值被接受。



 

场景2:录制一个脚本并查看这个脚本的专用测试对象图

步骤:

1.录制一个脚本。命名这个测试为Script3。在选择脚本资产页面中,点击测试对象图后的浏览按钮。选择测试对象图对话框弹出。



 

2.在选择测试对象图对话框中,选择专用测试对象图,并点击确定。这表示你在录制测试时会使用每个脚本专用的测试对象图。



 

3.回到选择测试资产页面,点击完成。

4.记录监视器弹出,点击启动应用程序按钮。



 

5.选择ClassicsJavaA 程序。点击确定。



 

6.ClassicsJavaA 窗口打开,在窗口上面的目录树中,展开haydn节点,并选择Violin Concertos 。点击Place Order 按钮。



 

7.Member Logon 对话框出现。



 

8.点击记录监视器的插入验证点或操作命令按钮。



 

9.插入一个 password 文本框对象验证点。



 

10.点击 Member Logon 对话框的 OK 。



 

11.点击Place an Order 对话框的 Cancel 。

12.关闭 ClassicsJavaA 程序,停止录制。

13.测试脚本被生成,并在 Java 编辑器中打开。



 

14.点击窗口>显示视图>脚本资源管理器。



 

15.脚本资源管理器视图打开,你能够看到刚才我们录制脚本中的测试对象。



 

16.鼠标双击

17.测试对象图窗口打开。你可以在这个里对我们刚录制脚本的测试对象的属性进行编辑。



 

18.关闭测试对象图窗口。

场景3:创建一个共享的测试对象图

步骤:

1.右键点击测试项目 Project1,点击添加测试对象图。



 

2.将测试对象图命名为TestObjectMap1,选中 。点击下一步。



 

3.选中 ,点击完成。



 

4.在测试项目视图中增加了一个



 

5.测试对象图窗口弹出,现在我们创建的测试对象图还是空的。

6.现在我们通过录制一个脚本的过程向这个测试对象图中添加测试对象。录制一个脚本。命名这个测试为Script4。在选择脚本资产页面中,点击测试对象图后的浏览按钮。选择测试对象图对话框弹出。



 

7.在选择测试对象图对话框中,选择 ,并点击确定。这表示你在录制测试时会使用这个共享的测试对象图。



 

8.回到选择测试资产页面,点击完成。

9.记录监视器弹出,点击启动应用程序按钮。



 

10.选择ClassicsJavaA 程序。点击确定。



 

11.ClassicsJavaA 窗口打开,在窗口上面的目录树中,展开haydn节点,并选择Violin Concertos 。点击Place Order 按钮。



 

12.Member Logon 对话框出现。



 

13.点击记录监视器的插入验证点或操作命令按钮。



 

14.插入一个 password 文本框对象验证点。



 

15.点击 Member Logon 对话框的 OK 。



 

16.点击Place an Order 对话框的 Cancel 。

17.关闭 ClassicsJavaA 程序,停止录制。

18.测试脚本被生成,并在 Java 编辑器中打开。

19.查看脚本资源管理器视图。测试对象文件夹下,出现了 。这表明脚本 Script4 正在使用共享测试对象图 TestObjectMap1 。



 

20.双击 脚本资源管理器视图中的 。测试对象图窗口出现,现在我们新创建的测试对象图TestObjectMap1 中已经被添加了测试对象。这些测试对象是我们通过录制脚本添加的。




  数据驱动的测试

数据驱动测试

当你通过数据来驱动一个测试脚本时,脚本使用将使用变量作为应用的关键输入。通过使用变量,脚本能够使用来自外部的数据代替应用测试中的文字值。数据驱动测试使用来自数据池的数据作为测试的输入。一个数据池是相关数据记录的集合,在脚本回放时数据池能够为测试脚本提供测试数据。

数据驱动测试在数据域测试脚本之间放置了一个抽象的层次,这样可以消除测试脚本中的常量值。因为数据被从测试脚本中分离出来了,所以你可以:

  • 在不影响测试脚本的情况下,修改测试数据。
  • 通过修改数据而不是测试脚本来添加新的测试用例。
  • 在多个测试脚本之间共享测试数据。

下面的两个图中,上边的图显示了一个使用硬编码的测试脚本,脚本中的测试数据是直接写在代码中的。而下边的图显示的是一个数据驱动的脚本,它的测试数据是来自于一个外部文件 - 数据池的。


将测试数据直接写在代码中的测试
将测试数据直接写在代码中的测试

使用数据池的数据驱动的测试
使用数据池的数据驱动的测试
 

下面的例子说明了数据驱动测试能够解决的问题:

问题:在测试录制过程中,你使用员工的唯一社会保险号为一个新的员工创建了一个个人文件。每次测试运行时,都会提示你数据库中已经存在了相同社会保险号的记录。

解决方法: 你能够使用数据驱动的测试来向应用提供不同的员工数据,包括社会保险号。

问题:在你录制测试时,你删除了有一条记录,在测试运行时,Functional Tester将视图删除相同的记录,系统会提示"记录无法找到"的错误信息。

解决方法: 你可以在测试回放中,使用数据驱动的测试来引用不同于在录制时删除的记录。

数据池

数据池是一个测试数据集合,它能够为测试回放提供不同的数据值。

你可以使用数据池来提供真实的数据,以便为被测试应用施加具有现实意义的压力。

当你通过 Functional Tester 来创建一个数据驱动的测试时,你可以在被测试应用中选择需要数据驱动的测试对象。你能够用一个测试脚本反复的使用不同的输入数据,并得到响应数据。

你能够通过几种方法来使用数据池的特性:

  • 为一个测试脚本添加具有现实意义的数据。
  • 从Functional Tester的数据池、IBM Rational TestManager数据池或者一个 . csv文件导入数据。
  • 手工创建一个数据池,并添加数据。
  • 编辑数据池的值,或者改变数据的类型。
  • 将数据池的数据导出到一个.csv文件中。
  • 改变数据池记录选择顺序以确定测试脚本如何访问一个关联的数据池。

专用和共享数据池

每一个测试脚本都有一个专用的测试数据池与之相关联。初始的专用测试数据池是一个占位符,并且直到你数据驱动一个测试脚本或者添加新的数据之前,这个数据池保持为空。

你能够通过创建一个新的数据池来创建一个共享的数据池,或者你也可以将几个测试脚本关联到同一个共享数据池上。

创建数据池

你能够从零开始创建一个数据池,或者从其他的 Functional Tester 数据池、IBM Rational TestManager数据池或者一个.csv 文件 ,将已有的数据导入到一个新的数据池中。

前提条件:

  • 当你导入数据时,你必须将数据导入到与访问数据的测试脚本相同的项目中。
  • 如果你想从 TestManager 数据池导入数据,你必须首先将你的 Functional Tester 项目与使用 TestManager 数据池的 Rational 项目相关联。

创建一个数据池:

1. 点击创建测试数据池 按钮。

2. 对于Functional Test Java Scripting:

a. 输入你想使用的文件夹。



 

b. 输入新数据池的名称。

c. 选择下面步骤之一:

i. 为了创建一个空的数据池,如果在从以下位置导入域中存在一个文件名,那么选择文件名,并删除它,然后点击完成。



 

ii. 为了导入数据到数据池,点击下一步。转到步骤3。(步骤3在那里?)

3. 为了从 Functional Tester 或者 IBM Rational TestManager 数据池或者一个 .csv 文件将输入导入到新建的数据池选择以下步骤之一:

  • 从一个.csv文件导入:

    a. 输入已有 .csv文件的路径和文件名,或者点击从以下位置导入列表的箭头从列表项中选择,或者点击浏览按钮在文件系统中寻找一个.csv文件。

    b. 选择你想要导入文件使用的字段分隔符。

    c. 选中第一条记录是变量信息,使被导入数据的第一行成为新数据池的头。

  • 为了从一个Functional Tester 数据池导入,执行下面步骤之一:

    a. 点击从以下位置导入列表的箭头来显示最近被导入的文件列表,然后从列表中选择一个 Functional Tester 数据池。

    b. 输入一个已有Functional Tester 数据池的路径和文件名。

    c. 点击浏览按钮,从文件系统中查找一个 Functional Tester 数据池文件。

5. 点击 完成。一个新的数据池出现了。

6. 你可以在测试编辑器中看到打开的数据池。



 

编辑数据池

在你创建了一个数据池后,你能够编辑数据池中的记录和变量。一个记录就是数据池中的一行。一个变量是数据池中的一个列。

你能够对一个数据池做以下的更改:

  • 添加、删除、移动或者编辑一条记录。
  • 添加、删除、移动或者编辑一个变量
  • 编辑数据池记录的值
  • 剪切、拷贝或者粘贴一个单元格、一条记录或者一个变量。

为了选中一条记录,点击列编号,例如 0、1或者2。

为了添加一条记录:点击数据池编辑器中的任何位置,或者选择一条记录,右键点击,然后点击Add Record。



 

删除一条记录:

  • 选择一条你想要删除的记录,右键点击,选择 Remove Record 。

编辑数据池的值:

  • 选择你想要改变的单元格,双击选中的单元格,然后输入新的值。

添加一个变量:

1. 选择一个单元格或者在数据池编辑器中点击任意位置,然后右键点击鼠标,并选择 Add Variable。



 

2. 在 Add Variable 对话框中,输入新变量的名称。



 

3. 输入变量的类型。String类型是缺省的。

4. 点击 Add 箭头,选择你想要将新的变量插入到什么位置。

例如,选择 Before NameofVariable 来将新的变量放置到一个已有变量之前,或者选择 After NameofVariable来将新的变量放置到一个已有变量之后。

5. 点击 OK 。

删除一个变量:

  • 右键点击你想要删除的变量,点击 Remove Variable。

删除一个数据池

如果你删除了一个数据池,你就破坏所有与测试脚本的关联。

为了删除数据池:

1. 在Functional Test 项目视图,选择你要删除的数据池。

2. 右键点击,并选择删除。

3. 确认你想删除数据池。

数据驱动一个测试脚本

为了数据驱动一个测试脚本,你需要在被测试应用中选择测试对象。数据驱动器将使用来自被测试应用的数据来生成一个数据池。

你能够使用两种方法来选择一个对象:

对象查找器工具方法 -- 使用这个工具来选择一个对象和所有它的派生对象,或者选一个对象和它的直接子对象。

测试对象浏览器方法 -- 使用这个方法来浏览你想要选择得的对象。浏览器中显示一个被测试应用的对象层次树。你可以在层次树中选择测试对象。

数据驱动一个测试脚本:

A. 创建一个存储测试资产的项目。

B. 启动录制一个测试脚本。

1. 在选择脚本资产对话框中,在数据池记录选择顺序框,选择下列数据池记录选择顺序的类型之一:

  • 有序 -- 在回放时,测试脚本以数据在数据池中出现的顺序方法数据池记录。
  • 随机 -- 在回放时,测试脚本以随机的访问每一个记录。

2. 点击完成。



 

Functional Tester 窗口最小化,记录监视器打开。

C. 启动你想要测试的应用。

1. 在记录工具栏中, 点击 启动应用程序

在应用程序中执行你想要记录在测试脚本中的操作。

D. 数据驱动测试。

1. 在记录工具栏中, 点击插入数据驱动的命令

测试脚本记录暂停,插入数据驱动的操作页面打开。



 

2. 在被测试应用中,在你想要数据驱动的域中输入你想要在数据池中看到的初始值

当记录器暂停时,通过为这些域添加数据,你不会在测试脚本中记录下没有必要的动作。当记录器暂停时,任何对程序控制流的改变都不会被记录到脚本中。

3. 在填充然后选择测试对象区域,选择下列方法之一:

  • 按住并拖动手形光标来选择测试对象

    a. 使用鼠标按住对象查找器 ,将手形拖到你要选择的对象上。

    b. 释放鼠标键。

    数据驱动的操作页面打开。在这个页面,在数据驱动命令表中,显示了被选中对象的信息。

    你能够将鼠标指针放到这个表的一行上来查看Functional Tester 插入到测试脚本中的代码行。

4. 点击确定完成数据驱动脚本。

插入数据驱动操作页面关闭,Functional Tester 将从应用中收集到的数据装入到数据池。

E. 完成录制测试脚本。

1. 执行任何你想要记录的操作。

2. 如果你想录制一个验证点,定位到被测试应用的某个对象,并点击插入验证点或者操作按钮。

3. 关闭你的应用。

4. 在记录工具栏中, 点击 停止记录 。Functional Tester 将所有记录的信息写入到测试脚本中,并使用新的变量和相应的初始值更新数据池。 Functional Tester 窗口打开,测试脚本在编辑器中显示。在测试数据池中显示出录制过程中收集到的数据。



 

F. 你能够在完成录制测试脚本之后,向数据池中添加数据。

导出数据池

你能够导出一个专用或者共享数据池到一个 .csv 文件。

当你导出一个数据池到 .csv文件时,.csv文件的第一行包含了与数据池相关联的变量信息。当你导入.csv文件时,确保第一行是变量信息选项被选中,以确保数据格式的正确。

导出一个Functional Tester 数据池:

  • 使用电子表格应用程序添加数据到一个Functional Tester 数据池 - 你能够导出一个 Functional Tester 数据池到一个 .csv 文件,然后使用电子表格应用程序添加更多的数据。在完成数据添加后,你可以将.csv 中的数据导入到一个新的Functional Tester 数据池中。
  • 在不同的Functional Test项目中使用一个数据池 -你能够导出一个 Functional Tester 数据池到一个 .csv 文件,然后将这个.csv 文件导入到位于不同项目中的新的数据池中。

导出一个共享的数据池到一个 .csv 文件:

1. 在Functional Test 项目下,选择你想要导出的一个共享数据池,右键点击并选择导出。



 

2. 点击Functional Test 数据池至 CSV 文件,点击下一步。



 

3. 在选择要导出的公用数据池区域,选择你要导出的数据池。



 

4. 在文件域,输入导出目标的位置和文件名,你也可以使用浏览按钮来定位。

5. 点击字段分隔符箭头并选择你想使用的分隔符。

6. 点击 完成。

数据池引用和验证点

当你使用一个数据池引用创建一个验证点时,你能够提供变量数据以使你的测试能够具有实际意义。每次你回放一个关联了数据池的脚本时,脚本访问数据池中的一条记录。验证点使用数据池引用在记录中的变量。在回放时,Functional Tester 为数据池应用代替数据池中的变量,并比与实际结果进行比较。

日志包含了当你回放一个脚本时发生的事件记录和所有被执行的验证点的结果。与基线值不同的实际结果是应用中的缺陷或者有意义的变更。

在下图中,左边的图代表了典型的脚本资产:

(1) 与一个数据池关联的脚本

(2) 数据池

(3) 对象图

(4) 验证点基线

右边的图代表了:

(5) 记录了验证点通过或者失败的测试日志

(6) 期望的数据,等同于脚本的基线数据

(7) 实际的数据



 

当你运行一个脚本时,下面的事件将发生:

(A) 验证点访问数据池中的数据,数据池中包含基线数据。

(B) 数据池引用决定并提供数据到验证点。

(C) 将实际的结果与期望的结果进行比较。

(D) 期望的和实际的结果被记录在日志中。任何与期望结果的不同被作为失败记录在测试日志中。

数据池与脚本的关联

将数据池关联到测试脚本

你能够将一个使用外部数据的数据池与一个测试脚本关联起来。

为了将一个数据池与一个脚本进行关联:

1. 在Functional Test 项目视图,选择一个数据池。

2. 右键点击数据池,并选择与脚本关联。



 

3. 点击+ 展开项目,以打开脚本列表。

4. 点击一个或者几个你想要关联到数据池的脚本。



 

5. 点击 完成。

将测试脚本关联到数据池

为了将测试脚本到数据池:

1. 打开你想要改变的脚本。

2. 从脚本资源管理器中,选择测试数据池。

3. 右键点击,并选择与数据池关联。



 

4. 输入测试数据池的名字和路径,或者从列表中选择。



 

5. 点击 确定。

删除数据池关联

你能够删除一个与测试脚本相关联的专用或者公用数据池。

为了删除关联:

1. 打开你要改变的脚本。

2. 脚本资源管理器中,选择测试数据池。

3. 右键点击,并选择除去数据池关联。



 

4. 如果你除去一个专用的数据池,你将接到一个消息问你是否想删除一个专用数据池。

  • 点击 删除专用数据池。
  • 点击 保留数据池。

 


版权所有:UML软件工程组织