Is it possible to parametrize a test with fixtures?

房东的猫 提交于 2019-12-20 03:25:28

问题


I would like to pass @pytest.mark.parametrize not particular values but fixtures. Like so.

Given a conftest with:

@pytest.fixture
def name1():
    return 'foo'

@pytest.fixture
def name2():
    return 'bar'

within my test.py this works of course:

@pytest.mark.parametrize('name', ['foo', 'bar', 'baz'])
def test_name(name):
    print(name)

This does not:

 @pytest.mark.parametrize('name', [name1, name2])
 def test_name(name):
     print(name)

I am aware that in this trivial case I could just create one name fixture and parametrize the fixture instead, but there are cases were this is not deireable.

One way around this that I found is with pytest_factoryboy's LazyFixture. However, I often fail to access the lazyfixtures attributes within my test.


回答1:


I would insist in parametrizing the fixture

In your example this would amount to:

@pytest.fixture(params=['foo', 'bar'])
def name(request):
    return request.param

def test_name(name):
    print(name)

Another alternative:

@pytest.fixture(params=[1,2])
def name(name1, name2, request):
    if request.param == 1:
        return name1()
    elif request.param == 2:
        return name2()

def test_name(name):
    print(name)

Which approach works best for you will depend on the specifics of your tests and perhaps on what pre-existing fixtures you might be trying to leverage.



来源:https://stackoverflow.com/questions/33611321/is-it-possible-to-parametrize-a-test-with-fixtures

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!