diff --git a/changelog/4592.bugfix.rst b/changelog/4592.bugfix.rst new file mode 100644 index 000000000..f1eaae7eb --- /dev/null +++ b/changelog/4592.bugfix.rst @@ -0,0 +1 @@ +Fix handling of ``collect_ignore`` via parent ``conftest.py``. diff --git a/pyproject.toml b/pyproject.toml index d17b936c1..2a4cd65c1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,6 +5,7 @@ requires = [ "setuptools-scm", "wheel", ] +build-backend = "setuptools.build_meta" [tool.towncrier] package = "pytest" diff --git a/src/_pytest/main.py b/src/_pytest/main.py index d0d826bb6..68d5bac40 100644 --- a/src/_pytest/main.py +++ b/src/_pytest/main.py @@ -607,6 +607,7 @@ class Session(nodes.FSCollector): yield y def _collectfile(self, path, handle_dupes=True): + assert path.isfile() ihook = self.gethookproxy(path) if not self.isinitpath(path): if ihook.pytest_ignore_collect(path=path, config=self.config): diff --git a/src/_pytest/python.py b/src/_pytest/python.py index aaa49f7dd..48962d137 100644 --- a/src/_pytest/python.py +++ b/src/_pytest/python.py @@ -599,6 +599,7 @@ class Package(Module): return proxy def _collectfile(self, path, handle_dupes=True): + assert path.isfile() ihook = self.gethookproxy(path) if not self.isinitpath(path): if ihook.pytest_ignore_collect(path=path, config=self.config): @@ -642,11 +643,12 @@ class Package(Module): ): continue - if path.isdir() and path.join("__init__.py").check(file=1): - pkg_prefixes.add(path) - - for x in self._collectfile(path): - yield x + if path.isdir(): + if path.join("__init__.py").check(file=1): + pkg_prefixes.add(path) + else: + for x in self._collectfile(path): + yield x def _get_xunit_setup_teardown(holder, attr_name, param_obj=None): diff --git a/testing/test_collection.py b/testing/test_collection.py index 36e8a69ce..329182b0f 100644 --- a/testing/test_collection.py +++ b/testing/test_collection.py @@ -1144,3 +1144,16 @@ def test_collect_symlink_out_of_tree(testdir): ] ) assert result.ret == 0 + + +def test_collectignore_via_conftest(testdir, monkeypatch): + """collect_ignore in parent conftest skips importing child (issue #4592).""" + tests = testdir.mkpydir("tests") + tests.ensure("conftest.py").write("collect_ignore = ['ignore_me']") + + ignore_me = tests.mkdir("ignore_me") + ignore_me.ensure("__init__.py") + ignore_me.ensure("conftest.py").write("assert 0, 'should_not_be_called'") + + result = testdir.runpytest() + assert result.ret == EXIT_NOTESTSCOLLECTED diff --git a/tox.ini b/tox.ini index f67d06f18..6c216fd71 100644 --- a/tox.ini +++ b/tox.ini @@ -1,5 +1,6 @@ [tox] -minversion = 2.0 +isolated_build = True +minversion = 3.3 distshare = {homedir}/.tox/distshare # make sure to update environment list in travis.yml and appveyor.yml envlist = @@ -166,7 +167,9 @@ commands = [testenv:py37-freeze] changedir = testing/freeze +# Disable PEP 517 with pip, which does not work with PyInstaller currently. deps = + --no-use-pep517 pyinstaller commands = {envpython} create_executable.py