QTP面向對象的框架的核心思想是把某個視窗的測試對象和相關業務核心操作都封裝在VBS的類中,稱之為GUI層,或者叫GUI-業務橋接層。
基本介紹
- 中文名:QTP面向對象的框架
- 別名:GUI層
- 相關:GUI-業務橋接層
操作,好處,
操作
例如下面的登錄界面類: ' 登錄界面類,封裝了界面對象數據以及相關業務操作
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
' 與界面對象綁定的各類業務操作
' 測試數據從GlobalDictionary中獲取(放在Data層),這裡把測試數據做成函式參數可能會更好?!
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
在業務層的類中封裝業務操作流程的代碼,例如下面的登錄流程:
' 登錄業務類,封裝了登錄過程的業務操作流程
Class do_login
Public Default Function Run()
Dim intStatus
Set objLogin = CreateLogin() ' 調用GUI層的Login類
If objLogin.Init() Then ' 如果所需的界面對象都存在,則執行業務操作流程
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
好處
除了可以細粒度地抽象、分解業務的測試代碼,提高可重用性外,還可以在業務層的代碼執行前,先讓界面層檢查驗證所需的測試對象是否都存在( 例如上面代碼中的objLogin.Init() ),避免了QTP在運行過程中碰到對象不存在的時候卡住的現象。
在界面層的Init方法中,通過描述性編程把測試對象都存入Dictionary中,然後用IsContextLoaded方法遍歷對象,檢查是否在運行時都存在:
' 檢查界面層對象是否存在並寫入測試報告
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