问题
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