Pytest装饰器

hkt 发布于 2025-08-04 21 次阅读


装饰器(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))

注意:被装饰的方法或类可以调用装饰器的方法

此作者没有提供个人介绍。
最后更新于 2025-08-08