在pytest中使用参数化,方式如下:
import pytest
testparams = [
(1, 2, 3, 4, 5, 6, 7),
(7, 6, 5, 4, 3, 2, 1),
]
@pytest.mark.parametrize('a, b, c, d, e, f, g', testparams)
def test_many_args(a, b, c, d, e, f, g):
a+b+c+d+e+f+g==28
可以发现 在pytest.mark.parametrize
写了参数名a,b,c,d,e,f,g, 在test_many_args中又写了a,b,c,d,e,f,g一遍,重复编写了参数,有什么方法可以去除呢?
经过探索,现已完成去除重复编写参数的功能。
核心代码如下:
def auto_parametrize(argvalues, *args, **kwargs):
def decorator(func):
try:
argvalue = argvalues[0]
except IndexError:
raise ValueError('argvalues must be non-empty')
except TypeError:
raise TypeError('argvalues must be a sequence')
argvalue = ParameterSet.extract_from(argvalue).values
argspec = inspect.getfullargspec(func)[0]
if 'self' in argspec:
argspec.remove('self')
argnames = argspec[:len(argvalue)] if isinstance(argvalue, (list, tuple)) else argspec[0]
return pytest.mark.parametrize( argnames, argvalues, *args, **kwargs)(func)
return decorator
以上核心代码非原创,参考 GitHub - mgeier/pytest-auto-parametrize ,修复了某些Bug。