[Python-checkins] cpython: Issue #26295: test_regrtest now uses a temporary directory

victor.stinner python-checkins at python.org
Tue Mar 29 20:53:14 EDT 2016


https://hg.python.org/cpython/rev/c83349c129c9
changeset:   100795:c83349c129c9
user:        Victor Stinner <victor.stinner at gmail.com>
date:        Wed Mar 30 02:33:52 2016 +0200
summary:
  Issue #26295: test_regrtest now uses a temporary directory

test_forever() stores its state into the builtins module since the test module
is reloaded at each run.

Remove also warning to detect leaked tests of a previous run.

files:
  Lib/test/test_regrtest.py |  55 +++++++++++++-------------
  1 files changed, 28 insertions(+), 27 deletions(-)


diff --git a/Lib/test/test_regrtest.py b/Lib/test/test_regrtest.py
--- a/Lib/test/test_regrtest.py
+++ b/Lib/test/test_regrtest.py
@@ -15,6 +15,7 @@
 import subprocess
 import sys
 import sysconfig
+import tempfile
 import textwrap
 import unittest
 from test import libregrtest
@@ -309,15 +310,8 @@
     def setUp(self):
         self.testdir = os.path.realpath(os.path.dirname(__file__))
 
-        # When test_regrtest is interrupted by CTRL+c, it can leave
-        # temporary test files
-        remove = [entry.path
-                  for entry in os.scandir(self.testdir)
-                  if (entry.name.startswith(self.TESTNAME_PREFIX)
-                      and entry.name.endswith(".py"))]
-        for path in remove:
-            print("WARNING: test_regrtest: remove %s" % path)
-            support.unlink(path)
+        self.tmptestdir = tempfile.mkdtemp()
+        self.addCleanup(support.rmtree, self.tmptestdir)
 
     def create_test(self, name=None, code=''):
         if not name:
@@ -326,8 +320,8 @@
 
         # test_regrtest cannot be run twice in parallel because
         # of setUp() and create_test()
-        name = self.TESTNAME_PREFIX + "%s_%s" % (os.getpid(), name)
-        path = os.path.join(self.testdir, name + '.py')
+        name = self.TESTNAME_PREFIX + name
+        path = os.path.join(self.tmptestdir, name + '.py')
 
         self.addCleanup(support.unlink, path)
         # Use 'x' mode to ensure that we do not override existing tests
@@ -462,7 +456,8 @@
         self.tests = [self.create_test() for index in range(self.NTEST)]
 
         self.python_args = ['-Wd', '-E', '-bb']
-        self.regrtest_args = ['-uall', '-rwW']
+        self.regrtest_args = ['-uall', '-rwW',
+                              '--testdir=%s' % self.tmptestdir]
         if hasattr(faulthandler, 'dump_traceback_later'):
             self.regrtest_args.extend(('--timeout', '3600', '-j4'))
         if sys.platform == 'win32':
@@ -519,7 +514,8 @@
     def test_tools_script_run_tests(self):
         # Tools/scripts/run_tests.py
         script = os.path.join(ROOT_DIR, 'Tools', 'scripts', 'run_tests.py')
-        self.run_tests([script, *self.tests])
+        args = [script, '--testdir=%s' % self.tmptestdir, *self.tests]
+        self.run_tests(args)
 
     def run_batch(self, *args):
         proc = self.run_command(args)
@@ -555,8 +551,9 @@
     Test arguments of the Python test suite.
     """
 
-    def run_tests(self, *args, **kw):
-        return self.run_python(['-m', 'test', *args], **kw)
+    def run_tests(self, *testargs, **kw):
+        cmdargs = ['-m', 'test', '--testdir=%s' % self.tmptestdir, *testargs]
+        return self.run_python(cmdargs, **kw)
 
     def test_failing_test(self):
         # test a failing test
@@ -567,8 +564,8 @@
                 def test_failing(self):
                     self.fail("bug")
         """)
-        test_ok = self.create_test()
-        test_failing = self.create_test(code=code)
+        test_ok = self.create_test('ok')
+        test_failing = self.create_test('failing', code=code)
         tests = [test_ok, test_failing]
 
         output = self.run_tests(*tests, exitcode=1)
@@ -661,7 +658,7 @@
 
     def test_interrupted(self):
         code = TEST_INTERRUPTED
-        test = self.create_test("sigint", code=code)
+        test = self.create_test('sigint', code=code)
         output = self.run_tests(test, exitcode=1)
         self.check_executed_tests(output, test, omitted=test)
 
@@ -693,7 +690,7 @@
 
     def test_coverage(self):
         # test --coverage
-        test = self.create_test()
+        test = self.create_test('coverage')
         output = self.run_tests("--coverage", test)
         self.check_executed_tests(output, [test])
         regex = ('lines +cov% +module +\(path\)\n'
@@ -702,24 +699,28 @@
 
     def test_wait(self):
         # test --wait
-        test = self.create_test()
+        test = self.create_test('wait')
         output = self.run_tests("--wait", test, input='key')
         self.check_line(output, 'Press any key to continue')
 
     def test_forever(self):
         # test --forever
         code = textwrap.dedent("""
+            import builtins
             import unittest
 
             class ForeverTester(unittest.TestCase):
-                RUN = 1
-
                 def test_run(self):
-                    ForeverTester.RUN += 1
-                    if ForeverTester.RUN > 3:
-                        self.fail("fail at the 3rd runs")
+                    # Store the state in the builtins module, because the test
+                    # module is reload at each run
+                    if 'RUN' in builtins.__dict__:
+                        builtins.__dict__['RUN'] += 1
+                        if builtins.__dict__['RUN'] >= 3:
+                            self.fail("fail at the 3rd runs")
+                    else:
+                        builtins.__dict__['RUN'] = 1
         """)
-        test = self.create_test(code=code)
+        test = self.create_test('forever', code=code)
         output = self.run_tests('--forever', test, exitcode=1)
         self.check_executed_tests(output, [test]*3, failed=test)
 
@@ -747,7 +748,7 @@
                     fd = os.open(__file__, os.O_RDONLY)
                     # bug: never cloes the file descriptor
         """)
-        test = self.create_test(code=code)
+        test = self.create_test('huntrleaks', code=code)
 
         filename = 'reflog.txt'
         self.addCleanup(support.unlink, filename)

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list