gpt4 book ai didi

python - pytest 测试参数化覆盖

转载 作者:太空宇宙 更新时间:2023-11-04 01:59:58 24 4
gpt4 key购买 nike

我目前正在使用 pytest_generate_tests 对我所有的测试用例进行参数化,这很有效。

我现在想做的是针对特定测试覆盖此行为。如果我尝试在测试本身上使用 pytest.mark.parametrize 装饰器,我会得到一个 ValueError: duplicate 错误,这是可以理解的,因为我现在正在尝试参数化在两个地方进行测试。

有没有一种方法可以覆盖这个测试用例的“默认”参数化?

我可以通过执行类似下面的操作来实现此目的,但这是一种非常 hacky 的方法:

def pytest_generate_tests(metafunc):
fixture_modes = ['mode1', 'mode2']
if 'fixture' in metafunc.fixturenames:
fixture = metafunc.config.getoption('fixture')
if fixture:
fixture_modes = [fixture]
if metafunc.function.__name__ != 'func_to_skip':
metafunc.parametrize('fixture_mode', fixture_modes, indirect=True)

有更好的方法吗?

最佳答案

例如,您可以检查测试是否为 fixture_mode 定义了自己的参数化标记

def pytest_generate_tests(metafunc):
fixture_modes = ['spam', 'eggs']
mark = metafunc.definition.get_closest_marker('parametrize')
if not mark or 'fixture_mode' not in mark.args[0]:
metafunc.parametrize('fixture_mode', fixture_modes, indirect=True)

现在,显式参数化将覆盖默认参数化:

def test_spam(fixture_mode):
...

@pytest.mark.parametrize('fixture_mode', (1, 2, 3))
def test_eggs(fixture_mode):
...

test_spam 将获得默认参数化,test_eggs 将获得自定义参数:

test_mod.py::test_spam[spam]
test_mod.py::test_spam[eggs]
test_mod.py::test_eggs[1]
test_mod.py::test_eggs[2]
test_mod.py::test_eggs[3]

关于python - pytest 测试参数化覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55919764/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com