揭秘QTP之Reporter对象

本文介绍了QTP自动化测试中使用Reporter对象的LogEvent、SetContext、UnSetContext方法实现日志的结构化、层次化写入,使测试报告更加有条理、分类清晰。通过定义EnterNode和ExitNode函数,可以实现日志记录的层次化管理,提升测试脚本的可读性和维护性。

本文介绍了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") = "<DIV align=left><H1>这是一个拥有孩子的节点</H1><b>Hello!</b> How are you!.</DIV>"

' 设置节点的图标
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(节点的描述信息)。

函数的脚本如下:

'@Description 指定把日志写入节点下
Public Function EnterNode(ByRef NodeName, ByRef NodeContent)

' 用一个Dictionary对象来存储节点的信息
Set dicMetaDescription = CreateObject("Scripting.Dictionary")

' 设置节点的状态
dicMetaDescription("Status") = MicDone

' 设置节点的名称
dicMetaDescription("PlainTextNodeName") = NodeName

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

' 设置节点的图标
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
End Function

(2)然后再定义一个与“EnterNode”相应的函数“ExitNode”,如图5所示:

图5 定义函数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对象的这些隐藏的方法后,我们就可以充分利用它们为我们服务,让我们的自动化测试脚本更加强大。

下载方式:https://pan.quark.cn/s/c9b9b647468b ### 初级JSP程序设计教程核心内容解析#### 一、JSP基础概述JSP(JavaServer Pages)是由Sun Microsystems公司创建的一种动态网页技术规范,主要应用于构建动态网站及Web应用。JSP技术使得开发者能够将动态数据与静态HTML文档整合,从而实现网页内容的灵活性和可变性。##### JSP的显著特性:1. **动态与静态内容的分离**:JSP技术支持将动态数据(例如数据库查询结果、实时时间等)嵌入到静态HTML文档中。这种设计方法增强了网页的适应性和可维护性。2. **易用性**:开发者可以利用常规的HTML编辑工具来编写静态部分,并通过简化的标签技术将动态内容集成到页面中。3. **跨平台兼容性**:基于Java平台的JSP具有优良的跨操作系统运行能力,能够在多种不同的系统环境中稳定工作。4. **强大的后台支持**:JSP能够通过JavaBean组件访问后端数据库及其他资源,以实现复杂的数据处理逻辑。5. **执行效率高**:JSP页面在初次被请求时会被转换为Servlet,随后的请求可以直接执行编译后的Servlet代码,从而提升了服务响应的效率。#### 二、JSP指令的运用JSP指令用于设定整个JSP页面的行为规范。这些指令通常放置在页面的顶部,向JSP容器提供处理页面的相关指导信息。##### 主要的指令类型:1. **Page指令**: - **语法结构**:`<%@ page attribute="value" %>` - **功能**:定义整个JSP页面的运行特性,如设定页面编码格式、错误处理机制等。 - **实例**: ...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值