前几天,遇到一个人问我如果在自动化测试框架中,case失败了需要重试要怎么处理?我当时脑海中的第一反应,就是使用unittest自带的失败重试机制来实现。但是事后我查了一下,发现unittest并没有这种机制,要是需要的话只能自己修改源码(最近在看这部分的源码,下次可以整理下这种方式来实现),所以我想到的第二个方法就是使用装饰器了。
思路很简单,可以概括为以下几点:
1. 支持自定义失败重试次数
2. 支持定义捕捉Exception类型,通过使用 try 捕捉异常,当发现被修饰的方法出现指定的异常类型时就触发重试,一直到指定的重试次数完成
下面就直接上代码:
def fault_retry(**kw): # 使用不定长的参数,方便日后扩展
def wrapper(func):
def retry(*args, **kwargs):
try:
result = func(*args, **kwargs)
# 捕捉方法中出现的 Exception 类型异常,也可以自定义
except Exception as ex:
if kw['re_num'] > 0:
print(f"失败!原因为:{ex.__str__()}")
print(f"正在重试第 {kw['re_num']} 次...\n")
kw['re_num'] -= 1
result = retry(*args, **kwargs)
else:
result = "重试结束!"
print(result)
return res
return retry
return wrapper
测试方法,我这里模拟的是除数不能为0的错误:
@fault_retry(re_num=2)
def test():
num = int(input("请输入除数:"))
a = 1/num
print(a)
if __name__ == '__main__':
test()
结果:
我这里的例子只是实现了基本功能,具体的可以根据自己的需要去修改,比如把print改为统一的log输出,或者添加 finally 语句块来实现必须的一些逻辑处理等等。