装饰器叠加
欢迎关注我呀~「测试游记」「zx94_11」
在使用pytest+allure进行自动化脚本开发的时候,在case头部需要增加很多装饰器才能使报告按照预期格式展示
例如我需要报告展示如下:
那我需要编写的代码为:
1 |
|
现在需要将他们变成一行
1 |
|
为了实现这个目标,先来回忆一下装饰器运行的方式,可以阅读一下「测试开发进阶(四)」。
拿出一部分上面allure
代码:
1 |
|
其实就相当于:
1 | test_b = allure.feature('大模块')(test_b) |
所以整一份就是:
1 | test_b = allure.feature('大模块')( |
不过按照装饰器的调用顺序的话,应该是allure.issue
是第一个,所以要把它整个给倒过来,但是对于allure来说这个顺序并不是很重要。
1 | test_b = allure.issue('url', '问题单:xxx')( |
编写一个函数接受不定长的参数:
1 | def compose(**kwargs): |
因为它要作为一个装饰器,所以需要在内部再写一个函数并返回
1 | def compose(**kwargs): |
在...
中出入传入的参数
为了偷懒,所以入参没加上allure
,需要人为进行一次处理,使用列表推导式快速的拿到:
1 | _kwargs = [('allure.' + key, value) for key, value in kwargs.items()] |
按照上面说的需要倒过来执行,所以使用reversed
把列表倒一下
每次都重新赋值f
:eval(allurefunc)(f)
1 | for allurefunc, param in reversed(_kwargs): |
为了防止找不到allure模块,增加一下它
1 | builtins.__dict__.update({'allure': allure}) |
所以完整代码:https://github.com/zx490336534/ZXTestFrame/blob/master/zxapi/utils/allureoperator.py
1 | # -*- coding:utf-8 -*- |
当然这份代码也可以改变成任意的装饰器叠加