利用装饰器,帮你自动处理异常并优雅实现重跑case

70 篇文章 3 订阅
23 篇文章 22 订阅

前言

同学们是否遇到过这些场景?

case因为网络波动而跑失败了?在最后时刻,系统弹出了一条骚扰短信遮挡了关键位置,脚本硬是没跑过去?又或者因为手机上的闹铃响起来,让脚本运行意外失败了?

相信很多同学都会想到用代码去处理这些异常,因为我们总不能时时刻刻盯着脚本运行,然后在出现异常时手动处理掉,但是代码可以帮我们实现自动处理异常。

但也有很多同学,因为处理异常复制粘贴了大量代码,用例脚本里面随处可见处理异常的代码。所以今天我们将教大家在不改动原有用例脚本的情况下,利用装饰器优雅地处理异常并实现case重试操作,同学们千万不能错过呀~

(PS:已会用装饰器的同学,可以直接拉到文末查看实操应用哦~)

1.装饰器的定义

装饰器可以在不改动原函数代码的情况下,添加其原本没有的功能。简单点说,就是修改其它函数的功能的函数。通过使用装饰器,我们可以让一个函数的功能变的更加强大,还可以让我们的代码更加简短整洁。

2.用简单的示例入门装饰器

首先我们定义了一个 test 函数,这个函数的作用就是打印出一句话:这是一个平平无奇的函数。

函数定义如下:

def test():
    print("这是一个平平无奇的函数")

test()

>>>输出:
# 这是一个平平无奇的函数

如果需要print两次,大家会怎么实现呢?有同学说,直接复制一行print,也有同学说,直接在函数中增加一个for循环实现,其实都是可以的:

# 方式一
def test():
    print("这是一个平平无奇的函数")
    print("这是一个平平无奇的函数")

# 方式二
def test():
    for i in range(2):
        print("这是一个平平无奇的函数")

test()

>>>输出:
# 这是一个平平无奇的函数
# 这是一个平平无奇的函数

假设我们要重复print两次,但又不想修改原函数的代码,我们要怎么做呢? 没错啦,我们可以定义装饰器来实现:

# 原函数
def test():
    print("这是一个平平无奇的函数")

# 定义1个装饰器
def loop(func):
    def wrapper(*args, **kw):
        for i in range(2):
            func(*args, **kw)
    return wrapper

可以看到,我们并没有改变原有函数,但是我们用装饰器改变了原函数的功能,用上述装饰器帮助我们重复运行2次原函数。

那么接下来,我们继续来看看如何使用装饰器:

方式一:不使用语法糖@符号的调用方法:

loop(test)()

>>>输出:
# 这是一个平平无奇的函数
# 这是一个平平无奇的函数

方式二:使用语法糖@符号的调用方法:

@loop
def test():
    print("这是一个平平无奇的函数")

test()

>>>输出:
# 这是一个平平无奇的函数
# 这是一个平平无奇的函数

实际上装饰器可以多次叠加,比如:

@loop
@loop
def test():
    print("这是一个平平无奇的函数")

test()

>>>输出:
# 这是一个平平无奇的函数
# 这是一个平平无奇的函数
# 这是一个平平无奇的函数
# 这是一个平平无奇的函数

有一点值得注意的地方,同学们猜一猜,如果我们叠加三次装饰器,会出现什么结果呢?(看到这里的同学可以先思考一下,然后再动手跑一下看看是不是你预想的结果)

@loop
@loop
@loop
def test():
    print("这是一个平平无奇的函数")

test()

>>>输出:
# 这是一个平平无奇的函数
# 这是一个平平无奇的函数
# 这是一个平平无奇的函数
# 这是一个平平无奇的函数
# 这是一个平平无奇的函数
# 这是一个平平无奇的函数
# 这是一个平平无奇的函数
# 这是一个平平无奇的函数

可以看到,输出结果并不是6次,而是8次,为什么呢?我们用普通的调用方式来分析一下就知道了:

上述代码就相当于:loop(loop(loop(test)))(),真正调用的是最外面那层。 当你调用多次时,装饰器将函数连同装饰器自身作为参数一起循环执行了,所以实际执行次数为2×(2×2),即8次。

如果你需要定义具体的执行次数,可以直接在装饰器中传入参数实现,具体如下:

def loop(times):
    def decorator(func):
        def wrapper(*args, **kw):
            for i in range(times):
                func(i, **kw)
        return wrapper
    return decorator

@loop(6)
def test(num):
    print(f"这是一个平平无奇的函数, 第{num+1}次运行")

test()

输出:
# 这是一个平平无奇的函数, 第1次运行
# 这是一个平平无奇的函数, 第2次运行
# 这是一个平平无奇的函数, 第3次运行
# 这是一个平平无奇的函数, 第4次运行
# 这是一个平平无奇的函数, 第5次运行
# 这是一个平平无奇的函数, 第6次运行

3.应用装饰器实现Airtest脚本失败自动重跑

举个例子,你正在跑一个自动化测试脚本,突然间设备的闹钟响了,而刚好闹钟的界面遮挡住了你要操作的那个按钮,最终导致脚本运行失败了。没办法,你只能关掉闹钟再重新运行一次脚本。

在这个测试场景中,我们如何应用装饰器帮助我们解决闹钟异常,然后重跑我们的测试用例呢?答案如下:

image

我们新建了1个装饰器,这个装饰器会尝试运行我们的用例,如果遇到闹钟遮挡,则会自动处理掉这个闹钟,然后再重跑用例,最终还会打印出重跑结果,效果如下:

image

可以看到,我们在没有改变用例函数的情况下,增加了装饰器,使得原函数有了处理异常和重跑的功能,这就是装饰器函数的魅力所在。

最后借用某位不知名大佬说的话:别妄想着看看就能理解,动手跑一跑代码,一切都豁然开朗了。

如果觉得文章对你有帮助,麻烦 点赞、评论、收藏 你的支持是我最大的动力!!!
然后小编在学习过程中整理了一些学习资料,需要的可以加入我的学习交流群 323432957 或加微dingyu-002即可免费获取Python自动化测开及Java自动化测开学习资料(里面有功能测试、性能测试、python自动化、java自动化、测试开发、接口测试、APP测试等多个知识点的架
构资料)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值