From ba5630e0f8fd35a3a8e98b5dee9572832198bc82 Mon Sep 17 00:00:00 2001 From: Bruno Oliveira Date: Wed, 26 Sep 2018 10:49:14 -0300 Subject: [PATCH 1/2] Simplify test_pytest_plugins_in_non_top_level_conftest_deprecated --- testing/deprecated_test.py | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/testing/deprecated_test.py b/testing/deprecated_test.py index fbaca4e30..974450044 100644 --- a/testing/deprecated_test.py +++ b/testing/deprecated_test.py @@ -178,21 +178,12 @@ def test_pytest_catchlog_deprecated(testdir, plugin): def test_pytest_plugins_in_non_top_level_conftest_deprecated(testdir): from _pytest.deprecated import PYTEST_PLUGINS_FROM_NON_TOP_LEVEL_CONFTEST - subdirectory = testdir.tmpdir.join("subdirectory") - subdirectory.mkdir() - # create the inner conftest with makeconftest and then move it to the subdirectory - testdir.makeconftest( - """ + testdir.makepyfile( + **{ + "subdirectory/conftest.py": """ pytest_plugins=['capture'] """ - ) - testdir.tmpdir.join("conftest.py").move(subdirectory.join("conftest.py")) - # make the top level conftest - testdir.makeconftest( - """ - import warnings - warnings.filterwarnings('always', category=DeprecationWarning) - """ + } ) testdir.makepyfile( """ From 32c5a113e23e31f06b32dbed9ad1a71e7d5d870c Mon Sep 17 00:00:00 2001 From: Bruno Oliveira Date: Wed, 26 Sep 2018 12:00:49 -0300 Subject: [PATCH 2/2] Do not issue non-top-level conftest warning when --pyargs is used Fix #4039 --- changelog/4039.bugfix.rst | 2 ++ src/_pytest/config/__init__.py | 7 ++++++- testing/deprecated_test.py | 30 +++++++++++++++++++++++++++++- testing/test_conftest.py | 1 + 4 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 changelog/4039.bugfix.rst diff --git a/changelog/4039.bugfix.rst b/changelog/4039.bugfix.rst new file mode 100644 index 000000000..867b29498 --- /dev/null +++ b/changelog/4039.bugfix.rst @@ -0,0 +1,2 @@ +No longer issue warnings about using ``pytest_plugins`` in non-top-level directories when using ``--pyargs``: the +current ``--pyargs`` mechanism is not reliable and might give false negatives. diff --git a/src/_pytest/config/__init__.py b/src/_pytest/config/__init__.py index bc45d65a9..0f8d2d5f3 100644 --- a/src/_pytest/config/__init__.py +++ b/src/_pytest/config/__init__.py @@ -351,6 +351,7 @@ class PytestPluginManager(PluginManager): else None ) self._noconftest = namespace.noconftest + self._using_pyargs = namespace.pyargs testpaths = namespace.file_or_dir foundanchor = False for path in testpaths: @@ -416,7 +417,11 @@ class PytestPluginManager(PluginManager): _ensure_removed_sysmodule(conftestpath.purebasename) try: mod = conftestpath.pyimport() - if hasattr(mod, "pytest_plugins") and self._configured: + if ( + hasattr(mod, "pytest_plugins") + and self._configured + and not self._using_pyargs + ): from _pytest.deprecated import ( PYTEST_PLUGINS_FROM_NON_TOP_LEVEL_CONFTEST ) diff --git a/testing/deprecated_test.py b/testing/deprecated_test.py index 974450044..64b4a0124 100644 --- a/testing/deprecated_test.py +++ b/testing/deprecated_test.py @@ -191,7 +191,7 @@ def test_pytest_plugins_in_non_top_level_conftest_deprecated(testdir): pass """ ) - res = testdir.runpytest_subprocess() + res = testdir.runpytest() assert res.ret == 0 msg = str(PYTEST_PLUGINS_FROM_NON_TOP_LEVEL_CONFTEST).splitlines()[0] res.stdout.fnmatch_lines( @@ -201,6 +201,34 @@ def test_pytest_plugins_in_non_top_level_conftest_deprecated(testdir): ) +@pytest.mark.parametrize("use_pyargs", [True, False]) +def test_pytest_plugins_in_non_top_level_conftest_deprecated_pyargs( + testdir, use_pyargs +): + """When using --pyargs, do not emit the warning about non-top-level conftest warnings (#4039, #4044)""" + from _pytest.deprecated import PYTEST_PLUGINS_FROM_NON_TOP_LEVEL_CONFTEST + + files = { + "src/pkg/__init__.py": "", + "src/pkg/conftest.py": "", + "src/pkg/test_root.py": "def test(): pass", + "src/pkg/sub/__init__.py": "", + "src/pkg/sub/conftest.py": "pytest_plugins=['capture']", + "src/pkg/sub/test_bar.py": "def test(): pass", + } + testdir.makepyfile(**files) + testdir.syspathinsert(testdir.tmpdir.join("src")) + + args = ("--pyargs", "pkg") if use_pyargs else () + res = testdir.runpytest(*args) + assert res.ret == 0 + msg = str(PYTEST_PLUGINS_FROM_NON_TOP_LEVEL_CONFTEST).splitlines()[0] + if use_pyargs: + assert msg not in res.stdout.str() + else: + res.stdout.fnmatch_lines("*{msg}*".format(msg=msg)) + + def test_pytest_plugins_in_non_top_level_conftest_deprecated_no_top_level_conftest( testdir ): diff --git a/testing/test_conftest.py b/testing/test_conftest.py index f3b5bac38..07da5d5ee 100644 --- a/testing/test_conftest.py +++ b/testing/test_conftest.py @@ -30,6 +30,7 @@ def conftest_setinitial(conftest, args, confcutdir=None): self.file_or_dir = args self.confcutdir = str(confcutdir) self.noconftest = False + self.pyargs = False conftest._set_initial_conftests(Namespace())