我想为用pytest编写的测试创建一个装饰器。我的问题是,在调用decorator时,pytest引发了一个异常,即decorator尚未获取参数“ test_params”。
装饰器示例:
def decorator_example(fn):
def create(*args, **kwargs):
# any code here
return fn(*args, **kwargs)
return create
测试示例:
@pytest.mark.parametrize(
"test_params",
[
pytest.param("own_parameters")
])
@decorator_example
def test_1(self, fixture1, fixture2, test_params):
pass
并捕获到异常:
ValueError: <function create at address> uses no argument 'test_params'
如何创建与pytest的参数化测试兼容的装饰器?
答案 0 :(得分:1)
这是因为decorator_example
用具有完全不同签名的包装函数test_1
替换了create
函数,破坏了pytest
的内省(例如,检查create
有一个参数test_params
失败,因为只有*args
和**kwargs
可用)。您需要使用functools.wraps
来模拟包装函数的签名:
import functools
def decorator_example(fn):
@functools.wraps(fn)
def create(*args, **kwargs):
# any code here
return fn(*args, **kwargs)
return create
您可以使用decorator
软件包。用通常的方式安装
$ pip install decorator
上面的示例将是:
import decorator
def decorator_example(fn):
def create(fn, *args, **kwargs):
return fn(*args, **kwargs)
return decorator.decorator(create, fn)
或使用six
:
import six
def decorator_example(fn):
@six.wraps(fn)
def create(*args, **kwargs):
# any code here
return fn(*args, **kwargs)
return create