diff --git a/changelog/4974.doc.rst b/changelog/4974.doc.rst new file mode 100644 index 000000000..74799c9b3 --- /dev/null +++ b/changelog/4974.doc.rst @@ -0,0 +1 @@ +Update docs for ``pytest_cmdline_parse`` hook to note availability liminations diff --git a/src/_pytest/hookspec.py b/src/_pytest/hookspec.py index 65a7f43ed..5a3eb282d 100644 --- a/src/_pytest/hookspec.py +++ b/src/_pytest/hookspec.py @@ -99,7 +99,8 @@ def pytest_cmdline_parse(pluginmanager, args): Stops at first non-None result, see :ref:`firstresult` .. note:: - This hook will not be called for ``conftest.py`` files, only for setuptools plugins. + This hook will only be called for plugin classes passed to the ``plugins`` arg when using `pytest.main`_ to + perform an in-process test run. :param _pytest.config.PytestPluginManager pluginmanager: pytest plugin manager :param list[str] args: list of arguments passed on the command line diff --git a/src/_pytest/pytester.py b/src/_pytest/pytester.py index f8a79ebc9..7fc5eaf64 100644 --- a/src/_pytest/pytester.py +++ b/src/_pytest/pytester.py @@ -335,6 +335,15 @@ def testdir(request, tmpdir_factory): return Testdir(request, tmpdir_factory) +@pytest.fixture +def _config_for_test(): + from _pytest.config import get_config + + config = get_config() + yield config + config._ensure_unconfigure() # cleanup, e.g. capman closing tmpfiles. + + rex_outcome = re.compile(r"(\d+) ([\w-]+)") diff --git a/testing/test_config.py b/testing/test_config.py index 07654e5ad..7e7d7afa0 100644 --- a/testing/test_config.py +++ b/testing/test_config.py @@ -768,10 +768,8 @@ def test_notify_exception(testdir, capfd): assert not err -def test_load_initial_conftest_last_ordering(testdir): - from _pytest.config import get_config - - pm = get_config().pluginmanager +def test_load_initial_conftest_last_ordering(testdir, _config_for_test): + pm = _config_for_test.pluginmanager class My(object): def pytest_load_initial_conftests(self): @@ -1043,21 +1041,17 @@ class TestOverrideIniArgs(object): assert rootdir == tmpdir assert inifile is None - def test_addopts_before_initini(self, monkeypatch): + def test_addopts_before_initini(self, monkeypatch, _config_for_test): cache_dir = ".custom_cache" monkeypatch.setenv("PYTEST_ADDOPTS", "-o cache_dir=%s" % cache_dir) - from _pytest.config import get_config - - config = get_config() + config = _config_for_test config._preparse([], addopts=True) assert config._override_ini == ["cache_dir=%s" % cache_dir] - def test_addopts_from_env_not_concatenated(self, monkeypatch): + def test_addopts_from_env_not_concatenated(self, monkeypatch, _config_for_test): """PYTEST_ADDOPTS should not take values from normal args (#4265).""" - from _pytest.config import get_config - monkeypatch.setenv("PYTEST_ADDOPTS", "-o") - config = get_config() + config = _config_for_test with pytest.raises(UsageError) as excinfo: config._preparse(["cache_dir=ignored"], addopts=True) assert ( @@ -1082,11 +1076,9 @@ class TestOverrideIniArgs(object): ) assert result.ret == _pytest.main.EXIT_USAGEERROR - def test_override_ini_does_not_contain_paths(self): + def test_override_ini_does_not_contain_paths(self, _config_for_test): """Check that -o no longer swallows all options after it (#3103)""" - from _pytest.config import get_config - - config = get_config() + config = _config_for_test config._preparse(["-o", "cache_dir=/cache", "/some/test/path"]) assert config._override_ini == ["cache_dir=/cache"] diff --git a/testing/test_pluginmanager.py b/testing/test_pluginmanager.py index 10b54c112..614572ae4 100644 --- a/testing/test_pluginmanager.py +++ b/testing/test_pluginmanager.py @@ -8,7 +8,6 @@ import sys import types import pytest -from _pytest.config import get_config from _pytest.config import PytestPluginManager from _pytest.main import EXIT_NOTESTSCOLLECTED from _pytest.main import Session @@ -20,7 +19,7 @@ def pytestpm(): class TestPytestPluginInteractions(object): - def test_addhooks_conftestplugin(self, testdir): + def test_addhooks_conftestplugin(self, testdir, _config_for_test): testdir.makepyfile( newhooks=""" def pytest_myhook(xyz): @@ -36,7 +35,7 @@ class TestPytestPluginInteractions(object): return xyz + 1 """ ) - config = get_config() + config = _config_for_test pm = config.pluginmanager pm.hook.pytest_addhooks.call_historic( kwargs=dict(pluginmanager=config.pluginmanager) @@ -91,8 +90,8 @@ class TestPytestPluginInteractions(object): config.pluginmanager.register(A()) assert len(values) == 2 - def test_hook_tracing(self): - pytestpm = get_config().pluginmanager # fully initialized with plugins + def test_hook_tracing(self, _config_for_test): + pytestpm = _config_for_test.pluginmanager # fully initialized with plugins saveindent = [] class api1(object): @@ -201,8 +200,8 @@ class TestPytestPluginManager(object): assert pytestpm.get_plugin("pytest_p1").__name__ == "pytest_p1" assert pytestpm.get_plugin("pytest_p2").__name__ == "pytest_p2" - def test_consider_module_import_module(self, testdir): - pytestpm = get_config().pluginmanager + def test_consider_module_import_module(self, testdir, _config_for_test): + pytestpm = _config_for_test.pluginmanager mod = types.ModuleType("x") mod.pytest_plugins = "pytest_a" aplugin = testdir.makepyfile(pytest_a="#")