如何使用具有相同参数化输入的多个 pytest fixture 来测试 class 中的方法
How to use multiple pytest fixtures with same parameterized input to test methods in a class
我想实现这样的目标:
我的 conftest.py 将包含:
- fixture_1 - 将使用 request.param
对 a、b、c 等输入进行一些操作
- fixture_2 - 将使用 request.param
对 a、b、c 等输入进行一些操作
- fixture_3 - 将使用 request.param
对 a、b、c 等输入进行一些操作
@pytest.mark.parametrize('param_name', ['a', 'b', 'c'], indirect=True)
class TestDummy(object):
def test_x(self, fixture_1):
fixture_1_output = fixture_1
assert False
def test_y(self, fixture_2):
fixture_2_output = fixture_2
assert False
def test_z(self, fixture_3):
fixture_3_output = fixture_3
assert False
如有任何建议,我们将不胜感激。
您不能通过这种方式直接参数化灯具名称。要么分别为每个测试使用参数化:
def params():
return ['a', 'b', 'c']
class TestDummy:
@pytest.parametrize(fixture_1, params, indirect=True)
def test_x(self, fixture_1):
fixture_1_output = fixture_1
assert False
@pytest.parametrize(fixture_2, params, indirect=True)
def test_y(self, fixture_2):
fixture_2_output = fixture_2
assert False
@pytest.parametrize(fixture_3, params, indirect=True)
def test_z(self, fixture_3):
fixture_3_output = fixture_3
assert False
(为了方便,我把参数移到了一个额外的函数中)
或者您必须使用 pytest_generate_tests
:
根据灯具名称动态地进行参数化
def pytest_generate_tests(metafunc):
fixtures = [f for f in metafunc.fixturenames if f.startswith("fixture_")]
if len(fixtures) == 1:
metafunc.parametrize(fixtures[0], ['a', 'b', 'c'], indirect=True)
class TestDummy:
def test_x(self, fixture_1):
fixture_1_output = fixture_1
assert False
def test_y(self, fixture_2):
fixture_2_output = fixture_2
assert False
def test_z(self, fixture_3):
fixture_3_output = fixture_3
assert False
def test_something_else(self):
pass
您需要确定要对哪些测试进行参数化 - 在此示例中,所有测试都已参数化,其中只有一个夹具的名称以“fixture_”开头,您可能需要根据需要进行调整。
在此示例中,将对前 3 个测试进行参数化,但不会对最后一个 (test_something_else
) 进行参数化。
我想实现这样的目标:
我的 conftest.py 将包含:
- fixture_1 - 将使用 request.param 对 a、b、c 等输入进行一些操作
- fixture_2 - 将使用 request.param 对 a、b、c 等输入进行一些操作
- fixture_3 - 将使用 request.param 对 a、b、c 等输入进行一些操作
@pytest.mark.parametrize('param_name', ['a', 'b', 'c'], indirect=True)
class TestDummy(object):
def test_x(self, fixture_1):
fixture_1_output = fixture_1
assert False
def test_y(self, fixture_2):
fixture_2_output = fixture_2
assert False
def test_z(self, fixture_3):
fixture_3_output = fixture_3
assert False
如有任何建议,我们将不胜感激。
您不能通过这种方式直接参数化灯具名称。要么分别为每个测试使用参数化:
def params():
return ['a', 'b', 'c']
class TestDummy:
@pytest.parametrize(fixture_1, params, indirect=True)
def test_x(self, fixture_1):
fixture_1_output = fixture_1
assert False
@pytest.parametrize(fixture_2, params, indirect=True)
def test_y(self, fixture_2):
fixture_2_output = fixture_2
assert False
@pytest.parametrize(fixture_3, params, indirect=True)
def test_z(self, fixture_3):
fixture_3_output = fixture_3
assert False
(为了方便,我把参数移到了一个额外的函数中)
或者您必须使用 pytest_generate_tests
:
def pytest_generate_tests(metafunc):
fixtures = [f for f in metafunc.fixturenames if f.startswith("fixture_")]
if len(fixtures) == 1:
metafunc.parametrize(fixtures[0], ['a', 'b', 'c'], indirect=True)
class TestDummy:
def test_x(self, fixture_1):
fixture_1_output = fixture_1
assert False
def test_y(self, fixture_2):
fixture_2_output = fixture_2
assert False
def test_z(self, fixture_3):
fixture_3_output = fixture_3
assert False
def test_something_else(self):
pass
您需要确定要对哪些测试进行参数化 - 在此示例中,所有测试都已参数化,其中只有一个夹具的名称以“fixture_”开头,您可能需要根据需要进行调整。
在此示例中,将对前 3 个测试进行参数化,但不会对最后一个 (test_something_else
) 进行参数化。