diff --git a/changelog/4956.feature.rst b/changelog/4956.feature.rst new file mode 100644 index 00000000000..ab8357cdafe --- /dev/null +++ b/changelog/4956.feature.rst @@ -0,0 +1 @@ +pytester's ``testdir.spawn`` uses ``tmpdir`` as HOME/USERPROFILE directory. diff --git a/src/_pytest/pytester.py b/src/_pytest/pytester.py index 413b2182425..ec52ba5de1a 100644 --- a/src/_pytest/pytester.py +++ b/src/_pytest/pytester.py @@ -1241,7 +1241,13 @@ def spawn(self, cmd, expect_timeout=10.0): if sys.platform.startswith("freebsd"): pytest.xfail("pexpect does not work reliably on freebsd") logfile = self.tmpdir.join("spawn.out").open("wb") - child = pexpect.spawn(cmd, logfile=logfile) + + # Do not load user config. + env = os.environ.copy() + env["HOME"] = str(self.tmpdir) + env["USERPROFILE"] = env["HOME"] + + child = pexpect.spawn(cmd, logfile=logfile, env=env) self.request.addfinalizer(logfile.close) child.timeout = expect_timeout return child diff --git a/testing/test_pytester.py b/testing/test_pytester.py index b76d413b7b1..c5008a079a1 100644 --- a/testing/test_pytester.py +++ b/testing/test_pytester.py @@ -559,3 +559,24 @@ def test_popen_default_stdin_stderr_and_stdin_None(testdir): assert stdout.splitlines() == [b"", b"stdout"] assert stderr.splitlines() == [b"stderr"] assert proc.returncode == 0 + + +def test_spawn_uses_tmphome(testdir): + import os + + # Does use HOME only during run. + assert os.environ.get("HOME") != str(testdir.tmpdir) + + p1 = testdir.makepyfile( + """ + import os + + def test(): + assert os.environ["HOME"] == {tmphome!r} + """.format( + tmphome=str(testdir.tmpdir) + ) + ) + child = testdir.spawn_pytest(str(p1)) + out = child.read() + assert child.wait() == 0, out.decode("utf8")