装饰器的作用是给已有的函数增加功能,在自动化领域经常会用到,比如你写的一个接口,想要输出一种固有的log,又想减少代码行数,那么装饰器再好不过了。
他可以声明一种规则,输出你想要的固有的log,从而暴露出去,更好的加以利用,比如,设计平台接收它。
写下代码:
def functrack(func):
@wraps(func)
def wrapper(*args,**kwargs):
printLog("[FUNC CALL TRACK INFO]:{}()".format(func.__name__))
flag=false
try:
res=func(*args,**kwargs)
if "expect" in kwargs:
expect_res=kwargs["expect"]
if expect_res!=None and type(res)==bool and expect_res!=res:
printLog("[FUNC CALL TRACK ERROR INFO]:Result is different from expected"+",when call {}")
printFail()
#截图保存
#如果配置了screencap参数,若该参数screencap参数,若该参数screencap==True才会截图到PIC目录
if "screencap" in kwargs:
screencap=kwargs["screencap"]
if screencap:
_screencap_save()
#如果没有配置screencap参数,默认截图到PIC目录
else:
_screencap_save()
#抛出异常标志位
flag=True
raise Exception("Result is different from expected")
return res
except Exception as e:
if not flag:
print(e)
printFail()
#如果配置了screencap参数,若该参数screencap参数,若该参数screencap==True才会截图到PIC目录
if "screencap" in kwargs:
screencap=kwargs["screencap"]
if screencap:
_screencap_save()
#如果没有配置screencap参数,默认截图到PIC目录
else:
_screencap_save()
printLog("[FUNC CALL TRACK ERROR INFO]:"+str(e)+",when call {}()".format(func.__name__))
rasie e
return wrapper
import time
testcase_index=""
timestamp=time.time()
LOG_PATH='你存储的log路径'
def printLog(*data,**kargs):
if testcase_index:
logpath=LOG_PATH+os.sep+testcase_index+'.py_'+timestamp+'.log'
else:
logpath=LOG_PATH+os.sep+timestamp+'.log'
logLine=time.time()
for ele in data:
logLine=logLine+str(ele)+","
for k,v in kargs.items():
logLine=logLine+str(k)+"."+str(v)+","
if logLine and len(logLine)>= 0 and logLine[-1]==",":
logLine=logLine[:-1]
print(logLine)
logLine=logLine+"\n"
with open(logpath,mode='a') as f:
try:
f.write(logLine)
except:
print('Write log failed\n')
finally:
f.close()
然后,再其他类里就可以用这个装饰器了,比如,你的方法为:
@functrack
def getName():
…
这样,getName就有了特定输出log的功能了!