首页 文章

扩展py.test fixture参数

提问于
浏览
0

是否可以扩展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

    简答

    还没 .

    答案很长

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

    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允许一个夹具"yield from"其他固定装置 . 这是它的样子:

    @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
    

相关问题