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_test
和 sanity_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))
我是 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_test
和 sanity_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))