Move code about 'pytest_plugins' error to a more appropriate place
It is no longer deprecated, but part of the normal code for 'config'
This commit is contained in:
parent
683b2632b4
commit
647d89c444
|
@ -204,6 +204,19 @@ def _prepareconfig(args=None, plugins=None):
|
||||||
raise
|
raise
|
||||||
|
|
||||||
|
|
||||||
|
def _fail_on_non_top_pytest_plugins(conftestpath, confcutdir):
|
||||||
|
msg = (
|
||||||
|
"Defining 'pytest_plugins' in a non-top-level conftest is no longer supported:\n"
|
||||||
|
"It affects the entire test suite instead of just below the conftest as expected.\n"
|
||||||
|
" {}\n"
|
||||||
|
"Please move it to a top level conftest file at the rootdir:\n"
|
||||||
|
" {}\n"
|
||||||
|
"For more information, visit:\n"
|
||||||
|
" https://docs.pytest.org/en/latest/deprecations.html#pytest-plugins-in-non-top-level-conftest-files"
|
||||||
|
)
|
||||||
|
fail(msg.format(conftestpath, confcutdir), pytrace=False)
|
||||||
|
|
||||||
|
|
||||||
class PytestPluginManager(PluginManager):
|
class PytestPluginManager(PluginManager):
|
||||||
"""
|
"""
|
||||||
Overwrites :py:class:`pluggy.PluginManager <pluggy.PluginManager>` to add pytest-specific
|
Overwrites :py:class:`pluggy.PluginManager <pluggy.PluginManager>` to add pytest-specific
|
||||||
|
@ -424,16 +437,7 @@ class PytestPluginManager(PluginManager):
|
||||||
and self._configured
|
and self._configured
|
||||||
and not self._using_pyargs
|
and not self._using_pyargs
|
||||||
):
|
):
|
||||||
from _pytest.deprecated import (
|
_fail_on_non_top_pytest_plugins(conftestpath, self._confcutdir)
|
||||||
PYTEST_PLUGINS_FROM_NON_TOP_LEVEL_CONFTEST,
|
|
||||||
)
|
|
||||||
|
|
||||||
fail(
|
|
||||||
PYTEST_PLUGINS_FROM_NON_TOP_LEVEL_CONFTEST.format(
|
|
||||||
conftestpath, self._confcutdir
|
|
||||||
),
|
|
||||||
pytrace=False,
|
|
||||||
)
|
|
||||||
except Exception:
|
except Exception:
|
||||||
raise ConftestImportFailure(conftestpath, sys.exc_info())
|
raise ConftestImportFailure(conftestpath, sys.exc_info())
|
||||||
|
|
||||||
|
|
|
@ -48,16 +48,6 @@ RESULT_LOG = PytestDeprecationWarning(
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
PYTEST_PLUGINS_FROM_NON_TOP_LEVEL_CONFTEST = (
|
|
||||||
"Defining 'pytest_plugins' in a non-top-level conftest is no longer supported "
|
|
||||||
"because it affects the entire directory tree in a non-explicit way.\n"
|
|
||||||
" {}\n"
|
|
||||||
"Please move it to a top level conftest file at the rootdir:\n"
|
|
||||||
" {}\n"
|
|
||||||
"For more information, visit:\n"
|
|
||||||
" https://docs.pytest.org/en/latest/deprecations.html#pytest-plugins-in-non-top-level-conftest-files"
|
|
||||||
)
|
|
||||||
|
|
||||||
PYTEST_CONFIG_GLOBAL = PytestDeprecationWarning(
|
PYTEST_CONFIG_GLOBAL = PytestDeprecationWarning(
|
||||||
"the `pytest.config` global is deprecated. Please use `request.config` "
|
"the `pytest.config` global is deprecated. Please use `request.config` "
|
||||||
"or `pytest_configure` (if you're a pytest plugin) instead."
|
"or `pytest_configure` (if you're a pytest plugin) instead."
|
||||||
|
|
|
@ -1,8 +1,5 @@
|
||||||
import os
|
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
from _pytest import deprecated
|
from _pytest import deprecated
|
||||||
from _pytest.warnings import SHOW_PYTEST_WARNINGS_ARG
|
|
||||||
|
|
||||||
pytestmark = pytest.mark.pytester_example_path("deprecated")
|
pytestmark = pytest.mark.pytester_example_path("deprecated")
|
||||||
|
|
||||||
|
@ -75,121 +72,6 @@ def test_external_plugins_integrated(testdir, plugin):
|
||||||
testdir.parseconfig("-p", plugin)
|
testdir.parseconfig("-p", plugin)
|
||||||
|
|
||||||
|
|
||||||
def test_pytest_plugins_in_non_top_level_conftest_deprecated(testdir):
|
|
||||||
from _pytest.deprecated import PYTEST_PLUGINS_FROM_NON_TOP_LEVEL_CONFTEST
|
|
||||||
|
|
||||||
testdir.makepyfile(
|
|
||||||
**{
|
|
||||||
"subdirectory/conftest.py": """
|
|
||||||
pytest_plugins=['capture']
|
|
||||||
"""
|
|
||||||
}
|
|
||||||
)
|
|
||||||
testdir.makepyfile(
|
|
||||||
"""
|
|
||||||
def test_func():
|
|
||||||
pass
|
|
||||||
"""
|
|
||||||
)
|
|
||||||
res = testdir.runpytest(SHOW_PYTEST_WARNINGS_ARG)
|
|
||||||
assert res.ret == 2
|
|
||||||
msg = str(PYTEST_PLUGINS_FROM_NON_TOP_LEVEL_CONFTEST).splitlines()[0]
|
|
||||||
res.stdout.fnmatch_lines(
|
|
||||||
["*{msg}*".format(msg=msg), "*subdirectory{sep}conftest.py*".format(sep=os.sep)]
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize("use_pyargs", [True, False])
|
|
||||||
def test_pytest_plugins_in_non_top_level_conftest_unsupported_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 ()
|
|
||||||
args += (SHOW_PYTEST_WARNINGS_ARG,)
|
|
||||||
res = testdir.runpytest(*args)
|
|
||||||
assert res.ret == (0 if use_pyargs else 2)
|
|
||||||
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_unsupported_no_top_level_conftest(
|
|
||||||
testdir
|
|
||||||
):
|
|
||||||
from _pytest.deprecated import PYTEST_PLUGINS_FROM_NON_TOP_LEVEL_CONFTEST
|
|
||||||
|
|
||||||
subdirectory = testdir.tmpdir.join("subdirectory")
|
|
||||||
subdirectory.mkdir()
|
|
||||||
testdir.makeconftest(
|
|
||||||
"""
|
|
||||||
pytest_plugins=['capture']
|
|
||||||
"""
|
|
||||||
)
|
|
||||||
testdir.tmpdir.join("conftest.py").move(subdirectory.join("conftest.py"))
|
|
||||||
|
|
||||||
testdir.makepyfile(
|
|
||||||
"""
|
|
||||||
def test_func():
|
|
||||||
pass
|
|
||||||
"""
|
|
||||||
)
|
|
||||||
|
|
||||||
res = testdir.runpytest_subprocess()
|
|
||||||
assert res.ret == 2
|
|
||||||
msg = str(PYTEST_PLUGINS_FROM_NON_TOP_LEVEL_CONFTEST).splitlines()[0]
|
|
||||||
res.stdout.fnmatch_lines(
|
|
||||||
["*{msg}*".format(msg=msg), "*subdirectory{sep}conftest.py*".format(sep=os.sep)]
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def test_pytest_plugins_in_non_top_level_conftest_unsupported_no_false_positives(
|
|
||||||
testdir
|
|
||||||
):
|
|
||||||
from _pytest.deprecated import PYTEST_PLUGINS_FROM_NON_TOP_LEVEL_CONFTEST
|
|
||||||
|
|
||||||
subdirectory = testdir.tmpdir.join("subdirectory")
|
|
||||||
subdirectory.mkdir()
|
|
||||||
testdir.makeconftest(
|
|
||||||
"""
|
|
||||||
pass
|
|
||||||
"""
|
|
||||||
)
|
|
||||||
testdir.tmpdir.join("conftest.py").move(subdirectory.join("conftest.py"))
|
|
||||||
|
|
||||||
testdir.makeconftest(
|
|
||||||
"""
|
|
||||||
import warnings
|
|
||||||
warnings.filterwarnings('always', category=DeprecationWarning)
|
|
||||||
pytest_plugins=['capture']
|
|
||||||
"""
|
|
||||||
)
|
|
||||||
testdir.makepyfile(
|
|
||||||
"""
|
|
||||||
def test_func():
|
|
||||||
pass
|
|
||||||
"""
|
|
||||||
)
|
|
||||||
res = testdir.runpytest_subprocess()
|
|
||||||
assert res.ret == 0
|
|
||||||
msg = str(PYTEST_PLUGINS_FROM_NON_TOP_LEVEL_CONFTEST).splitlines()[0]
|
|
||||||
assert msg not in res.stdout.str()
|
|
||||||
|
|
||||||
|
|
||||||
def test_fixture_named_request(testdir):
|
def test_fixture_named_request(testdir):
|
||||||
testdir.copy_example()
|
testdir.copy_example()
|
||||||
result = testdir.runpytest()
|
result = testdir.runpytest()
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
import os
|
||||||
import sys
|
import sys
|
||||||
import textwrap
|
import textwrap
|
||||||
|
|
||||||
|
@ -1242,3 +1243,116 @@ def test_config_blocked_default_plugins(testdir, plugin):
|
||||||
result.stdout.fnmatch_lines(["* 1 failed in *"])
|
result.stdout.fnmatch_lines(["* 1 failed in *"])
|
||||||
else:
|
else:
|
||||||
assert result.stdout.lines == [""]
|
assert result.stdout.lines == [""]
|
||||||
|
|
||||||
|
|
||||||
|
class TestPytestPluginsVariable:
|
||||||
|
def test_pytest_plugins_in_non_top_level_conftest_unsupported(self, testdir):
|
||||||
|
testdir.makepyfile(
|
||||||
|
**{
|
||||||
|
"subdirectory/conftest.py": """
|
||||||
|
pytest_plugins=['capture']
|
||||||
|
"""
|
||||||
|
}
|
||||||
|
)
|
||||||
|
testdir.makepyfile(
|
||||||
|
"""
|
||||||
|
def test_func():
|
||||||
|
pass
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
res = testdir.runpytest()
|
||||||
|
assert res.ret == 2
|
||||||
|
msg = "Defining 'pytest_plugins' in a non-top-level conftest is no longer supported"
|
||||||
|
res.stdout.fnmatch_lines(
|
||||||
|
[
|
||||||
|
"*{msg}*".format(msg=msg),
|
||||||
|
"*subdirectory{sep}conftest.py*".format(sep=os.sep),
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
|
@pytest.mark.parametrize("use_pyargs", [True, False])
|
||||||
|
def test_pytest_plugins_in_non_top_level_conftest_unsupported_pyargs(
|
||||||
|
self, testdir, use_pyargs
|
||||||
|
):
|
||||||
|
"""When using --pyargs, do not emit the warning about non-top-level conftest warnings (#4039, #4044)"""
|
||||||
|
|
||||||
|
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 if use_pyargs else 2)
|
||||||
|
msg = (
|
||||||
|
msg
|
||||||
|
) = "Defining 'pytest_plugins' in a non-top-level conftest is no longer supported"
|
||||||
|
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_unsupported_no_top_level_conftest(
|
||||||
|
self, testdir
|
||||||
|
):
|
||||||
|
subdirectory = testdir.tmpdir.join("subdirectory")
|
||||||
|
subdirectory.mkdir()
|
||||||
|
testdir.makeconftest(
|
||||||
|
"""
|
||||||
|
pytest_plugins=['capture']
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
testdir.tmpdir.join("conftest.py").move(subdirectory.join("conftest.py"))
|
||||||
|
|
||||||
|
testdir.makepyfile(
|
||||||
|
"""
|
||||||
|
def test_func():
|
||||||
|
pass
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
|
||||||
|
res = testdir.runpytest_subprocess()
|
||||||
|
assert res.ret == 2
|
||||||
|
msg = "Defining 'pytest_plugins' in a non-top-level conftest is no longer supported"
|
||||||
|
res.stdout.fnmatch_lines(
|
||||||
|
[
|
||||||
|
"*{msg}*".format(msg=msg),
|
||||||
|
"*subdirectory{sep}conftest.py*".format(sep=os.sep),
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_pytest_plugins_in_non_top_level_conftest_unsupported_no_false_positives(
|
||||||
|
self, testdir
|
||||||
|
):
|
||||||
|
subdirectory = testdir.tmpdir.join("subdirectory")
|
||||||
|
subdirectory.mkdir()
|
||||||
|
testdir.makeconftest(
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
testdir.tmpdir.join("conftest.py").move(subdirectory.join("conftest.py"))
|
||||||
|
|
||||||
|
testdir.makeconftest(
|
||||||
|
"""
|
||||||
|
import warnings
|
||||||
|
warnings.filterwarnings('always', category=DeprecationWarning)
|
||||||
|
pytest_plugins=['capture']
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
testdir.makepyfile(
|
||||||
|
"""
|
||||||
|
def test_func():
|
||||||
|
pass
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
res = testdir.runpytest_subprocess()
|
||||||
|
assert res.ret == 0
|
||||||
|
msg = "Defining 'pytest_plugins' in a non-top-level conftest is no longer supported"
|
||||||
|
assert msg not in res.stdout.str()
|
||||||
|
|
Loading…
Reference in New Issue