diff --git a/src/_pytest/main.py b/src/_pytest/main.py index 9599fa161..105891e46 100644 --- a/src/_pytest/main.py +++ b/src/_pytest/main.py @@ -482,6 +482,8 @@ class Session(nodes.FSCollector): self.trace.root.indent -= 1 def _collect(self, arg): + from _pytest.python import Package + names = self._parsearg(arg) argpath = names.pop(0) paths = [] @@ -503,7 +505,7 @@ class Session(nodes.FSCollector): root = self._node_cache[pkginit] else: col = root._collectfile(pkginit) - if col: + if col and isinstance(col, Package): root = col[0] self._node_cache[root.fspath] = root diff --git a/testing/example_scripts/fixtures/custom_item/conftest.py b/testing/example_scripts/fixtures/custom_item/conftest.py new file mode 100644 index 000000000..25299d726 --- /dev/null +++ b/testing/example_scripts/fixtures/custom_item/conftest.py @@ -0,0 +1,10 @@ +import pytest + + +class CustomItem(pytest.Item, pytest.File): + def runtest(self): + pass + + +def pytest_collect_file(path, parent): + return CustomItem(path, parent) diff --git a/testing/example_scripts/fixtures/custom_item/foo/__init__.py b/testing/example_scripts/fixtures/custom_item/foo/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/testing/example_scripts/fixtures/custom_item/foo/test_foo.py b/testing/example_scripts/fixtures/custom_item/foo/test_foo.py new file mode 100644 index 000000000..f17482385 --- /dev/null +++ b/testing/example_scripts/fixtures/custom_item/foo/test_foo.py @@ -0,0 +1,2 @@ +def test(): + pass diff --git a/testing/python/fixture.py b/testing/python/fixture.py index a3c6b95b0..bbfcf775b 100644 --- a/testing/python/fixture.py +++ b/testing/python/fixture.py @@ -1618,6 +1618,11 @@ class TestFixtureManagerParseFactories(object): reprec = testdir.inline_run() reprec.assertoutcome(passed=2) + def test_collect_custom_items(self, testdir): + testdir.copy_example("fixtures/custom_item") + result = testdir.runpytest("foo") + result.stdout.fnmatch_lines("*passed*") + class TestAutouseDiscovery(object): @pytest.fixture diff --git a/testing/test_collection.py b/testing/test_collection.py index 6480cc85d..23d82cb14 100644 --- a/testing/test_collection.py +++ b/testing/test_collection.py @@ -647,7 +647,7 @@ class Test_getinitialnodes(object): col = testdir.getnode(config, x) assert isinstance(col, pytest.Module) assert col.name == "x.py" - assert col.parent.parent.parent is None + assert col.parent.parent is None for col in col.listchain(): assert col.config is config