51Testing软件测试论坛

标题: 【头脑风暴】如何在脚本运行时,Log中能记录当前进入的函数 [打印本页]

作者: 黑羽祭    时间: 2013-1-24 15:32
标题: 【头脑风暴】如何在脚本运行时,Log中能记录当前进入的函数
本帖最后由 黑羽祭 于 2013-1-24 15:58 编辑

头脑风暴一下,如何在脚本运行时,Log中能记录当前进入的函数
各位都是如何实现的?
如:进入函数A,再进入函数B
就是能很清楚的打印出 [A>>B]这样的一个路径
当脚本出现问题,能很容易定位到是在[A>>B]还是[A>>C]的问题。
作者: 黑羽祭    时间: 2013-1-24 15:33
大家随意发言~
作者: lsekfe    时间: 2013-1-24 15:42
进来支持下。。。不错的话题!
作者: 黑羽祭    时间: 2013-1-25 09:06
厄~肿么没人说话呢~
作者: 赵佳乐SMILE    时间: 2013-1-25 11:42
因为不会啊 不会打log呢
最好是写一个共通 然后每个函数调一下这个共通

共通应该是
你进入一个函数就取得函数名  不知道有没有这个方法
返回一个执行结果
然后拼呗
=====
A OK
B NG
====
A OK
C OK
作者: 黑羽祭    时间: 2013-1-25 16:58
本帖最后由 黑羽祭 于 2013-1-25 17:00 编辑

回复 5# 赵佳乐SMILE


    好吧,那我来抛砖引玉一下~比如:我在外部vbs文件中写入一段脚本,是个log工具的class:
  1. Set Lg   = new LogTools      '实例化 LogTools

  2. Class LogTools
  3.     Dim LogFileName        'log文件名
  4.     Dim LogFilePath           'log文件路径
  5.     Dim isPtLog                 '是否打印日志
  6.     Dim NowFunctionDir    '当前Function的路径
  7.    
  8.     Sub Class_Initialize
  9.         Call NewLogFolder
  10.         Call NewLogFile
  11.         Depth = 0
  12.     End Sub

  13.     Sub Class_Terminate
  14.         
  15.     End Sub
  16.    
  17.     '------------------------------------------------------------------------
  18.     '返值:log文件名
  19.     Property Get getLogFileName()  
  20.         '处理 LogFileName
  21.         If IsEmpty(LogFileName) Then
  22.             LogFileName = "log" & getUniqueNumber & ".txt"
  23.         End If
  24.         
  25.          getLogFileName = LogFileName
  26.     End Property
  27.    
  28.     '------------------------------------------------------------------------
  29.     '返值:log文件路径
  30.     Property Get getLogFilePath()
  31.         '处理 LogFilePath
  32.         If IsEmpty(LogFilePath) Then LogFilePath = Environment("TestDir") & "\LOG\" & getLogFileName
  33.         
  34.         getLogFilePath = LogFilePath
  35.     End Property
  36.    
  37.     '------------------------------------------------------------------------
  38.     '返值:当前Function的路径
  39.     Property Get getNowFunctionDir()
  40.         getNowFunctionDir = NowFunctionDir
  41.     End Property
  42.    
  43.     '------------------------------------------------------------------------------
  44.     '属性:是否打印 log
  45.     Property Let isPrintLog(ByVal oValue)
  46.          isPtLog = oValue
  47.          isPrintLog = isPtLog
  48.     End Property
  49.     Property Get isPrintLog()
  50.         If IsEmpty(isPtLog) Then
  51.             '给默认值
  52.             isPtLog = True
  53.         End If
  54.         isPrintLog = isPtLog
  55.     End Property
  56.    
  57.     '------------------------------------------------------------------------
  58.     '作用:新建Log文件夹
  59.     Sub NewLogFolder()
  60.         Dim FSO , FolderDir
  61.         Set FSO = CreateObject("Scripting.FileSystemObject")
  62.         FolderDir = Environment("TestDir") & "\LOG"
  63.         If Not(FSO.FolderExists(FolderDir)) Then
  64.             FSO.CreateFolder(FolderDir)
  65.         End If
  66.         Set FSO = Nothing
  67.     End Sub
  68.    
  69.     '------------------------------------------------------------------------
  70.     '作用:新建Log文件
  71.     Sub NewLogFile()
  72.         '新建文件
  73.         Dim FSO
  74.         Const ForReading=1,ForWriting=2,ForAppending=8      '参数赋值(1:只读,2:只写,3:追加)
  75.         Set FSO = CreateObject("Scripting.FileSystemObject")    '创建一个文本对象
  76.         Set LOGFILE = FSO.OpenTextFile(getLogFilePath,8,true)
  77.         wait 3
  78.         Set LOGFILE = Nothing
  79.         Set FSO = Nothing
  80.     End Sub

  81.    '------------------------------------------------------------------------
  82.     '作用:重写 Log
  83.     '参数:oWords:需要打印的内容
  84.     Sub Log(oWords)
  85.         '是否打印的判断
  86.         If isPrintLog = False Then Exit Sub
  87.         
  88.         '处理打印内容
  89.         oWords = "[" & now & "] [" & NowFunctionDir & "] " & oWords
  90.         
  91.         'Log 写入QTP
  92.         print oWords
  93.         
  94.         'LOG 写入外部文件
  95.         Dim FSO
  96.         Set FSO = CreateObject("Scripting.FileSystemObject")
  97.         Set ologFile = FSO.OpenTextFile(getLogFilePath, 8, true)
  98.         ologFile.WriteLine (CStr(oWords))
  99.         ologFile.Close
  100.         Set ologFile = Nothing
  101.         Set FSO = Nothing
  102.     End Sub


  103.    '------------------------------------------------------------------------
  104.     '作用:进入 Function 时的标记
  105.     '参数:oFunctionName:Function名
  106.     Sub GoIn(oFunctionName)
  107.         NowFunctionDir = NowFunctionDir & ">>" & oFunctionName
  108.         Log "-----------------进入<" & oFunctionName & ">-----------------"
  109.     End Sub
  110.    
  111.    
  112.     '------------------------------------------------------------------------
  113.     '作用:出 Function 时的标记
  114.     Sub GoOut()
  115.         Dim arrFunDir
  116.         arrFunDir = split(NowFunctionDir , ">>" , -1 , 1)
  117.         Log "-----------------退出<" & arrFunDir(ubound(arrFunDir)) & ">-----------------"
  118.         
  119.         NowFunctionDir = ""
  120.         Dim i
  121.         For i = 1 To ubound(arrFunDir) - 1
  122.             NowFunctionDir = NowFunctionDir & ">>" & arrFunDir(i)
  123.         Next
  124.     End Sub
  125.    
  126.    
  127.     '------------------------------------------------------------------------------
  128.     '作用:得到一个唯一的值
  129.     Function getUniqueNumber()  
  130.         Dim yyyy,mm,dd,ss
  131.         Dim nowtime
  132.         nowDate = date
  133.         nowTimer = cstr(int(timer))
  134.         yyyy = CStr(Year(nowDate))
  135.         mm = CStr(String(2 - Len(Month(nowDate)) , "0") & Month(nowDate))
  136.         dd = CStr(String(2 - Len(Day(nowDate)) , "0") & Day(nowDate))
  137.         ss = CStr(String(5 - Len(nowTimer) , "0") & nowTimer)
  138.         GetUniqueNumber = yyyy & mm & dd & ss
  139.     End Function
  140.    
  141. End Class
