如何使用具有相同参数化输入的多个 pytest fixture 来测试 class 中的方法

How to use multiple pytest fixtures with same parameterized input to test methods in a class

我想实现这样的目标:

我的 conftest.py 将包含:

@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) 进行参数化。