When overriding a fixture, pytest allows use of the "super" fixture (http://docs.pytest.org/en/latest/fixture.html#override-a-fixture-on-a-folder-conftest-level). However, using such a fixture seems to not work the same as using other fixtures.
If I have a parametrized fixture foo, and another fixture bar that depends on foo, then bar will be parametrized on foo. And if there is a test_bar that uses bar, then test_bar will be run once for each of the params of foo.
Suppose there are two bar fixtures, and one extends the other. At test collection time, it seems that test_bar does not know it is supposed to be parametrized off the params of foo. But at test running time, pytest figures out that there is supposed to be parameterization, and fails itself.
I'm not sure if this is a missing feature, or a bug.
If this is intentional, is there any way to have the bar override automatically bring in the dependencies of the super fixture? Right now, the only workaround I can figure out is to do:
@pytest.fixture
def bar(bar, foo):
...
even if the new bar doesn't directly use foo.
Also, I don't know of any workaround if you extend a fixture that has params, e.g. if you want to extend foo based off the super fixture.
$ .tox/py35/bin/pip list
hypothesis (3.4.2)
mock (2.0.0)
nose (1.3.7)
pbr (1.10.0)
pip (8.1.2)
py (1.4.31)
pytest (3.0.3.dev0, /Users/jmoldow/repos/pytest)
requests (2.11.1)
setuptools (27.2.0)
six (1.10.0)
wheel (0.30.0a0)
pytest 3.0.2 and pytest 3.0.3.dev0 (7660a19).
OS X Yosemite Version 10.10.5
In testing/python/fixture.py, add the tests
def test_extend_parametrized_fixture(self, testdir):
testdir.makeconftest("""
import pytest
@pytest.fixture(params=[1])
def foo(request):
return request.param
""")
testfile = testdir.makepyfile("""
import pytest
@pytest.fixture
def foo(foo):
return foo * 2
def test_spam(foo):
assert foo == 2
""")
result = testdir.runpytest(testfile)
result.stdout.fnmatch_lines(["*1 passed*"])
def test_extend_fixture_with_parametrized_dependency(self, testdir):
testdir.makeconftest("""
import pytest
@pytest.fixture(params=[1])
def foo(request):
return request.param
@pytest.fixture
def bar(foo):
return foo
""")
testfile = testdir.makepyfile("""
import pytest
@pytest.fixture
def bar(bar):
return bar * 2
def test_spam(bar):
assert bar == 2
""")
result = testdir.runpytest(testfile)
result.stdout.fnmatch_lines(["*1 passed*"])
The output from those tests is attached.
captured_output.txt
If you manually re-specify the foo dependency, then this test passes:
def test_extend_fixture_with_parametrized_dependency(self, testdir):
testdir.makeconftest("""
import pytest
@pytest.fixture(params=[1])
def foo(request):
return request.param
@pytest.fixture
def bar(foo):
return foo
""")
testfile = testdir.makepyfile("""
import pytest
@pytest.fixture
def bar(bar, foo):
return bar * 2
def test_spam(bar):
assert bar == 2
""")
result = testdir.runpytest(testfile)
result.stdout.fnmatch_lines(["*1 passed*"])
But I don't know of any way to fix the test_extend_parametrized_fixture test.
When overriding a fixture, pytest allows use of the "super" fixture (http://docs.pytest.org/en/latest/fixture.html#override-a-fixture-on-a-folder-conftest-level). However, using such a fixture seems to not work the same as using other fixtures.
If I have a parametrized fixture
foo, and another fixturebarthat depends onfoo, thenbarwill be parametrized onfoo. And if there is atest_barthat usesbar, thentest_barwill be run once for each of the params offoo.Suppose there are two
barfixtures, and one extends the other. At test collection time, it seems thattest_bardoes not know it is supposed to be parametrized off the params offoo. But at test running time, pytest figures out that there is supposed to be parameterization, and fails itself.I'm not sure if this is a missing feature, or a bug.
If this is intentional, is there any way to have the
baroverride automatically bring in the dependencies of the super fixture? Right now, the only workaround I can figure out is to do:even if the new
bardoesn't directly usefoo.Also, I don't know of any workaround if you extend a fixture that has params, e.g. if you want to extend
foobased off the super fixture.pip listof the virtual environment you are usingpytest 3.0.2 and pytest 3.0.3.dev0 (7660a19).
OS X Yosemite Version 10.10.5
In
testing/python/fixture.py, add the testsThe output from those tests is attached.
captured_output.txt
If you manually re-specify the
foodependency, then this test passes:But I don't know of any way to fix the
test_extend_parametrized_fixturetest.