在业务层的类中封装业务操作流程的代码,例如下面的登录流程:
' 登录业务类,封装了登录过程的业务操作流程 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 |
推荐阅读: