Python - 对不同的装饰器集使用相同的函数

Python - use same function with different sets of decorators

我是 Python 的新手,如果问题很愚蠢,请见谅。

我有几个 pytest 测试函数,它们既可以用作完整性测试,也可以用作回归测试。所以函数本身是一样的,但是 @pytest.mark.parametrize 装饰器中使用的值是不同的。

除此之外,我需要 mark 我的测试,这样 CI 工作就会知道要 运行 做什么 - 所以最终代码看起来像

@pytest.mark.service1
@pytest.mark.parametrize('args', regression_object_to_take_args_from)
def regression_test(args): 
    pass

@pytest.mark.service1
@pytest.mark.parametrize('args', sanity_object_to_take_args_from)
def sanity_test(args): 
    pass

其中 regression_testsanity_test 具有完全相同的内容。

如何在两种情况下使用相同的函数实例?

这里有不同的方法。可能最简单的就是使用辅助函数:

def _same_logic(args):
    # same stuff
    ...

@pytest.mark.service1
@pytest.mark.parametrize('args', regression_object_to_take_args_from)
def regression_test(args): 
    _same_logic(args)

@pytest.mark.service1
@pytest.mark.parametrize('args', sanity_object_to_take_args_from)
def sanity_test(args): 
    _same_logic(args)

或者,另一种方法实际上是用不同的装饰器集装饰同一个函数,只需手动进行装饰:

def _same_logic(args):
    # same stuff
    ...

regression_test = pytest.mark.service1(
    pytest.mark.parametrize('args', regression_object_to_take_args_from)(
        _same_logic
    )
)

regression_test = pytest.mark.service1(
    pytest.mark.parametrize('args', sanity_object_to_take_args_from)(
        _same_logic
    )
)

提醒,

@foo
@bar(some_value)
def baz(arg):
    ...

等同于:

def baz(arg):
    ...

baz = foo(bar(some_value)(baz))