框架经理-FrameworkManager简介
 

2009-11-19 作者:陈能技 来源:陈能技的BLOG

 

前言

FrameworkManager是由Yaron Assa(www.AdvancedQTP.com)开发的一个开源的QTP自动化测试框架,目的是让QTP的脚本编写更为优雅和清晰(for elegant, clean scripting with QTP)。

一、FrameworkManager简介

FrameworkManager处理了应用程序的UI层的所有麻烦和细枝末节的琐碎事情,让你编写出更好、更清晰、更简介的测试脚本。FrameworkManager除了提供一个极为简单的接口用于构建和维护脚本之外,还解决了QTP的对象库和描述性编程的问题。

通常我们构建的代码会变得很臃肿,过于复杂而难以维护,例如写了很多的Select-Case或If结构的语句(如果输入域仅能接受Email格式数据,则这样;如果只能接受地址,则那样...)。按照这种方式写的脚本会难以维护,因为一旦被测试的应用程序添加了新的输入域,则需要重复很多代码修改和调整的工作,使用FrameworkManager则能让这些工作成为过去。

FrameworkManager仅仅关注脚本需要的信息,从而保持脚本代码的简单,避免凌乱的代码。决策判断的结构语句被分解成独立的小类,这些小类可以被轻易地维护和更新,而不至于引入大量的BUG。更重要的是,FrameworkManager是环境无关的,能被轻易地扩展用于处理那些尚未被识别的对象和控件。

二、FrameworkManager的特点

下面列举FrameworkManager的一些功能特性:

1.保持脚本简洁明了。处理对象变成了简单的oObject.Input(“New Value”)。

2.在内部自动处理不同输入类型,例如两个文本输入框,一个仅能输入Email,一个仅能输入数字。

3.在内部自动处理相互关联的操作,也就是说,把两个或多个对象操作组合成一个逻辑顺序的操作,例如单击一个按钮来验证输入框的数据;输入密码紧跟着验证密码。

4.在内部自动选择值验证的方式,例如:

Delegation – 在某个对象中输入一个值,但是在另外一个对象中显示出来。 Regular Expressions – 输入一个值,但是以前缀或后缀显示出来。

5.在内部自动处理条件输入-你可以很容易地设置一个标记来标识某个对象是不可输入的或不可操作的(untouchable),例如你有两个输入域,通过一个按钮来控制其“enabled”和“disabled”属性。

6.在内部自动处理随机值-例如从一个combo-box或list-box控件中随机选择其中的一项。

7.可轻易地为应用程序对象添加个性化的属性,例如标志某些输入域为强制性的(mandatory),把这些输入域与某个查询窗口中的数据域关联,然后在脚本中利用这些数据,快速填充这些强制性输入域的数据。

8.被测试应用程序的对象都被结构化成一个树状,让你可以在脚本中做复杂的对象搜索和操作,例如在某个TAB页下的所有输入框输入所有数据;从一个WebTable转到其父级的Frame中。

9.为了更好地组织对象树,可以添加一些虚拟的层次,从而得到一个可读性更强的对象树。

10.可扩展性强-可以在不修改已有代码的情况下添加新的数据类型产生和输入方法。FrameworkManager可以处理你添加的任何扩展、不可识别的控件和针对被测试应用程序的业务逻辑处理。

三、获取FrameworkManager

FrameworkManager目前的最新版本是0.81,可到以下地址下载:
http://www.advancedqtp.com/knowledge-base/projects/frameworkmanager/frameworkmanager-version-081/ 下载后把文件解压出来,可看到FrameworkManager的文件结构如下所示: \Documentation 帮助文档。 \Libraries FrameworkManager框架的代码,包括对象树类、输入类等。 \Resources 包含对象树的Excel文件。 \Demo App 用于演示FrameworkManager用法的Demo小程序。 \Tests 用于演示FrameworkManager用法的Test。

四、FrameworkManager框架的组成

FrameworkManager框架主要由3大部分组成:

1.对象树文件(ObjectTree)

这个Excel文件作为可扩展的对象库(Object-Repository),它包含FrameworkManager识别对象所需要的所有数据,以及所有对象的元数据(meta-data),例如强制输入域等。

2.对象树类(clsTreeLevel)

这个类包含FrameworkManager的真正机制。在运行时,根据对象树Excel文件生成对象树实例,所以对象操作都是通过树节点进行封装的。

3.子类(Min、i-classes)

对于树中的每一个节点(例如clsTreeLevel类中的每一个实例),都可以“插入”(plugged)一个这样的子类(mini-class)。它们控制相关的程序对象如何输入数据、操作,如何产生随机的数据等。

● 对象树Excel文件

可以在\Resources\ObjectTree.xls中找到该Excel文件,如果要让clsTreeLevel.vbs正确地运行起来,请确保把clsTreeLevel.vbs文件中的sExcelFile这个常量的值修改为Excel文件所在的实际路径,对象树类与对象树就是通过这个常量关联起来的。

打开Excel文件可看到如图1所示的内容

可以看到Excel文件分成两部分,左边部分是具有层次结构关系的对象树,右边部分是对象的相关属性,例如QTPClass、InPutType等。

下面解释一下Excel表中右边部分的各个列名所代表的属性的含义:

◎ Mandatory – True/False:用于标识该输入域是否为强制性的。

