0

我想实现这样的目标:

我的 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

任何建议将不胜感激。

4

1 回答 1

0

您不能以这种方式直接对灯具名称进行参数化。您可以单独为每个测试使用参数化:

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)。

于 2022-02-19T19:38:57.433 回答