QTP Reporter类封装
最近一直在研究QTP的Reporter对象,自己也写了一个reporter的封装类,当然网上有现成的,我也参考了其中一些东西,但是自己写下来一遍还是有很多收获的。不多说了,谈谈收获。
1.LogEvent
Reporter.LogEvent ("User",syDictionary,Reporter.GetContext())
这句话的作用是在report里生成一个新的节点
我在网上看到很多现成的代码里都有用到上面这句话,起初不是很在意第一个参数"User",以为是一个类似于report里标题之类的东西,然后我就随便改了一个标题。但是出问题了,改变之后我甚至不能在report里找到新生成的节点!不信你们可以自己试试。经过研究Results.xml这个文件,发现原因:"User"这个参数其实定义的是我们加入Results.xml文件中节点eType类型。所以这个参数的值是不能随便乱改的。还有些其他的属性,之后有时间了我再细致地去研究一下。
2.定义属于你自己的隐藏对象
为了在写QTP脚本的时候方便,读者可以自行定义一些隐藏对象,例如Dictionary对象,文件读写FSO对象,Excel对象等,好处是可以有一定的代码提示。
具体的方法是在注册表里进行增加。
举个Excel的例子
先打开注册表:
HKEY_CURRENT_USER\Software\Mercury
Interactive\QuickTest Professional\MicTest\ReservedObjects
添加一个项Excel
然后如图加入必要的值,如图
具体做法也可以参考http://blog.csdn.net/hyholine/article/details/7255951
3.以下是代码:
'Option Explicit
Class Report
Dim imgname '图片名称
Dim pass_count '记录Pass的个数
Dim fail_count '记录Fail的个数
Dim warning_count '记录Warning的个数
Dim done_count '记录Done的个数
Dim result '记录结果
Dim title '节点标题
Dim desc '节点详细信息
Dim curNodeID,childNodeID
Public Sub Pass(title,desc)
pass_count = pass_count + 1
title = title & " PASS"
Call LogResult(micPass,title,desc)
End Sub
Public Sub Fail(title,desc)
fail_count = fail_count + 1
title = title & " FAIL"
Call LogResult(micFail,title,desc)
End Sub
Public Sub Warning(title,desc)
warning_count = warning_count + 1
title = title & " WARNING"
Call LogResult(micWarning,title,desc)
End Sub
Public Sub Done(title,desc)
done_count = done_count + 1
title = title & " DONE"
Call LogResult(micDone,title,desc)
End Sub
Private Sub LogResult(result,title,desc)
desktop.CaptureBitmap imgname,true
Reporter.ReportEvent result,title,desc,imgname
imgname = Right(Replace(now,":",""),6) & RandomNumber(0,100) & ".png"
End Sub
Private Function GenerateNote(result,title,desc)
'自己在注册表里注册的Dictionary对象,UIName为syDictionary,这里可以直接使用了
If syDictionary.Count > 0 then
syDictionary.RemoveAll
End If
syDictionary("Status") = result
syDictionary("NodeName") = title
syDictionary("StepInfo") = desc
GenerateNote = Reporter.LogEvent ("User",syDictionary,curNodeID)
End Function
Public Sub SetParentNode(title,desc)
title = title & " 父节点"
done_count = done_count+1
childNodeID = GenerateNote(micDone,title,desc)
Reporter.SetContext(childNodeID)
curNodeID = childNodeID
End Sub
Public Sub UnSetParentNode()
Reporter.UnSetContext()
End Sub
Private Sub Class_Initialize()
pass_count = 0
fail_count = 0
warning_count = 0
done_count = 0
stack_point = 0
curNodeID = Reporter.GetContext()
imgname = Right(Replace(now,":",""),6) & RandomNumber(0,100) & ".png"
result = micDone
title = ""
desc = ""
End Sub
Private Sub Class_Terminate()
Set curNodeID = nothing
Set childNodeID = nothing
Set imgname = nothing
print pass_count & "*****" & fail_count & "*****" & warning_count
End Sub
End Class
测试代码如下:
'********************* testing code ************************************
Dim sytest
Set sytest = new Report
sytest.Done "Step 1",sytest.imgname
sytest.Fail "Step 2",sytest.imgname
sytest.SetParentNode "开始1",sytest.imgname
sytest.Pass "Step 3",sytest.imgname
sytest.Warning "Step 4",sytest.imgname
'sytest.UnSetParentNode()
'sytest.Fail "999",sytest.imgname
sytest.SetParentNode "开始2",sytest.imgname
sytest.Pass "Step 5",sytest.imgname
sytest.Pass "Step 6",sytest.imgname
'sytest.UnSetParentNode()
'sytest.Fail "999",sytest.imgname
sytest.SetParentNode"开始3",sytest.imgname
sytest.Pass "Step 7",sytest.imgname
sytest.Pass "Step 8",sytest.imgname
sytest.UnSetParentNode()
sytest.Fail "Step 9",sytest.imgname
sytest.UnSetParentNode()
sytest.Fail "Step 10",sytest.imgname
得到的效果图:一共分了三层,当然也可以分更多层。
总结:洋洋洒洒写了那么多,感觉思绪还是有点乱的,当然自己也不是很满意,感觉写的一点都不geek,还有很多需要改进的地方,希望跟大家多多交流。