是否可以扩展py.test fixture中使用的参数?
例如,我会使用此代码生成一个简单的fixture来返回字母a
,b
和c
。
@pytest.fixture(params=['a', 'b', 'c'])
def first_three_letters(self, request):
return request.param
但是,如果我想扩展另外三个字母 - 即d
,e
和f
- 我正在创建一个全新的灯具
@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。
答案 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