Merge master into features

This commit is contained in:
Daniel Hahler 2019-03-29 11:05:46 +01:00
commit 4e931b258d
5 changed files with 26 additions and 24 deletions

1
changelog/4974.doc.rst Normal file
View File

@ -0,0 +1 @@
Update docs for ``pytest_cmdline_parse`` hook to note availability liminations

View File

@ -99,7 +99,8 @@ def pytest_cmdline_parse(pluginmanager, args):
Stops at first non-None result, see :ref:`firstresult` Stops at first non-None result, see :ref:`firstresult`
.. note:: .. 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 _pytest.config.PytestPluginManager pluginmanager: pytest plugin manager
:param list[str] args: list of arguments passed on the command line :param list[str] args: list of arguments passed on the command line

View File

@ -335,6 +335,15 @@ def testdir(request, tmpdir_factory):
return 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-]+)") rex_outcome = re.compile(r"(\d+) ([\w-]+)")

View File

@ -768,10 +768,8 @@ def test_notify_exception(testdir, capfd):
assert not err assert not err
def test_load_initial_conftest_last_ordering(testdir): def test_load_initial_conftest_last_ordering(testdir, _config_for_test):
from _pytest.config import get_config pm = _config_for_test.pluginmanager
pm = get_config().pluginmanager
class My(object): class My(object):
def pytest_load_initial_conftests(self): def pytest_load_initial_conftests(self):
@ -1043,21 +1041,17 @@ class TestOverrideIniArgs(object):
assert rootdir == tmpdir assert rootdir == tmpdir
assert inifile is None 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" cache_dir = ".custom_cache"
monkeypatch.setenv("PYTEST_ADDOPTS", "-o cache_dir=%s" % cache_dir) monkeypatch.setenv("PYTEST_ADDOPTS", "-o cache_dir=%s" % cache_dir)
from _pytest.config import get_config config = _config_for_test
config = get_config()
config._preparse([], addopts=True) config._preparse([], addopts=True)
assert config._override_ini == ["cache_dir=%s" % cache_dir] 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).""" """PYTEST_ADDOPTS should not take values from normal args (#4265)."""
from _pytest.config import get_config
monkeypatch.setenv("PYTEST_ADDOPTS", "-o") monkeypatch.setenv("PYTEST_ADDOPTS", "-o")
config = get_config() config = _config_for_test
with pytest.raises(UsageError) as excinfo: with pytest.raises(UsageError) as excinfo:
config._preparse(["cache_dir=ignored"], addopts=True) config._preparse(["cache_dir=ignored"], addopts=True)
assert ( assert (
@ -1082,11 +1076,9 @@ class TestOverrideIniArgs(object):
) )
assert result.ret == _pytest.main.EXIT_USAGEERROR 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)""" """Check that -o no longer swallows all options after it (#3103)"""
from _pytest.config import get_config config = _config_for_test
config = get_config()
config._preparse(["-o", "cache_dir=/cache", "/some/test/path"]) config._preparse(["-o", "cache_dir=/cache", "/some/test/path"])
assert config._override_ini == ["cache_dir=/cache"] assert config._override_ini == ["cache_dir=/cache"]

View File

@ -8,7 +8,6 @@ import sys
import types import types
import pytest import pytest
from _pytest.config import get_config
from _pytest.config import PytestPluginManager from _pytest.config import PytestPluginManager
from _pytest.main import EXIT_NOTESTSCOLLECTED from _pytest.main import EXIT_NOTESTSCOLLECTED
from _pytest.main import Session from _pytest.main import Session
@ -20,7 +19,7 @@ def pytestpm():
class TestPytestPluginInteractions(object): class TestPytestPluginInteractions(object):
def test_addhooks_conftestplugin(self, testdir): def test_addhooks_conftestplugin(self, testdir, _config_for_test):
testdir.makepyfile( testdir.makepyfile(
newhooks=""" newhooks="""
def pytest_myhook(xyz): def pytest_myhook(xyz):
@ -36,7 +35,7 @@ class TestPytestPluginInteractions(object):
return xyz + 1 return xyz + 1
""" """
) )
config = get_config() config = _config_for_test
pm = config.pluginmanager pm = config.pluginmanager
pm.hook.pytest_addhooks.call_historic( pm.hook.pytest_addhooks.call_historic(
kwargs=dict(pluginmanager=config.pluginmanager) kwargs=dict(pluginmanager=config.pluginmanager)
@ -91,8 +90,8 @@ class TestPytestPluginInteractions(object):
config.pluginmanager.register(A()) config.pluginmanager.register(A())
assert len(values) == 2 assert len(values) == 2
def test_hook_tracing(self): def test_hook_tracing(self, _config_for_test):
pytestpm = get_config().pluginmanager # fully initialized with plugins pytestpm = _config_for_test.pluginmanager # fully initialized with plugins
saveindent = [] saveindent = []
class api1(object): class api1(object):
@ -201,8 +200,8 @@ class TestPytestPluginManager(object):
assert pytestpm.get_plugin("pytest_p1").__name__ == "pytest_p1" assert pytestpm.get_plugin("pytest_p1").__name__ == "pytest_p1"
assert pytestpm.get_plugin("pytest_p2").__name__ == "pytest_p2" assert pytestpm.get_plugin("pytest_p2").__name__ == "pytest_p2"
def test_consider_module_import_module(self, testdir): def test_consider_module_import_module(self, testdir, _config_for_test):
pytestpm = get_config().pluginmanager pytestpm = _config_for_test.pluginmanager
mod = types.ModuleType("x") mod = types.ModuleType("x")
mod.pytest_plugins = "pytest_a" mod.pytest_plugins = "pytest_a"
aplugin = testdir.makepyfile(pytest_a="#") aplugin = testdir.makepyfile(pytest_a="#")