复制代码



然后,在Action中随便写一点调用函数的测试脚本:
  1. lg.Log "开始示范"
  2. Call Main


  3. Public Sub Main()
  4.     lg.GoIn "Main"
  5.     '----------------------------------------------------------
  6.     lg.Log "我在Main函数里111"
  7.     Call test1()
  8.     lg.Log "我在Main函数里222"
  9.     lg.isPrintLog = False     '关闭LOG打印
  10.     lg.Log "这个不会出现的"
  11.     '----------------------------------------------------------
  12.     lg.GoOut
  13. End Sub

  14. Function test1()
  15.     lg.GoIn "test1"
  16.     '----------------------------------------------------------
  17.     lg.Log "我在test1函数里111"
  18.     Call test2()
  19.     lg.Log "我在test1函数里222"
  20.     '----------------------------------------------------------
  21.     lg.GoOut
  22. End Function

  23. Function test2()
  24.     lg.GoIn "test2"
  25.     '----------------------------------------------------------
  26.     lg.Log "我在test2函数里"
  27.     '----------------------------------------------------------
  28.     lg.GoOut
  29. End Function
复制代码



运行后,打印的结果是:
[2013/1/25 16:52:55] [] 开始示范
[2013/1/25 16:52:55] [>>Main] -------------------进入<Main>-------------------
[2013/1/25 16:52:55] [>>Main] 我在Main函数里111
[2013/1/25 16:52:55] [>>Main>>test1] -------------------进入<test1>-------------------
[2013/1/25 16:52:55] [>>Main>>test1] 我在test1函数里111
[2013/1/25 16:52:55] [>>Main>>test1>>test2] -------------------进入<test2>-------------------
[2013/1/25 16:52:55] [>>Main>>test1>>test2] 我在test2函数里
[2013/1/25 16:52:55] [>>Main>>test1>>test2] -------------------退出<test2>-------------------
[2013/1/25 16:52:56] [>>Main>>test1] 我在test1函数里222
[2013/1/25 16:52:56] [>>Main>>test1] -------------------退出<test1>-------------------
[2013/1/25 16:52:56] [>>Main] 我在Main函数里222


当然在这个脚本的目录下的LOG文件夹内,也会有个这样内容的文本文件。
但这段脚本有个小毛病,如果我用Exit Function写在中间,就必须在Exit Function前写上一句lg.Log,不然[]中的记录会错位





作者: 赵佳乐SMILE    时间: 2013-1-27 09:51
回复 6# 黑羽祭


    好厉害。
作者: user603    时间: 2013-1-28 17:27
好,学习学习。
作者: yuermoon    时间: 2013-4-19 08:55
不用那么复杂吧。创建一个文本对象,然后在调用函数的初始,用writeline("目前进入**函数")写到日志里面去就可以了啊。
作者: 黑羽祭    时间: 2013-4-19 09:49
回复 9# yuermoon


    终于有人回了。没错,是可以这样。
我这也是个引子,我想能更清晰的记录一下当前位置,如果出现问题,方便查看嘛。
如果遇到:
Call A
Function A()
    Call B
    print "出错"
End Function
Function B()
    print "出错"
End Function
这样的情况,只用进入时打印一下,就不知道那句出错是出错在FunctionA中还是FunctionB中,其实现在又点想法了,自己在优化试试
作者: shingo0109    时间: 2013-4-19 09:50
可以在每个函数里的开头加个“进入xx函数”log语句, 在函数最后再加个“退出xx函数”log语句, 如果函数中间有Exit Function, 那在Exit 之前加个“退出xx函数”的log语句, 只要一个函数有开始和退出Log, 就可以表示执行成功了
作者: 黑羽祭    时间: 2013-4-19 09:55
回复 11# shingo0109


    是啊,我不就是这么做的嘛,只是在这个基础上加了个 路径的保证 和 文件存在否的保证,再加了个能随时打印文件名的Class参数,和一个是否打印LOG的开关量




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2