【头脑风暴】如何在脚本运行时,Log中能记录当前进入的函数
本帖最后由 黑羽祭 于 2013-1-24 15:58 编辑头脑风暴一下,如何在脚本运行时,Log中能记录当前进入的函数
各位都是如何实现的?
如:进入函数A,再进入函数B
就是能很清楚的打印出 这样的一个路径
当脚本出现问题,能很容易定位到是在还是的问题。 大家随意发言~ 进来支持下。。。不错的话题! 厄~肿么没人说话呢~ 因为不会啊 不会打log呢
最好是写一个共通 然后每个函数调一下这个共通
共通应该是
你进入一个函数就取得函数名不知道有没有这个方法
返回一个执行结果
然后拼呗
=====
A OK
B NG
====
A OK
C OK 本帖最后由 黑羽祭 于 2013-1-25 17:00 编辑
回复 5# 赵佳乐SMILE
好吧,那我来抛砖引玉一下~比如:我在外部vbs文件中写入一段脚本,是个log工具的class:
Set Lg = new LogTools '实例化 LogTools
Class LogTools
Dim LogFileName 'log文件名
Dim LogFilePath 'log文件路径
Dim isPtLog '是否打印日志
Dim NowFunctionDir '当前Function的路径
Sub Class_Initialize
Call NewLogFolder
Call NewLogFile
Depth = 0
End Sub
Sub Class_Terminate
End Sub
'------------------------------------------------------------------------
'返值:log文件名
Property Get getLogFileName()
'处理 LogFileName
If IsEmpty(LogFileName) Then
LogFileName = "log" & getUniqueNumber & ".txt"
End If
getLogFileName = LogFileName
End Property
'------------------------------------------------------------------------
'返值:log文件路径
Property Get getLogFilePath()
'处理 LogFilePath
If IsEmpty(LogFilePath) Then LogFilePath = Environment("TestDir") & "\LOG\" & getLogFileName
getLogFilePath = LogFilePath
End Property
'------------------------------------------------------------------------
'返值:当前Function的路径
Property Get getNowFunctionDir()
getNowFunctionDir = NowFunctionDir
End Property
'------------------------------------------------------------------------------
'属性:是否打印 log
Property Let isPrintLog(ByVal oValue)
isPtLog = oValue
isPrintLog = isPtLog
End Property
Property Get isPrintLog()
If IsEmpty(isPtLog) Then
'给默认值
isPtLog = True
End If
isPrintLog = isPtLog
End Property
'------------------------------------------------------------------------
'作用:新建Log文件夹
Sub NewLogFolder()
Dim FSO , FolderDir
Set FSO = CreateObject("Scripting.FileSystemObject")
FolderDir = Environment("TestDir") & "\LOG"
If Not(FSO.FolderExists(FolderDir)) Then
FSO.CreateFolder(FolderDir)
End If
Set FSO = Nothing
End Sub
'------------------------------------------------------------------------
'作用:新建Log文件
Sub NewLogFile()
'新建文件
Dim FSO
Const ForReading=1,ForWriting=2,ForAppending=8 '参数赋值(1:只读,2:只写,3:追加)
Set FSO = CreateObject("Scripting.FileSystemObject") '创建一个文本对象
Set LOGFILE = FSO.OpenTextFile(getLogFilePath,8,true)
wait 3
Set LOGFILE = Nothing
Set FSO = Nothing
End Sub
'------------------------------------------------------------------------
'作用:重写 Log
'参数:oWords:需要打印的内容
Sub Log(oWords)
'是否打印的判断
If isPrintLog = False Then Exit Sub
'处理打印内容
oWords = "[" & now & "] [" & NowFunctionDir & "] " & oWords
'Log 写入QTP
print oWords
'LOG 写入外部文件
Dim FSO
Set FSO = CreateObject("Scripting.FileSystemObject")
Set ologFile = FSO.OpenTextFile(getLogFilePath, 8, true)
ologFile.WriteLine (CStr(oWords))
ologFile.Close
Set ologFile = Nothing
Set FSO = Nothing
End Sub
'------------------------------------------------------------------------
'作用:进入 Function 时的标记
'参数:oFunctionName:Function名
Sub GoIn(oFunctionName)
NowFunctionDir = NowFunctionDir & ">>" & oFunctionName
Log "-----------------进入<" & oFunctionName & ">-----------------"
End Sub
'------------------------------------------------------------------------
'作用:出 Function 时的标记
Sub GoOut()
Dim arrFunDir
arrFunDir = split(NowFunctionDir , ">>" , -1 , 1)
Log "-----------------退出<" & arrFunDir(ubound(arrFunDir)) & ">-----------------"
NowFunctionDir = ""
Dim i
For i = 1 To ubound(arrFunDir) - 1
NowFunctionDir = NowFunctionDir & ">>" & arrFunDir(i)
Next
End Sub
'------------------------------------------------------------------------------
'作用:得到一个唯一的值
Function getUniqueNumber()
Dim yyyy,mm,dd,ss
Dim nowtime
nowDate = date
nowTimer = cstr(int(timer))
yyyy = CStr(Year(nowDate))
mm = CStr(String(2 - Len(Month(nowDate)) , "0") & Month(nowDate))
dd = CStr(String(2 - Len(Day(nowDate)) , "0") & Day(nowDate))
ss = CStr(String(5 - Len(nowTimer) , "0") & nowTimer)
GetUniqueNumber = yyyy & mm & dd & ss
End Function
End Class
然后,在Action中随便写一点调用函数的测试脚本:
lg.Log "开始示范"
Call Main
Public Sub Main()
lg.GoIn "Main"
'----------------------------------------------------------
lg.Log "我在Main函数里111"
Call test1()
lg.Log "我在Main函数里222"
lg.isPrintLog = False '关闭LOG打印
lg.Log "这个不会出现的"
'----------------------------------------------------------
lg.GoOut
End Sub
Function test1()
lg.GoIn "test1"
'----------------------------------------------------------
lg.Log "我在test1函数里111"
Call test2()
lg.Log "我在test1函数里222"
'----------------------------------------------------------
lg.GoOut
End Function
Function test2()
lg.GoIn "test2"
'----------------------------------------------------------
lg.Log "我在test2函数里"
'----------------------------------------------------------
lg.GoOut
End Function
运行后,打印的结果是:
[] 开始示范
[>>Main] -------------------进入<Main>-------------------
[>>Main] 我在Main函数里111
[>>Main>>test1] -------------------进入<test1>-------------------
[>>Main>>test1] 我在test1函数里111
[>>Main>>test1>>test2] -------------------进入<test2>-------------------
[>>Main>>test1>>test2] 我在test2函数里
[>>Main>>test1>>test2] -------------------退出<test2>-------------------
[>>Main>>test1] 我在test1函数里222
[>>Main>>test1] -------------------退出<test1>-------------------
[>>Main] 我在Main函数里222
当然在这个脚本的目录下的LOG文件夹内,也会有个这样内容的文本文件。
但这段脚本有个小毛病,如果我用Exit Function写在中间,就必须在Exit Function前写上一句lg.Log,不然[]中的记录会错位
回复 6# 黑羽祭
好厉害。 好,学习学习。 不用那么复杂吧。创建一个文本对象,然后在调用函数的初始,用writeline("目前进入**函数")写到日志里面去就可以了啊。 回复 9# yuermoon
终于有人回了。没错,是可以这样。
我这也是个引子,我想能更清晰的记录一下当前位置,如果出现问题,方便查看嘛。
如果遇到:
Call A
Function A()
Call B
print "出错"
End Function
Function B()
print "出错"
End Function
这样的情况,只用进入时打印一下,就不知道那句出错是出错在FunctionA中还是FunctionB中,其实现在又点想法了,自己在优化试试 可以在每个函数里的开头加个“进入xx函数”log语句, 在函数最后再加个“退出xx函数”log语句, 如果函数中间有Exit Function, 那在Exit 之前加个“退出xx函数”的log语句, 只要一个函数有开始和退出Log, 就可以表示执行成功了 回复 11# shingo0109
是啊,我不就是这么做的嘛,只是在这个基础上加了个 路径的保证 和 文件存在否的保证,再加了个能随时打印文件名的Class参数,和一个是否打印LOG的开关量
页:
[1]