【分享】 避免在pytest.mark.parametrize参数化中编写重复参数

在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。

3 个赞

不太懂怎么把自己写的装饰器,改用使用pytest@pytest.xx_decorator()的形式调用。

花花你做个汇总帖吧,我加个精