5.1 QTP设计模式
阶段要点
● 带你进入设计模式的世界。
● 单例模式设计。
● 工厂模式设计。
● 命令包装模式设计。
● 回调模式设计。
● 函数指针模式设计。
● 类的继承模式。
5.1.1 初识设计模式(Design Patterns)
设计模式这个名称相信对于有过面向对象开发经验的读者来说不佰生,最早是国外的GoF四人帮发表了23个基础的设计模式,并对其进行了规范化,后来被人们广泛应用于程序设计中,设计模式(Design pattern)是一套被反复使用、多数人知道的、经过分类编码目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。毫无疑问,设计模式使代码编制真正工程化,设计模式是软件工程的基石。
在很多面向对象的语言中,设计模式使用起来非常方便,并且有些模式实现起来相当简单,这是因为底层的代码设计上都已经为这些模式“铺好了路”,而在QTP中,它的脚本编辑器底层语言是VBScript,而此语言本身相比很多面向对象的高级语言来说。具有明显的劣势和差距。大多数同行都认为VBScript自身根本不能使用设计模式,这是它本身存在的缺陷。作者经过多年的研究以及查阅国外的一些技术文献后,得出一个结论:VBScript虽然不能直接实现众多设计模式,但可以间接通过脚本的后期优化来实现。
在本章接下来的内容中将讲解,如何使用VBScript来实现一些常用的代码设计模式,其包括:单例设计模式(Singleton Pattern)、工厂设计模式(Factory Pattern)、命令包装模式(Command Pattern)、回调设计模式(CallBack)、函数指针模式(Function Pointer)、类的继承模式(Class Inheritance)等,相信这一定会成为本书最大亮点。
5.1.2 单例设计模式(Singleton)
从本节开始就为大家介绍,先从单例设计模式开始。试想一下,当一位自动化测试工程师需要实现一个相对复杂的脚本,此脚本又需要连接数据库或者Excel的Sheet表,并且对其进行读写等多项操作,要在VBS cript中实现这些操作,首先需要创建这些COM组件,如Excel.Appliction、WScript.Shell,若在操作流程或者脚本流程比较繁多或者复杂的情况下,就会出现一个COM组件被创建多次的现象,那么怎样才能避免这样的现象呢?这里就引入了VBScript的单例模式应用。
首先来看一个非常简单的例子:
Option Explicit Public oExcel '声明全局变量 Dim bAleadyInit '判断对象是否存在的标志位 '检查对象是否已经被初始化 bAlreadyInit = False If IsObject(oExcel) = True Then '对象初始化 If Not oExcel is Nothing Then '激活状态 bAlreadyInit = True End If End If '如果标志位是False,则创建一个实例对象 If bAlreadyInit = False then Set oExcel = CreateObject("Excel.Application") end if '注意:此处的Whatever只是代表任意方法的意思,并没有此方法 oExcel.Whatever |
分析:
脚本中首先声明了两个变量,一个为Excel对象变量,另一个为标志位,用于判断Excel是否已经被实例化。接着把标志位设置为False,并判断Excel对象变量是否为一个对象,如果不是一个对象,那么就直接退出,说明没有被实例化,需要新创建一个;如果Excel对象变量是一个对象,继续判断此对象是否已经被释放,如果没有被释放,那么就可以把它设为已实例化状态,并在下次调用时通过判断标志位为已实例化状态而不会重新去创建一个新的实例。虽然此脚本已经完成了所需要的功能,但此脚本调用起来非常繁琐,每次都需要使用这样的重复代码,效率十分低,因此,这里必须使用函数对其进行封装,方便以后重复进行调用:
Option Explicit Function GetExcel Public oExcel '声明全局变量 Dim bAleadyInit '判断对象是否存在的标志位 '检查对象是否已经被初始化 bAlreadyInit = False If IsObject(oExcel) = True Then '对象初始化 If Not oExcel is Nothing Then '激活状态 bAlreadyInit = True End If End If '如果标志位是False,则创建一个实例对象 If bAlreadyInit = False then Set oExcel = CreateObject("Excel.Application") end If '将oExcel对象返回给当前函数 Set GetExcel = oExcel End Function Set oExcelApp = GetExcel '获取excel对象 oExcelApp.Whatever '注意:此处的Whatever只是代表任意方法的意思,并没有此方法 |