diff --git a/src/_pytest/pytester.py b/src/_pytest/pytester.py index 2c6ff2020..40b014dbd 100644 --- a/src/_pytest/pytester.py +++ b/src/_pytest/pytester.py @@ -344,6 +344,15 @@ def testdir(request, tmpdir_factory): return Testdir(request, tmpdir_factory) +@pytest.fixture +def _sys_snapshot(): + snappaths = SysPathsSnapshot() + snapmods = SysModulesSnapshot() + yield + snapmods.restore() + snappaths.restore() + + @pytest.fixture def _config_for_test(): from _pytest.config import get_config diff --git a/testing/acceptance_test.py b/testing/acceptance_test.py index 408fa076e..13a765411 100644 --- a/testing/acceptance_test.py +++ b/testing/acceptance_test.py @@ -485,7 +485,7 @@ class TestGeneralUsage(object): ["*source code not available*", "E*fixture 'invalid_fixture' not found"] ) - def test_plugins_given_as_strings(self, tmpdir, monkeypatch): + def test_plugins_given_as_strings(self, tmpdir, monkeypatch, _sys_snapshot): """test that str values passed to main() as `plugins` arg are interpreted as module names to be imported and registered. #855. diff --git a/testing/code/test_excinfo.py b/testing/code/test_excinfo.py index 4e36fb946..5a4ab8808 100644 --- a/testing/code/test_excinfo.py +++ b/testing/code/test_excinfo.py @@ -441,7 +441,7 @@ def test_match_raises_error(testdir): class TestFormattedExcinfo(object): @pytest.fixture - def importasmod(self, request): + def importasmod(self, request, _sys_snapshot): def importasmod(source): source = textwrap.dedent(source) tmpdir = request.getfixturevalue("tmpdir") diff --git a/testing/code/test_source.py b/testing/code/test_source.py index 965838dae..aa56273c4 100644 --- a/testing/code/test_source.py +++ b/testing/code/test_source.py @@ -410,7 +410,7 @@ def test_deindent(): assert lines == ["def f():", " def g():", " pass"] -def test_source_of_class_at_eof_without_newline(tmpdir): +def test_source_of_class_at_eof_without_newline(tmpdir, _sys_snapshot): # this test fails because the implicit inspect.getsource(A) below # does not return the "x = 1" last line. source = _pytest._code.Source( diff --git a/testing/test_config.py b/testing/test_config.py index 8cd606f45..142616716 100644 --- a/testing/test_config.py +++ b/testing/test_config.py @@ -436,7 +436,7 @@ class TestConfigAPI(object): class TestConfigFromdictargs(object): - def test_basic_behavior(self): + def test_basic_behavior(self, _sys_snapshot): from _pytest.config import Config option_dict = {"verbose": 444, "foo": "bar", "capture": "no"} @@ -450,7 +450,7 @@ class TestConfigFromdictargs(object): assert config.option.capture == "no" assert config.args == args - def test_origargs(self): + def test_origargs(self, _sys_snapshot): """Show that fromdictargs can handle args in their "orig" format""" from _pytest.config import Config @@ -1057,7 +1057,7 @@ class TestOverrideIniArgs(object): assert rootdir == tmpdir assert inifile is None - def test_addopts_before_initini(self, monkeypatch, _config_for_test): + def test_addopts_before_initini(self, monkeypatch, _config_for_test, _sys_snapshot): cache_dir = ".custom_cache" monkeypatch.setenv("PYTEST_ADDOPTS", "-o cache_dir=%s" % cache_dir) config = _config_for_test @@ -1092,7 +1092,7 @@ class TestOverrideIniArgs(object): ) assert result.ret == _pytest.main.EXIT_USAGEERROR - def test_override_ini_does_not_contain_paths(self, _config_for_test): + def test_override_ini_does_not_contain_paths(self, _config_for_test, _sys_snapshot): """Check that -o no longer swallows all options after it (#3103)""" config = _config_for_test config._preparse(["-o", "cache_dir=/cache", "/some/test/path"]) diff --git a/testing/test_conftest.py b/testing/test_conftest.py index 1c4be9816..a0458e595 100644 --- a/testing/test_conftest.py +++ b/testing/test_conftest.py @@ -13,17 +13,6 @@ from _pytest.main import EXIT_OK from _pytest.main import EXIT_USAGEERROR -@pytest.fixture(scope="module", params=["global", "inpackage"]) -def basedir(request, tmpdir_factory): - tmpdir = tmpdir_factory.mktemp("basedir", numbered=True) - tmpdir.ensure("adir/conftest.py").write("a=1 ; Directory = 3") - tmpdir.ensure("adir/b/conftest.py").write("b=2 ; a = 1.5") - if request.param == "inpackage": - tmpdir.ensure("adir/__init__.py") - tmpdir.ensure("adir/b/__init__.py") - return tmpdir - - def ConftestWithSetinitial(path): conftest = PytestPluginManager() conftest_setinitial(conftest, [path]) @@ -41,7 +30,19 @@ def conftest_setinitial(conftest, args, confcutdir=None): conftest._set_initial_conftests(Namespace()) +@pytest.mark.usefixtures("_sys_snapshot") class TestConftestValueAccessGlobal(object): + @pytest.fixture(scope="module", params=["global", "inpackage"]) + def basedir(self, request, tmpdir_factory): + tmpdir = tmpdir_factory.mktemp("basedir", numbered=True) + tmpdir.ensure("adir/conftest.py").write("a=1 ; Directory = 3") + tmpdir.ensure("adir/b/conftest.py").write("b=2 ; a = 1.5") + if request.param == "inpackage": + tmpdir.ensure("adir/__init__.py") + tmpdir.ensure("adir/b/__init__.py") + + yield tmpdir + def test_basic_init(self, basedir): conftest = PytestPluginManager() p = basedir.join("adir") @@ -49,10 +50,10 @@ class TestConftestValueAccessGlobal(object): def test_immediate_initialiation_and_incremental_are_the_same(self, basedir): conftest = PytestPluginManager() - len(conftest._dirpath2confmods) + assert not len(conftest._dirpath2confmods) conftest._getconftestmodules(basedir) snap1 = len(conftest._dirpath2confmods) - # assert len(conftest._dirpath2confmods) == snap1 + 1 + assert snap1 == 1 conftest._getconftestmodules(basedir.join("adir")) assert len(conftest._dirpath2confmods) == snap1 + 1 conftest._getconftestmodules(basedir.join("b")) @@ -80,7 +81,7 @@ class TestConftestValueAccessGlobal(object): assert path.purebasename.startswith("conftest") -def test_conftest_in_nonpkg_with_init(tmpdir): +def test_conftest_in_nonpkg_with_init(tmpdir, _sys_snapshot): tmpdir.ensure("adir-1.0/conftest.py").write("a=1 ; Directory = 3") tmpdir.ensure("adir-1.0/b/conftest.py").write("b=2 ; a = 1.5") tmpdir.ensure("adir-1.0/b/__init__.py")