◎ Condition-只有当该输入域的条件得到满足时,才输入。在Excel单元格中填写的格式是:FieldName>Expected Value| FieldName>Expected Value(多个条件用“|”隔开),例如VB Demo_Example 2_Field 1_Enable_Flag>False表示在对象数中该节点的值必须为False。对于负条件,则使用:FieldName>%NOT%UnExpectedValue

◎ PreActions – 在输入之前必须完成的操作,填写格式为:FieldName>Value|FieldName>Value(多个前置的操作用“|”隔开),输入空值可用“%EMPTY%”表示。

◎ PostActions-与PreActions类似,用于表示在输入之后必须完成的操作。

◎ DPID-对象的描述性编程字符串,例如:vbname:=Something|visible:=True。如果不想使用描述性编程,而是希望通过自己编写的函数来指向一个QTP对象的话,则可使用“%FunctionName%”来获取,例如下面的GetBrowser函数:

 Function GetBrowser(sRedundentParam)
  If Browser("Something").Exist then
   Set GetBrowser = Browser("Something")
 Else
   Set GetBrowser = Nothing
  End If
End Funtion

◎ QTPClass-指定对象的类型(micclass),例如VBCombobox、Browser等。

◎ InputType-当给对象树的某个节点输入时采用的子类,例如Text、Combo。这里填入的子类名加上前缀“Input”和后缀“Class”就成为脚本中能识别的子类(mini-class),对应IputClasses.vbs中的InputTextClass、InputButtonClass等。

◎ Type-对象树节点的业务逻辑意义,例如Field、Tab、SaveButton等。

◎ RandomValueType-当给对象树的某个节点随机输入时采用的子类,例如Text、Combo等。这里填入的子类名加上前缀“RandomValue”和后缀“Class”,就成为脚本中能识别的子类,对应RandomValueClasses.vbs中的RandomValueTextClass、RandomValueCheckboxClass等。

◎ ValueInObject-对象树节点的输入操作被验证时所需的标识。有时候在一个字段输入一个值后,需要访问另外一个字段或对象,以便检查输入是否成功。

◎ ValidatePattern-用于验证输入操作的正则表达式。用%Value%表示原本的输入值。用“.*%Value%.*”表示实际值中只要包含了原本的值即为成功。

● clsTreeLevel类

clsTreeLevel类用于构建Excel文件中所描述的对象树的实例。实例化的对象树用一个公共变量oRoot来保持,通过oRoot,可以访问到对象树中的任何一个指定的节点,例如:oRoot.GetLeaf(Identifier),这个方法返回对象节点的实例。

对象树的每个节点都有一个GetChildList和GetParentList方法,用于返回当前节点的儿子对象列表或父亲对象列表,通过这两个方法可以实现对象树节点的导航,访问任何需要的节点。

通过oNode.QTPObject.GetROProperty可以获取某个节点对象的属性,例如QTPObject.GetROProperty("enabled")返回对象节点的enabled属性。

每个节点对象都有一个Input方法,用于对被测试应用程序中的相应对象做输入操作,例如单击一个按钮、设置日期等。

每个节点对象都有一个Value属性,可以返回对象的当前值。

如果你想对节点对象做额外的非标准的输入操作,则可以在各输入子类(mini-class)中定义个性化的操作,然后通过ExecuteCustom命令来激活它们。

● 输入子类(InputClasses)和随机值子类(RandomValueClasses)

为了保持主类(clsTreeLevel)的代码稳定、清晰和简洁,处理实际对象的操作和输入并没有在主类中实现,而是在单独的子类中处理,每一个子类负责特定类型的对象的任务处理,例如InputTextClass用于处理标准的文本输入框,InputComboboxClass则用于处理标准combo-box输入框。

目前为止,FrameworkManager提供两种类型的子类(mini-class):输入类(Input)和随机值类(RandomValue)。输入类用于处理对象,随机值类用于产生随机值。每个节点对象通过Excel表格中的设置的InputType和RandomValueType来关联相关的子类。

可以为FrameworkManager扩展新的子类。如果碰到未处理的控件,可以立即编写一个新的子类,在Excel文件中设置相关的类名即可,而不需要更新那些select-case或if结构语句。

五、FrameworkManager的使用方法

基于前面对FrameworkManager框架的分析,我们基本上明白了FrameworkManager的整体框架的原理。下面简单介绍一下FrameworkManager的使用方法。

首先,需要在Test的Resources中添加FrameworkManager框架文件目录中的Libraries下的几个文件,包括clsTreeLevel.vbs、General.vbs、InputClasses.vbs、RandomValueClasses.vbs,如图2所示。

添加了这些库文件后,就可以使用FrameworkManager了。针对被测试应用程序,我们还需要为其建立对象树,这个需要在ObjectTree.xls文件中进行编辑。包括各个对象节点以及对象节点所对应的输入操作等。 有了对象树后,我们就可以通过类似下面的脚本来使用FrameworkManager进行对象的测试: Call oRoot.GetLeaf("VB Demo_Example 1_Field 1").Input("Random") 读者可以先参考FrameworkManager框架所附带的Demo程序来了解FrameworkManager的使用方法。然后再修改ObjectTree.xls文件,替换成自己的测试项目中的对象和所需的输入操作。


火龙果软件/UML软件工程组织致力于提高您的软件工程实践能力,我们不断地吸取业界的宝贵经验,向您提供经过数百家企业验证的有效的工程技术实践经验,同时关注最新的理论进展,帮助您“领跑您所在行业的软件世界”。
资源网站: UML软件工程组织