装饰器(Decorator) 是 Python 中的一个高级功能,它允许你在 不修改原函数代码 的情况下,动态地扩展或修改函数的行为。装饰器本质上是一个 高阶函数(接受函数作为参数,并返回一个新函数),通常用 @decorator_name 的语法糖来使用。
装饰器的作用
- 代码复用:避免重复写相同的逻辑(如日志、计时、权限检查等)。
- 解耦:将辅助功能(如验证、缓存)和核心逻辑分离。
- 动态扩展:在不修改原函数的情况下添加新功能
@的功能
- 将被装饰对象的名称传递给装饰器的形参
- 被装饰对象的名称接收装饰器的返回值
- 装饰器必须返回一个Callable类型
pytest中的装饰器
@pytest.fixture([scope, autouse=False, params=iterable]): 装饰一个函数,这个函数就是自定义固件。使用自定义固件的方式实现参数化。
@pytest.mark.parametrize("字符串", iterable): 装饰用例,功能为用例实现参数化。
场景测试: @pytest.mark.dependency([depends=["用例名称"], scope="module"]):标记当前用例被依赖或者标记当前用例所依赖的用例。
pip install pytest-dependency
@pytest.mark.run(order=n): 改变用例执行的顺序,n的值越小越先运行.
pip install pytest-ordering
@pytest.mark.usefixtures("固件名称"):装饰用例,让用例调用指定的自定义固件
@pytest.mark.标签名:给用例打标签。在终端运行时,可以使用[pyest 用例模块 -m="标签名"]=>指定运行有相同标签名的用例
@pytest.mark.skip(reason="无条件跳过不执行")
@pytest.mark.skipif(bool表达式, reason="bool表达式为True跳过不执行,为False就执行")
@pytest.mark.xfail(reason="预期失败的用例,不统计到测试结果中")
注意:一个函数或方法可以使用多个装饰器它们会按照 从下到上(从内到外) 的顺序依次执行。这种特性让代码可以灵活地组合多个功能(如日志、缓存、权限检查等),而无需修改原函数。。
示例
import pytest
@pytest.mark.skip(reason="无条件跳过不执行")
@pytest.mark.p1
@pytest.mark.run(order=4)
def test_func1():
print("用例函数1")
@pytest.mark.skipif(1==2, reason="有条件跳过")
@pytest.mark.p0
@pytest.mark.run(order=3)
def test_func2():
print("用例函数2")
@pytest.mark.xfail(reason="预期失败的用例")
@pytest.mark.p0
@pytest.mark.run(order=2)
def test_func3():
print("用例函数3")
assert 1 == 2
@pytest.mark.p1
@pytest.mark.run(order=1)
def test_func4():
print("用例函数4")
if __name__ == '__main__':
pytest.main()
自定义装饰器
示例
def decorator_demo(param):
print(param)
def inner(*args, **kwargs):
# 加代码--前置
print("加前置", args, kwargs)
res = param(*args, **kwargs)
print("加后置")
return res
return inner
@decorator_demo
def func2(a, b):
print("你好")
return a + b
print(func2)
print(func2(b=10, a=20))
class Demo:
@decorator_demo
def sub(self,a, b):
return a - b
d = Demo()
print(d.sub(100, 50))
注意:被装饰的方法或类可以调用装饰器的方法

Comments NOTHING