揭秘QTP之Reporter对象

发表于:2011-12-15来源:未知作者:娃娃点击数: 标签:qtp
本文介绍了Reporter对象的几个鲜为人知的方法,利用LogEvent、SetContext、UnSetContext方法,可以实现日志的结构化、层次化写入,让你的QTP测试报告看起来更加有条理、分类清晰。 QTP的日志其实有很多的缺点,尤其是当你的脚本依赖函数来执行的时

  本文介绍了Reporter对象的几个鲜为人知的方法,利用LogEvent、SetContext、UnSetContext方法,可以实现日志的结构化、层次化写入,让你的QTP测试报告看起来更加有条理、分类清晰。

  QTP的日志其实有很多的缺点,尤其是当你的脚本依赖函数来执行的时候,因为函数执行时调用Reporter对象来写日志,只会顺序从上到下、扁平、不分类地写下去,如图1所示。

  图1 函数执行时调用Reporter对象写日志的问题

  而不像在Action中写日志一样,按一定的层次关系来写日志(例如根据调用的关系嵌套)。那么如何让函数调用Reporter对象来写日志时也具备一定的层次关系,让日志展现更加灵活、分类清晰呢?其实QTP的Report对象中暗藏了不少可利用的属性和方法。

  Report对象的“私家珍藏”

  在关键字视图通过InterlliSense查看QTP的Report对象时(如图2所示),可发现仅有3个属性、1个方法可用,其中最常用的是ReportEvent方法。

  图2 Reporter对象的公开方法和属性

  而实际上,QTP的Report对象还有其他的方法可用,这些方法并没有对外公开,例如可用LogEvent方法来在日志树中写入一个节点:

  ' 使用Reporter对象的LogEvent写入新节点

  intContext = Reporter.LogEvent("User", dicMetaDescription, Reporter.GetContext)

  用SetContext方法把某个节点作为父节点,这样的话,后续写入的Log都将在这个父节点之下:

  ' 调用Reporter对象的SetContext把新写入的节点作为父节点

  Reporter.SetContext intContext

  如果要退出该节点,返回日志树的上一层,则可调用UnSetContext方法即可,如下脚本所示:

  '调用Reporter对象的UnSetContext,返回上一层

  Reporter.UnSetContext

  Report对象“解密”

  有了LogEvent、SetContext、UnSetContext这几个方法,我们就可以实现日志的结构化、层次化写入了,例如下面的例子所示:

  ' 用一个Dictionary对象来存储节点的信息

  Set dicMetaDescription = CreateObject("Scripting.Dictionary")

  ' 设置节点的状态

  dicMetaDescription("Status") = MicDone

  ' 设置节点的名称

  dicMetaDescription("PlainTextNodeName") = "父节点"

  ' 设置节点的详细描述信息(可以使用HTML格式)

  dicMetaDescription("StepHtmlInfo") = "

这是一个拥有孩子的节点

Hello! How are you!.
"

 

  ' 设置节点的图标

  dicMetaDescription("DllIconIndex") = 210

  dicMetaDescription("DllIconSelIndex") = 210

  ' 节点图标从ContextManager.dll这个DLL文件中读取

  dicMetaDescription("DllPAth") = "D:\Program Files\HP\QuickTest Professional\bin\ContextManager.dll"

  ' 使用Reporter对象的LogEvent写入新节点

  intContext = Reporter.LogEvent("User", dicMetaDescription, Reporter.GetContext)

  ' 调用Reporter对象的SetContext把新写入的节点作为父节点

  Reporter.SetContext intContext

  ' 后续写入的Log都将在这个父节点之下

  Reporter.ReportEvent MicPass, "Step1", "Step1 Pass!"

  Reporter.ReportEvent MicWarnning, "Step2", "Step2 Pass With Warnning!"

  Reporter.ReportEvent MicFail, "Step2", "Step2 Fail!"

  '调用Reporter对象的UnSetContext,返回上一层

  Reporter.UnSetContext

  ' 在父节点之外写Log

  Reporter.ReportEvent MicPass, "Case2", "Case2 Pass!"

  在这个例子中,我们首先用一个Dictionary对象来存储节点的信息,其中Status表示节点的状态,例如MicDone就表示完成状态;PlainTextNodeName表示节点的名称;StepHtmlInfo表示节点的详细内容,可以用HTML格式来写入;还可以用DllIconIndex、DllIconSelIndex、DllPAth这3个属性来表示节点的图标。

  然后使用Reporter对象的LogEvent把Dictionary中存储的信息写入一个新节点,再调用Reporter对象的SetContext把新写入的节点作为父节点,这样后续写入的Log都将在这个父节点之下,最后调用Reporter对象的UnSetContext,返回上一层,这样后续写入的Log将在这个父节点之外。

  这个例子的运行结果如图3所示。

  图3 脚本运行结果

  封装成可重用的函数

  可以把上面的代码封装成一个可重用的函数,以方便调用。方法如下:

  (1)首先在QTP中使用“Function Definition Generator”来定义一个名为“EnterNode”的函数。如图4所示。

  图4 定义函数EnterNode

  该函数实现的是把日志写入某个节点下,输入参数为NodeName(节点的名称),NodeContent(节点的描述信息)。

  函数的脚本如下:

原文转自:http://www.ltesting.net