如果它们是列表,则使用夹具结果参数化测试功能

时间:2017-08-28 18:28:02

标签: python dynamic pytest fixtures

我希望我的灯具可以参数化任何上下文,如果它是一个列表,则使用该灯具的结果调用它们。理想情况下,我不必使用pytest_generate_tests方法来对这些函数进行程序化参数化。

例如,给定此对象:

class MyObject(object):
    def __init__(self, name):
        self.name = name

    def get_1(self):
        return '{0}-1'.format(self.name)

    def get_a(self):
        return '{0}-a'.format(self.name)

    def get_each(self):
        return [x*3 for x in self.name]

这个conftest.py文件:

@pytest.fixture(params=['bob', 'joe', 'fred'])
def main_fixture(request):
    test_obj = MyObject(request.param)
    return test_obj


@pytest.fixture
def use_1(main_fixture):
    uses_1 = main_fixture.get_1()
    return uses_1


@pytest.fixture
def use_a(main_fixture):
    uses_a = main_fixture.get_a()
    return uses_a


@pytest.fixture
def use_get_each(main_fixture):
    uses_get_each = main_fixture.get_each()
    return uses_get_each

这些测试功能:

class TestMyObject(object):

    def test_myobject_use_1(self, use_1):
        assert use_1[-1] == '1'

    def test_myobject_use_a(self, use_a):
        assert use_a[-1] == 'a'

    def test_myobject_use_get_each(self, use_get_each):
        assert type(use_get_each) is not list

前两个测试通过(use_1和use_a),但最终测试没有,因为fixture use_get_each返回这些值的列表。我希望将失败的测试函数与该列表中的每个结果进行参数化。

像这样的东西(不是有效的pytest代码,但是演示了我想要完成的事情):

@pytest.fixture(params=['bob', 'joe', 'fred'])
def main_fixture(request):
    test_obj = MyObject(request.param)
    return test_obj


@pytest.fixture
def use_get_each(request, main_fixture):
    uses_get_each = main_fixture.get_each()
    return uses_get_each

# this fixture is parametrized with the output of the use_get_each fixture
# so that its params look like the following after the fixture is evaluated:
# params=['bbb', 'ooo', 'bbb', 'jjj', 'ooo', ...] instead of
# params=[['bbb', 'ooo', 'bbb'], ['jjj', 'ooo', 'eee'], ...]
@pytest.fixture(params=use_get_each)
def uses_use_get_each(request):
    return request.param

我知道有一个提案可以找到here这样的功能。所以我想我正在寻找的是我尚未探索的潜在解决方案,其中仅包括pytest_generate_tests

0 个答案:

没有答案