使用装饰器实现失败的方法重试

    前几天,遇到一个人问我如果在自动化测试框架中,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 语句块来实现必须的一些逻辑处理等等。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值