扩展py.test fixture参数

时间:2017-08-24 14:15:18

标签: python pytest fixtures

是否可以扩展py.test fixture中使用的参数?

例如,我会使用此代码生成一个简单的fixture来返回字母abc

@pytest.fixture(params=['a', 'b', 'c'])
    def first_three_letters(self, request):
        return request.param

但是,如果我想扩展另外三个字母 - 即def - 我正在创建一个全新的灯具

@pytest.fixture(params=['a', 'b', 'c', 'd', 'e', 'f'])
    def first_six_letters(self, request):
        return request.param

这感觉它不符合DRY原则。有没有办法以可扩展的方式使用py.test灯具?

我可以直接在测试中使用参数,但是对于两个灯具都有很多测试,所以会有很多重复的行包含@pytest.mark.parametrize,因此感觉更少DRY。

1 个答案:

答案 0 :(得分:0)

简短回答

还没有。

答案很长

如果参数列表总是静态的,它们可以组成常量并作为参数传递:

LETTERS = ['a', 'b', 'c', 'd', 'e', 'f']

@pytest.fixture(params=LETTERS[:3])
def first_three_letters(self, request):
    return request.param

@pytest.fixture(params=LETTERS)
def first_six_letters(self, request):
    return request.param

但是,如果在调用pytest.fixture()之前不知道参数,则没有简单的解决方案。但是,there is a proposal允许夹具从其他夹具“屈服”。以下是它的外观:

@pytest.fixture(params=['a', 'b', 'c'])
def first_three_letters(request):
    return request.param


@pytest.fixture(params=['d', 'e', 'f'])
def second_three_letters(request):
    return request.param


@pytest.fixture(params=[
    pytest.fixture_request('first_three_letters'),
    pytest.fixture_request('second_three_letters'),
])
def first_six_letters(request):
    return request.param