我希望我的灯具可以参数化任何上下文,如果它是一个列表,则使用该灯具的结果调用它们。理想情况下,我不必使用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
。