這種框架的核心思想是把某個(gè)窗口的測試對象和相關(guān)業(yè)務(wù)核心操作都封裝在VBS的類(lèi)中,稱(chēng)之為GUI層,或者叫GUI-業(yè)務(wù)橋接層。例如下面的登錄界面類(lèi):
' 登錄界面類(lèi),封裝了界面對象數據以及相關(guān)業(yè)務(wù)操作
Class Login
Private m_htChildObjects 'As Scripting.Dictionary
Public Property Get ChildObjects()
Set ChildObjects = m_htChildObjects
End Property
Public Property Let ChildObjects(ByRef dic)
Set m_htChildObjects = dic
End Property
' 初始化界面對象并驗證對象是否存在
Public Function Init()
ChildObjects = CreateObject("Scripting.Dictionary")
With ChildObjects
.Add "LoginDialog", Dialog("text:=Login")
.Add "AgentName", ChildObjects.Item("LoginDialog").WinEdit("attached text:=Agent Name:")
.Add "Password", ChildObjects.Item("LoginDialog").WinEdit("attached text:=Password:")
.Add "Submit", ChildObjects.Item("LoginDialog").WinButton("text:=OK")
End With
'IsContextLoaded is a function that iterates through the Dictionary and checks if the GUI objects "exist"
Init = IsContextLoaded(ChildObjects) ' 檢查界面層對象是否存在
End Function
' 與界面對象綁定的各類(lèi)業(yè)務(wù)操作
' 測試數據從GlobalDictionary中獲取(放在Data層),這里把測試數據做成函數參數可能會(huì )更好?!
Public Function SetUsername()
ChildObjects.Item("AgentName").Set GlobalDictionary.Item("AgentName")
End Function
Public Function SetPassword()
ChildObjects.Item("Password").Set GlobalDictionary.Item("Password")
End Function
Public Function Submit()
ChildObjects.Item("Submit").Click
End Function
End Class
Public Function CreateLogin()
Dim objLogin
Set objLogin = New Login
Set CreateLogin = objLogin
End Function
在業(yè)務(wù)層的類(lèi)中封裝業(yè)務(wù)操作流程的代碼,例如下面的登錄流程:
' 登錄業(yè)務(wù)類(lèi),封裝了登錄過(guò)程的業(yè)務(wù)操作流程
Class do_login
Public Default Function Run()
Dim intStatus
Set objLogin = CreateLogin() ' 調用GUI層的Login類(lèi)
If objLogin.Init() Then ' 如果所需的界面對象都存在,則執行業(yè)務(wù)操作流程
objLogin.SetUsername()
objLogin.SetPassword()
objLogin.Submit()
intStatus = micPass 'If login succeeds
Else
intStatus = micFail
End If
Run = intStatus
End Function
End Class
Public Function Create_do_login()
Dim bzLogin
Set bzLogin = New do_login
Set Create_do_login = bzLogin
End Function
這種寫(xiě)法的好處,除了可以細粒度地抽象、分解業(yè)務(wù)的測試代碼,提高可重用性外,還可以在業(yè)務(wù)層的代碼執行前,先讓界面層檢查驗證所需的測試對象是否都存在( 例如上面代碼中的objLogin.Init() ),避免了QTP在運行過(guò)程中碰到對象不存在的時(shí)候卡住的現象。
在界面層的Init方法中,通過(guò)描述性編程把測試對象都存入Dictionary中,然后用IsContextLoaded方法遍歷對象,檢查是否在運行時(shí)都存在:
' 檢查界面層對象是否存在并寫(xiě)入測試報告
Public Function IsContextLoaded(ByRef htContext)
Dim ix, items, keys, strDetails, strAdditionalRemarks
IsContextLoaded=true
items = htContext.Items
keys = htContext.Keys
For ix = 0 To htContext.Count-1
IsContextLoaded = IsContextLoaded And items(ix).Exist(0)
strDetails = strDetails & vbNewLine & "Object #" & ix+1 & ": '" & keys(ix) & "' was"
If IsContextLoaded Then
intStatus = micPass
strDetails = strDetails & ""
strAdditionalRemarks = ""
Else
intStatus = micWarning
strDetails = strDetails & " not"
strAdditionalRemarks = " Please check the object properties."
End If
strDetails = strDetails & " found." & strAdditionalRemarks
Next
Reporter.ReportEvent intStatus, "IsContextLoaded", strDetails
End Function
文章來(lái)源于領(lǐng)測軟件測試網(wǎng) http://kjueaiud.com/