diff --git a/_pytest/python.py b/_pytest/python.py index 8ce12efb3..5b4f0b62c 100644 --- a/_pytest/python.py +++ b/_pytest/python.py @@ -1626,18 +1626,18 @@ class FixtureManager: unittest=unittest) faclist = self._arg2fixturedefs.setdefault(name, []) if not fixturedef.has_location: - # All Nones are at the front so this inserts the - # current fixturedef after the existing fixturedefs - # from external plugins but before the fixturedefs - # provided in conftests. - i = faclist.count(None) + # All fixturedefs with no location are at the front + # so this inserts the current fixturedef after the + # existing fixturedefs from external plugins but + # before the fixturedefs provided in conftests. + i = len([f for f in faclist if not f.has_location]) else: i = len(faclist) # append faclist.insert(i, fixturedef) if marker.autouse: autousenames.append(name) if autousenames: - self._nodeid_and_autousenames.append((nodeid, autousenames)) + self._nodeid_and_autousenames.append((nodeid or '', autousenames)) def getfixturedefs(self, argname, nodeid): try: diff --git a/testing/python/fixture.py b/testing/python/fixture.py index 6798da0a9..803e7ac45 100644 --- a/testing/python/fixture.py +++ b/testing/python/fixture.py @@ -173,7 +173,7 @@ class TestFillFixtures: result = testdir.runpytest(testfile) result.stdout.fnmatch_lines(["*1 passed*"]) - def test_extend_fixture_conftest_plugin(request, testdir): + def test_extend_fixture_conftest_plugin(self, testdir): testdir.makepyfile(testplugin=""" import pytest @@ -198,6 +198,52 @@ class TestFillFixtures: result = testdir.runpytest('-s') assert result.ret == 0 + def test_extend_fixture_plugin_plugin(self, testdir): + # Two plugins should extend each order in loading order + testdir.makepyfile(testplugin0=""" + import pytest + + @pytest.fixture + def foo(): + return 7 + """) + testdir.makepyfile(testplugin1=""" + import pytest + + @pytest.fixture + def foo(foo): + return foo + 7 + """) + testdir.syspathinsert() + testdir.makepyfile(""" + pytest_plugins = ['testplugin0', 'testplugin1'] + + def test_foo(foo): + assert foo == 14 + """) + result = testdir.runpytest() + assert result.ret == 0 + + def test_autouse_fixture_plugin(self, testdir): + # A fixture from a plugin has no baseid set, which screwed up + # the autouse fixture handling. + testdir.makepyfile(testplugin=""" + import pytest + + @pytest.fixture(autouse=True) + def foo(request): + request.function.foo = 7 + """) + testdir.syspathinsert() + testdir.makepyfile(""" + pytest_plugins = 'testplugin' + + def test_foo(request): + assert request.function.foo == 7 + """) + result = testdir.runpytest() + assert result.ret == 0 + def test_funcarg_lookup_error(self, testdir): p = testdir.makepyfile(""" def test_lookup_error(unknown):