Merge pull request #5031 from blueyed/pytester-addopts

pytester: use monkeypatch with Testdir
This commit is contained in:
Bruno Oliveira 2019-04-03 11:26:49 -03:00 committed by GitHub
commit 46df1d5fcf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 27 additions and 9 deletions

View File

@ -0,0 +1 @@
Environment variables are properly restored when using pytester's ``testdir`` fixture.

View File

@ -476,9 +476,6 @@ class Testdir(object):
name = request.function.__name__ name = request.function.__name__
self.tmpdir = tmpdir_factory.mktemp(name, numbered=True) self.tmpdir = tmpdir_factory.mktemp(name, numbered=True)
self.test_tmproot = tmpdir_factory.mktemp("tmp-" + name, numbered=True) self.test_tmproot = tmpdir_factory.mktemp("tmp-" + name, numbered=True)
os.environ["PYTEST_DEBUG_TEMPROOT"] = str(self.test_tmproot)
os.environ.pop("TOX_ENV_DIR", None) # Ensure that it is not used for caching.
os.environ.pop("PYTEST_ADDOPTS", None) # Do not use outer options.
self.plugins = [] self.plugins = []
self._cwd_snapshot = CwdSnapshot() self._cwd_snapshot = CwdSnapshot()
self._sys_path_snapshot = SysPathsSnapshot() self._sys_path_snapshot = SysPathsSnapshot()
@ -491,6 +488,13 @@ class Testdir(object):
elif method == "subprocess": elif method == "subprocess":
self._runpytest_method = self.runpytest_subprocess self._runpytest_method = self.runpytest_subprocess
mp = self.monkeypatch = MonkeyPatch()
mp.setenv("PYTEST_DEBUG_TEMPROOT", str(self.test_tmproot))
# Ensure no unexpected caching via tox.
mp.delenv("TOX_ENV_DIR", raising=False)
# Discard outer pytest options.
mp.delenv("PYTEST_ADDOPTS", raising=False)
def __repr__(self): def __repr__(self):
return "<Testdir %r>" % (self.tmpdir,) return "<Testdir %r>" % (self.tmpdir,)
@ -508,7 +512,7 @@ class Testdir(object):
self._sys_modules_snapshot.restore() self._sys_modules_snapshot.restore()
self._sys_path_snapshot.restore() self._sys_path_snapshot.restore()
self._cwd_snapshot.restore() self._cwd_snapshot.restore()
os.environ.pop("PYTEST_DEBUG_TEMPROOT", None) self.monkeypatch.undo()
def __take_sys_modules_snapshot(self): def __take_sys_modules_snapshot(self):
# some zope modules used by twisted-related tests keep internal state # some zope modules used by twisted-related tests keep internal state
@ -799,11 +803,11 @@ class Testdir(object):
""" """
finalizers = [] finalizers = []
try: try:
# Do not load user config. # Do not load user config (during runs only).
monkeypatch = MonkeyPatch() mp_run = MonkeyPatch()
monkeypatch.setenv("HOME", str(self.tmpdir)) mp_run.setenv("HOME", str(self.tmpdir))
monkeypatch.setenv("USERPROFILE", str(self.tmpdir)) mp_run.setenv("USERPROFILE", str(self.tmpdir))
finalizers.append(monkeypatch.undo) finalizers.append(mp_run.undo)
# When running pytest inline any plugins active in the main test # When running pytest inline any plugins active in the main test
# process are already imported. So this disables the warning which # process are already imported. So this disables the warning which

View File

@ -469,3 +469,16 @@ def test_linematcher_with_nonlist():
assert lm._getlines({}) == {} assert lm._getlines({}) == {}
assert lm._getlines(set()) == set() assert lm._getlines(set()) == set()
def test_pytester_addopts(request, monkeypatch):
monkeypatch.setenv("PYTEST_ADDOPTS", "--orig-unused")
testdir = request.getfixturevalue("testdir")
try:
assert "PYTEST_ADDOPTS" not in os.environ
finally:
testdir.finalize()
assert os.environ["PYTEST_ADDOPTS"] == "--orig-unused"