diff options
author | Gregory P. Smith <greg@krypto.org> | 2018-09-12 17:58:40 -0700 |
---|---|---|
committer | Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> | 2018-09-12 17:58:40 -0700 |
commit | 4ae8ece5cd4c5853b625381db13429f25512108d (patch) | |
tree | b59c5db2bd26ffd2c4ea1ac1c58cac3ae03d6081 | |
parent | ed709d5699716bf7237856dc20aba321e2dfff6d (diff) | |
download | cpython-git-4ae8ece5cd4c5853b625381db13429f25512108d.tar.gz |
bpo-34200: Fix non-determinism of test_pkg (GH-9248)
This causes the tearDown code to only unimport the test modules specifically created as part of each test via the self.mkhier method rather than abusing test.support.modules_setup() and the scary test.support.modules_cleanup() code.
https://bugs.python.org/issue34200
-rw-r--r-- | Lib/test/test_pkg.py | 17 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Tests/2018-09-12-17-00-34.bpo-34200.dfxYQK.rst | 3 |
2 files changed, 12 insertions, 8 deletions
diff --git a/Lib/test/test_pkg.py b/Lib/test/test_pkg.py index 8130eab50a..eed0fd1c6b 100644 --- a/Lib/test/test_pkg.py +++ b/Lib/test/test_pkg.py @@ -5,7 +5,6 @@ import os import tempfile import textwrap import unittest -from test import support # Helpers to create and destroy hierarchies. @@ -50,11 +49,13 @@ class TestPkg(unittest.TestCase): self.root = None self.pkgname = None self.syspath = list(sys.path) - self.modules_before = support.modules_setup() + self.modules_to_cleanup = set() # Populated by mkhier(). def tearDown(self): sys.path[:] = self.syspath - support.modules_cleanup(*self.modules_before) + for modulename in self.modules_to_cleanup: + if modulename in sys.modules: + del sys.modules[modulename] if self.root: # Only clean if the test was actually run cleanout(self.root) @@ -75,17 +76,17 @@ class TestPkg(unittest.TestCase): os.mkdir(root) for name, contents in descr: comps = name.split() + self.modules_to_cleanup.add('.'.join(comps)) fullname = root for c in comps: fullname = os.path.join(fullname, c) if contents is None: os.mkdir(fullname) else: - f = open(fullname, "w") - f.write(contents) - if contents and contents[-1] != '\n': - f.write('\n') - f.close() + with open(fullname, "w") as f: + f.write(contents) + if not contents.endswith('\n'): + f.write('\n') self.root = root # package name is the name of the first item self.pkgname = descr[0][0] diff --git a/Misc/NEWS.d/next/Tests/2018-09-12-17-00-34.bpo-34200.dfxYQK.rst b/Misc/NEWS.d/next/Tests/2018-09-12-17-00-34.bpo-34200.dfxYQK.rst new file mode 100644 index 0000000000..b53339c585 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2018-09-12-17-00-34.bpo-34200.dfxYQK.rst @@ -0,0 +1,3 @@ +Fixed non-deterministic flakiness of test_pkg by not using the scary +test.support.module_cleanup() logic to save and restore sys.modules contents +between test cases. |