接口测试 pytest 中 @pytest.mark.parametrize 和自定义装饰器结合使用的时候为什么参数一定要是不可变参数

Yh。 · 2021年04月06日 · 最后由 MarvinWu 回复于 2021年04月08日 · 2687 次阅读

可变参数的形式会报错

def addlog(func):
    def wrapper(self,*args,**kwargs):
        print('装饰器开始')
        func(self,*args,**kwargs)
        print(args,kwargs)
        print('装饰器结束')
    return wrapper

class TestObj:
    data=[['aaa',11],['bbb',22]]
    @user1ize("name,age",data)
    @addlog
    def test_A(self,name,age):
        print('开始用例',name,age)

换成不可变参数是可以正常运行的

def addlog(func):
    def wrapper(self,name,age):
        print('装饰器开始')
        func(self,name,age)
        print(name,age)
        print('装饰器结束')
    return wrapper


class TestObj:
    data=[['aaa',11],['bbb',22]]
    @user3ize("name,age",data)
    @addlog
    def test_A(self,name,age):
        print('开始用例',name,age)

请问结合使用的话,装饰器里面的参数为什么一定要为不可变参数?

共收到 2 条回复 时间 点赞

因为@pytest.mark.parametrize 声明了两个参数,分别是 name 和 age,而你自定义的装饰器的方法中没有使用,所以会看到 function uses no argument 的提示。
pytest 是一个框架,test_A 作为一条用例,执行过程比较复杂,不能当做普通方法来理解。

讲再细一点的话,
1、问题发生在收集用例的阶段
2、参数化的装饰器在上面,所以先执行,要求被它装饰的方法中必须有 name,age 这两个参数
3、addlog 装饰器返回的实际上是 wrapper 方法,@pytest.mark.parametrize 检查 wrapper 方法发现没有 name、age 这两个参数,抛出异常
4、wrapper 实际上并未执行,所以打印不出来'装饰器开始'

Yh。 关闭了讨论 04月08日 14:20
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册