我有一个返回列表的固定装置,我想为该列表中的每个元素创建一个测试,因此我尝试将其作为 pytest.parametrize 中的参数传递,但它返回整个列表并仅创建一次测试。
@pytest.fixture()
def letters():
lettersABC = ['A', 'B', 'C', 'D']
return lettersABC
@pytest.mark.asyncio
@pytest.mark.parametrize('letter', ["letters"])
async def test_per_letter(letter, request):
name = request.getfixturevalue(letter)
print(f'name {name}')
assert name == 'A'
结果是:
FAILED digital_alarms_auto_test.py::test_per_letter[letters] - AssertionError: assert ['A', 'B', 'C', 'D'] == 'A'
===================================================================================================== 1 failed,
这只是我想要做的一个例子,因为真正的代码更复杂。 字母必须是一种固定装置,而不仅仅是一种功能
最佳答案
使用 fixture :
@pytest.fixture(params=['A', 'B', 'C', 'D'])
def letters(request):
return request.param
def test_per_letter(letters):
name = letters
print(f'name {name}')
assert name == 'A'
另一种选择是:
def pytest_generate_tests(metafunc):
if 'letters' in metafunc.fixturenames:
lettersABC = ['A', 'B', 'C', 'D']
metafunc.parametrize('letters', lettersABC)
def test_per_letter(letters):
name = letters
print(f'name {name}')
assert name == 'A'
输出:
================================================================================ short test summary info =================================================================================
FAILED main_test.py::test_per_letter[B] - AssertionError: assert 'B' == 'A'
FAILED main_test.py::test_per_letter[C] - AssertionError: assert 'C' == 'A'
FAILED main_test.py::test_per_letter[D] - AssertionError: assert 'D' == 'A'
==============================================================================
3 failed, 1 passed in 0.14s ===============================================================================
关于python - 如何将列表装置作为参数传递给 pytest.parametrize?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70972985/