QTP Report對象的“私家珍藏”

在關鍵字視圖通過InterlliSense查看QTP的Report對象時(如圖2所示),可發現僅有3個屬性、1個方法可用,其中最常用的是ReportEvent方法。
而實際上,QTP的Report對象還有其他的方法可用,這些方法並沒有對外公開,例如可用LogEvent方法來在日誌樹中寫入一個節點:
intContext = Reporter.LogEvent("User", dicMetaDescription, Reporter.GetContext) '  使用Reporter對象的LogEvent寫入新節點
用SetContext方法把某個節點作爲父節點,這樣的話,後續寫入的Log都將在這個父節點之下:
Reporter.SetContext intContext ' 調用Reporter對象的SetContext把新寫入的節點作爲父節點
如果要退出該節點,返回日誌樹的上一層,則可調用UnSetContext方法即可,如下腳本所示:
Reporter.UnSetContext '調用Reporter對象的UnSetContext,返回上一層
Report對象“解密”
有了LogEvent、SetContext、UnSetContext這幾個方法,我們就可以實現日誌的結構化、層次化寫入了,例如下面的例子所示:
Set dicMetaDescription = CreateObject("Scripting.Dictionary") ' 用一個Dictionary對象來存儲節點的信息
dicMetaDescription("Status") = MicDone ' 設置節點的狀態
dicMetaDescription("PlainTextNodeName") = "父節點" ' 設置節點的名稱
dicMetaDescription("StepHtmlInfo") = "<DIV align=left><H1>這是一個擁有孩子的節點</H1><b>Hello!</b> How are you!.</DIV>" ' 設置節點的詳細描述信息(可以使用HTML格式)
dicMetaDescription("DllIconIndex") = 210 ' 設置節點的圖標
dicMetaDescription("DllIconSelIndex") = 210
dicMetaDescription("DllPAth") = "D:\Program Files\HP\QuickTest Professional\bin\ContextManager.dll" ' 節點圖標從ContextManager.dll這個DLL文件中讀取
intContext = Reporter.LogEvent("User", dicMetaDescription, Reporter.GetContext)  '  使用Reporter對象的LogEvent寫入新節點
Reporter.SetContext intContext ' 調用Reporter對象的SetContext把新寫入的節點作爲父節點
Reporter.ReportEvent MicPass, "Step1", "Step1 Pass!" ' 後續寫入的Log都將在這個父節點之下
Reporter.ReportEvent MicWarnning, "Step2", "Step2 Pass With Warnning!"
Reporter.ReportEvent MicFail, "Step2", "Step2 Fail!"
Reporter.UnSetContext '調用Reporter對象的UnSetContext,返回上一層
Reporter.ReportEvent MicPass, "Case2", "Case2 Pass!" ' 在父節點之外寫Log
在這個例子中,我們首先用一個Dictionary對象來存儲節點的信息,其中Status表示節點的狀態,例如MicDone就表示完成狀態;PlainTextNodeName表示節點的名稱;StepHtmlInfo表示節點的詳細內容,可以用HTML格式來寫入;還可以用DllIconIndex、DllIconSelIndex、DllPAth這3個屬性來表示節點的圖標。
然後使用Reporter對象的LogEvent把Dictionary中存儲的信息寫入一個新節點,再調用Reporter對象的SetContext把新寫入的節點作爲父節點,這樣後續寫入的Log都將在這個父節點之下,最後調用Reporter對象的UnSetContext,返回上一層,這樣後續寫入的Log將在這個父節點之外。




(1)首先在QTP中使用“Function Definition Generator”來定義一個名爲“EnterNode”的函數。
Public Function EnterNode(ByRef NodeName, ByRef NodeContent)
  Set dicMetaDescription = CreateObject("Scripting.Dictionary")  ' 用一個Dictionary對象來存儲節點的信息
  dicMetaDescription("Status") = MicDone' 設置節點的狀態
  dicMetaDescription("PlainTextNodeName") = NodeName  ' 設置節點的名稱
  dicMetaDescription("StepHtmlInfo") = NodeContent  ' 設置節點的詳細描述信息(可以使用HTML格式)
  dicMetaDescription("DllIconIndex") = 210  ' 設置節點的圖標
  dicMetaDescription("DllIconSelIndex") = 210
  dicMetaDescription("DllPAth") = "D:\Program Files\HP\QuickTest Professional\bin\ContextManager.dll"  ' 節點圖標從ContextManager.dll這個DLL文件中讀取
  intContext = Reporter.LogEvent("User", dicMetaDescription, Reporter.GetContext)  '  使用Reporter對象的LogEvent寫入新節點
  Reporter.SetContext intContext  ' 調用Reporter對象的SetContext把新寫入的節點作爲父節點
End Function


(2)然後再定義一個與“EnterNode”相應的函數“ExitNode”,
ExitNode函數用於退出當前日誌節點,需要與EnterNode配對使用,函數的腳本如下所示:
'@Description 退出當前日誌節點(與EnterNode配對使用)
Public Function ExitNode
   Reporter.UnSetContext   '調用Reporter對象的UnSetContext,返回上一層
End Function
(3)有了EnterNode和ExitNode函數後,我們就可以像下面的例子一樣使用EnterNode和ExitNode,實現日誌記錄的結構化、層次化寫入:
' 進入節點
EnterNode "父節點","<DIV align=left><H1>這是一個擁有孩子的節點</H1><b>Hello!</b> How are you!.</DIV>"
' 在節點內寫Log
Reporter.ReportEvent MicPass, "Step1", "Step1 Pass!"
Reporter.ReportEvent MicWarnning, "Step2", "Step2 Pass With Warnning!"
Reporter.ReportEvent MicFail, "Step2", "Step2 Fail!"
' 退出節點
ExitNode
' 在節點之外寫Log
Reporter.ReportEvent MicPass, "Case2", "Case2 Pass!"
  該腳本首先調用EnterNode,創建一個"父節點",並自動進入該節點的層次下,然後使用普通的ReportEvent方法寫日誌,當需要退出該"父節點"時,就調用一下ExitNode,則後續的日誌都在該節點之外寫。
小結
本文介紹了Reporter對象的幾個鮮爲人知的方法,利用LogEvent、SetContext、UnSetContext這幾個方法,可以實現日誌的結構化、層次化寫入,讓你的QTP測試報告看起來更加有條理、分類清晰。
不知道爲什麼QTP的幫助文檔中沒有列出這幾個有用的方法,但是不管怎樣,在我們揭開了Reporter對象的這些隱藏的方法後,我們就可以充分利用它們爲我們服務,讓我們的自動化測試腳本更加強大。


原地址:http://tech.it168.com/a2008/0806/199/000000199725.shtml

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章