QTP的六种设计模式

一、单例模式(Singleton Pattern)

'-------------------------------------------------------------------------------
'	Description:
'		单例模式Singleton Pattern
'			只能实例化一个对象。当创建ExcelWrapper这个类包装的时候就只会调用单个实例,在类销毁时,
'	会自动销毁此全局变量的实例,这样就再也不会在进程里看到N多个Excel进程实例了。
'-------------------------------------------------------------------------------

Option Explicit

Public oExcel	'声明全局变量
Dim oExcelInstace

Class ExcelWrapper

	Private oExcelObject
	'初始化类
	Private Sub Class_Initialize()
		Dim bAleadyInit	'判断对象是否存在的标志位
		bAleadyInit=False	'检查对象是否已经被初始化
		If IsObject(oExcel)=True Then
			'对象初始化
			If Not oExcel Is Nothing Then
				bAleadyInit=True	'激活状态
			End If
		End If
		'如果标志位是False,则创建一个实例对象
		If bAleadyInit=False Then
			Set oExcel=CreateObject("Excel.Application")
		End If
		Set oExcelObject=oExcel
	End Sub
	'类销毁时退出Excel,并且释放Excel对象引用
	Private Sub Class_Terminate()
		oExcelObject.Quit
		Set oExcelObject=Nothing
	End Sub
	
	Public Sub Open(oFileName)
		'写入打开文件代码
	End Sub
	
	Public Function GetSheetData(oSheet)
		'写读取单元格代码
	End Function
End Class


Set oExcelInstace=New ExcelWrapper
oExcelInstace.Open("")

 

二、工厂模式(Factory Pattern)

'-------------------------------------------------------------------------------
'	Description:
'		工厂模式Factory Pattern
'			一种创建模式,可用于创建和初始化某个对象。通过工厂的核心来创建、存储、管理需要的输出机制,
'	并利用关键字请求进行对象输出,是测试设计中非常重要的设计模式。
'-------------------------------------------------------------------------------

Option Explicit

Public oOutputs
Set oOutputs=New OutFactory

Class OutFactory

	Public Channels	'定义变量
	
	Private Sub Class_Initialize
		Set Me.Channels=CreateObject("Scripting.Dictionary")
	End Sub
	
	Private Sub Class_Terminate
		Set Me.Channels=Nothing
	End Sub
	
	Public Sub Construct(sChannelName, sChannelType)
		Dim oNewChannel
		Select Case	sChannelType
			Case "excel"
				'创建一个Excel的Singleton类
				Set oNewChannel=New ExcelWrapper
			Case "fso"
				'创建一个FSO的Singleton类
				Set oNewChannel=New fsoWrapper
			Case "DB"
				'创建一个ADO的Singleton类
				Set oNewChannel=New DBWrapper
		End Select
		'把类都存储起来
		Me.Channels.Add sChannelName, oNewChannel
	End Sub
End Class

'构造方法
oOutputs.Construct "excel_instance", "excel"
oOutputs.Construct "fso_instance", "fso")
oOutputs.Construct "DB_instance", "DB")
'直接取我们需要的东西,并进行操作
oOutputs.Channels("excel_instance").whatever
'此处的Whatever是Excel的Singleton类中的自定义方法

三、命令包装模式(Command Pattern)

'-------------------------------------------------------------------------------
'	Description:
'		命令包装模式Command Pattern
'			把一个请求或者操作封装到一个对象中。该模式运行系统使用不同的请求把客户端参数化,对请求排队或者记录
'	请求日志,可以提供命令的撤销和恢复功能。是一种将函数命令包装成一个类对象的模式,在运行时实例化一个类获取实
'	例化对象,并使实例化对象获得一个函数的引用。首先需要先定义一个完整类,在类中封装一个Default函数,这样当在
'	调用创建此类时即可把Default函数的指针指向新建的那个对象类。
'-------------------------------------------------------------------------------

Option Explicit

Class oCommand
	'定义输入
	Private VarIntNum
	Public Property Get Number
		Number = VarIntNum
	End Property
	Public Property Let Number(ByVal oNum)
		VarIntNum = oNum
	End Property
	'定义输出
	Private VarResult
	Public Property Get Result
		Result = VarResult
	End Property
	Public Property Let Result(ByVal oResult)
		VarResult = oResult
	End Property
	'默认主函数
	Public Default Function	Exec()
		Me.Result=Number * Number
		Exec=Me.Result
	End Function

End Class
'构造一个构造器
Function Constructor(ByVal newNumber)
	Set Constructor = New oCommand
	Constructor.Number = newNumber
End Function

'调用构造器并输入参数
Dim con1
Set con1 = Constructor(3)
'命令模式
Call con1
'获取命令执行结果
MsgBox con1.Result

四、回调设计模式(CallBack Pattern)

'-------------------------------------------------------------------------------
'	Description:
'		回调设计模式CallBack Pattern
'			主要用于一个模块执行完毕后,脚本自身会去回调一个所需要执行的代码块,一种非常实用的设计模式。
'	主要的出发点还是依靠类的销毁化函数引申出来的。要做到通用性的回调设计类,只需要在类中加入Execute反射
'	即可。
'-------------------------------------------------------------------------------

Option Explicit

Class Callback
	'回调的动态脚本
	Dim CallBackScript
	'类的销毁化
	Public Sub Class_Terminate()
		Execute CallBackScript
	End Sub
	
End Class

'定义回调变量
Dim cb
Set cb=New Callback
cb.CallBackScript="call msg()"

Function msg()
	MsgBox "callback scriptiong"
End Function

MsgBox "script end"

五、函数指针模式(Function Pointer Pattern)

'-------------------------------------------------------------------------------
'	Description:
'		函数指针模式Function Pointer Pattern
'			就是指向函数的指针变量。Function相当于一个测试模块,当需要添加或者删除模块时,只需要
'	在调用时更改LoadFunc数组即可,无需改动核心脚本的代码逻辑,这种模式在自动化测试中经常被用到的
'	控制测试流的技术手段。
'-------------------------------------------------------------------------------

Option Explicit
'函数tt1
Public Function tt1()
	MsgBox "tt1"
End Function
'函数tt2
Public Function tt2()
	MsgBox "tt2"
End Function
'函数tt3
Public Function tt3()
	MsgBox "tt3"
End Function
'建立测试流函数
Public Function TestFlow(LoadFuncs)
	Dim CallFunc,i
	'遍历所有载入的函数名,并利用函数指针进行调用
	For i=0 To UBound(LoadFuncs)-LBound(LoadFuncs)
		'将CallFunc的指针指向动态载入的函数
		Set CallFunc=GetRef(LoadFuncs(i))
		'调用指针
		Call CallFunc
	Next
End Function

'调用测试流
Call TestFlow(Array("tt1","tt2"))

六、类的继承模式(Extends Pattern)

'-------------------------------------------------------------------------------
'	Description:
'		类的继承模式Extends Pattern
'			VBScript本身完全不支持类的继承,但通过后期的脚本处理技巧,使用一些取巧的方式来变相实现这些设计模式。
'-------------------------------------------------------------------------------

Option Explicit
'创建一个继承类库
Class ClassHelper
	Private dict
	'添加默认方法
	Public Default Function addMethod(name)
		Set dict(name)=GetRef(dict("type") & name)
	End Function
	'创建字典对象
	Private Function createDict()
		Set createDict=CreateObject("Scripting.Dictionary")
	End Function
	'复制字典对象
	Private Function copyDict(super, child)
		Dim key
		For Each key In super
			If IsObject(super(key)) Then
				Set child(key)=super(key)
			Else
				child(key)=super(key)
			End If
		Next
		Set copyDict=child
	End Function
	'新建一个类
	Public Function newClass(name)
		Set dict=createDict()
		dict("type")=name
		Set newClass=dict
	End Function
	'继承方法
	Public Function extends(super, childType)
		Set dict=copyDict(super, createDict())
		Set dict("parent")=super
		dict("type")=childType
		Set extends=dict
	End Function
	'新建继承类
	Public Function [new](super, arrParams)
		Dim dict : Set dict=copyDict(super, createDict())
		Call dict("initialize")(dict, arrParams)
		Set [new]=dict
	End Function
End Class

'载入继承帮助类
Dim Mercury : Set Mercury=New ClassHelper

'创建一个AutoTestTools新类
'START NEW ClassHelper
	Dim AutoTestTools
	Set AutoTestTools=Mercury.newClass("AutoTestTools")
	AutoTestTools("effect")="Automation Testing"
	
	Public Function AutoTestToolsInitialize(this, arrParams)
		this("effect")=arrParams(0)
	End Function : Mercury "initialize"
	
	Public Function AutoTestToolsLaunch()
		MsgBox "Launch AutoTestTools"
	End Function : Mercury "Launch"
'END CLASS

'创建一个新继承AutoTestTools的类
'START NEW CLASS
	Dim QuickTest
	Set QuickTest=Mercury.extends(AutoTestTools, "QuickTest")
	QuickTest("name")="QuickTest Professional"
	QuickTest("support")="all"
	
	Public Function QuickTestInitialize(this, arrParams)
		this("support")=arrParams(0)
	End Function : Mercury "initialize"
	
	Public Function QuickTestLaunch()
		MsgBox "Launch QuickTest"
	End Function : Mercury "Launch"
'END CLASS

'初始化QuickTest类
Dim QuickTestCls : Set QuickTestCls=Mercury.[new](QuickTest, Array("web"))
'打印support属性,此时已经被初始化为Web
MsgBox QuickTestCls("support")
'执行QuickTest类中的Launch方法
Call QuickTestCls("Launch")()
'执行QuickTest类的父类的Launch方法
Call QuickTestCls("parent")("Launch")()

猜你喜欢

转载自mimmy.iteye.com/blog/1622442