黑羽祭 发表于 2013-1-24 15:32:34

【头脑风暴】如何在脚本运行时,Log中能记录当前进入的函数

本帖最后由 黑羽祭 于 2013-1-24 15:58 编辑

头脑风暴一下,如何在脚本运行时,Log中能记录当前进入的函数
各位都是如何实现的?
如:进入函数A,再进入函数B
就是能很清楚的打印出 这样的一个路径
当脚本出现问题,能很容易定位到是在还是的问题。

黑羽祭 发表于 2013-1-24 15:33:08

大家随意发言~

lsekfe 发表于 2013-1-24 15:42:37

进来支持下。。。不错的话题!

黑羽祭 发表于 2013-1-25 09:06:30

厄~肿么没人说话呢~

赵佳乐SMILE 发表于 2013-1-25 11:42:54

因为不会啊 不会打log呢
最好是写一个共通 然后每个函数调一下这个共通

共通应该是
你进入一个函数就取得函数名不知道有没有这个方法
返回一个执行结果
然后拼呗
=====
A OK
B NG
====
A OK
C OK

黑羽祭 发表于 2013-1-25 16:58:26

本帖最后由 黑羽祭 于 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,不然[]中的记录会错位




赵佳乐SMILE 发表于 2013-1-27 09:51:59

回复 6# 黑羽祭


    好厉害。

user603 发表于 2013-1-28 17:27:27

好,学习学习。

yuermoon 发表于 2013-4-19 08:55:41

不用那么复杂吧。创建一个文本对象,然后在调用函数的初始,用writeline("目前进入**函数")写到日志里面去就可以了啊。

黑羽祭 发表于 2013-4-19 09:49:18

回复 9# yuermoon


    终于有人回了。没错,是可以这样。
我这也是个引子,我想能更清晰的记录一下当前位置,如果出现问题,方便查看嘛。
如果遇到:
Call A
Function A()
    Call B
    print "出错"
End Function
Function B()
    print "出错"
End Function
这样的情况,只用进入时打印一下,就不知道那句出错是出错在FunctionA中还是FunctionB中,其实现在又点想法了,自己在优化试试

shingo0109 发表于 2013-4-19 09:50:49

可以在每个函数里的开头加个“进入xx函数”log语句, 在函数最后再加个“退出xx函数”log语句, 如果函数中间有Exit Function, 那在Exit 之前加个“退出xx函数”的log语句, 只要一个函数有开始和退出Log, 就可以表示执行成功了

黑羽祭 发表于 2013-4-19 09:55:29

回复 11# shingo0109


    是啊,我不就是这么做的嘛,只是在这个基础上加了个 路径的保证 和 文件存在否的保证,再加了个能随时打印文件名的Class参数,和一个是否打印LOG的开关量
页: [1]
查看完整版本: 【头脑风暴】如何在脚本运行时,Log中能记录当前进入的函数