]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-110171: `libregrtest` always sets `random.seed` (#110172)
authorNikita Sobolev <mail@sobolevn.me>
Wed, 4 Oct 2023 06:42:12 +0000 (09:42 +0300)
committerGitHub <noreply@github.com>
Wed, 4 Oct 2023 06:42:12 +0000 (06:42 +0000)
Lib/test/libregrtest/cmdline.py
Lib/test/libregrtest/main.py
Lib/test/libregrtest/setup.py
Lib/test/test_regrtest.py
Misc/NEWS.d/next/Tests/2023-10-01-10-27-02.gh-issue-110171.ZPlo0h.rst [new file with mode: 0644]

index 8562a48446b4a7fd1e2e118bda41e30eb2240c7d..7cfe904cb5a53528fbddcde843697ecf9600d78d 100644 (file)
@@ -27,8 +27,10 @@ EPILOG = """\
 Additional option details:
 
 -r randomizes test execution order. You can use --randseed=int to provide an
-int seed value for the randomizer; this is useful for reproducing troublesome
-test orders.
+int seed value for the randomizer. The randseed value will be used
+to set seeds for all random usages in tests
+(including randomizing the tests order if -r is set).
+By default we always set random seed, but do not randomize test order.
 
 -s On the first invocation of regrtest using -s, the first test file found
 or the first test file given on the command line is run, and the name of
@@ -229,6 +231,9 @@ def _create_parser():
                             more_details)
     group.add_argument('-p', '--python', metavar='PYTHON',
                        help='Command to run Python test subprocesses with.')
+    group.add_argument('--randseed', metavar='SEED',
+                       dest='random_seed', type=int,
+                       help='pass a global random seed')
 
     group = parser.add_argument_group('Verbosity')
     group.add_argument('-v', '--verbose', action='count',
@@ -249,10 +254,6 @@ def _create_parser():
     group = parser.add_argument_group('Selecting tests')
     group.add_argument('-r', '--randomize', action='store_true',
                        help='randomize test execution order.' + more_details)
-    group.add_argument('--randseed', metavar='SEED',
-                       dest='random_seed', type=int,
-                       help='pass a random seed to reproduce a previous '
-                            'random run')
     group.add_argument('-f', '--fromfile', metavar='FILE',
                        help='read names of tests to run from a file.' +
                             more_details)
index af5fb0f464f5b59ab4e7d07b60500a60030d3ac9..60179ec7708c1cf51340b6ac6a2c5cf0483c1162 100644 (file)
@@ -129,7 +129,11 @@ class Regrtest:
 
         # Randomize
         self.randomize: bool = ns.randomize
-        self.random_seed: int | None = ns.random_seed
+        self.random_seed: int | None =  (
+            ns.random_seed
+            if ns.random_seed is not None
+            else random.getrandbits(32)
+        )
         if 'SOURCE_DATE_EPOCH' in os.environ:
             self.randomize = False
             self.random_seed = None
@@ -214,10 +218,8 @@ class Regrtest:
                 print(f"Cannot find starting test: {self.starting_test}")
                 sys.exit(1)
 
+        random.seed(self.random_seed)
         if self.randomize:
-            if self.random_seed is None:
-                self.random_seed = random.randrange(100_000_000)
-            random.seed(self.random_seed)
             random.shuffle(selected)
 
         return (tuple(selected), tests)
@@ -439,8 +441,7 @@ class Regrtest:
                    or tests or self.cmdline_args)):
             display_header(self.use_resources, self.python_cmd)
 
-        if self.randomize:
-            print("Using random seed", self.random_seed)
+        print("Using random seed", self.random_seed)
 
         runtests = self.create_run_tests(selected)
         self.first_runtests = runtests
index f0d8d7ebaa2fdb64bfc679645501d92a80fe833b..cb410da5acb4c3057d3770e791f5b4ad67727f67 100644 (file)
@@ -126,5 +126,4 @@ def setup_tests(runtests: RunTests):
     if runtests.gc_threshold is not None:
         gc.set_threshold(runtests.gc_threshold)
 
-    if runtests.randomize:
-        random.seed(runtests.random_seed)
+    random.seed(runtests.random_seed)
index 38071341006092fc0c49a6ea84940a96793e7edb..ba23b3666924c47f28cec6e2f1be34198b73c014 100644 (file)
@@ -392,7 +392,7 @@ class ParseArgsTestCase(unittest.TestCase):
         self.assertEqual(regrtest.num_workers, -1)
         self.assertEqual(regrtest.want_rerun, rerun)
         self.assertTrue(regrtest.randomize)
-        self.assertIsNone(regrtest.random_seed)
+        self.assertIsInstance(regrtest.random_seed, int)
         self.assertTrue(regrtest.fail_env_changed)
         self.assertTrue(regrtest.fail_rerun)
         self.assertTrue(regrtest.print_slowest)
@@ -663,7 +663,7 @@ class BaseTestCase(unittest.TestCase):
     def parse_random_seed(self, output):
         match = self.regex_search(r'Using random seed ([0-9]+)', output)
         randseed = int(match.group(1))
-        self.assertTrue(0 <= randseed <= 100_000_000, randseed)
+        self.assertTrue(0 <= randseed, randseed)
         return randseed
 
     def run_command(self, args, input=None, exitcode=0, **kw):
@@ -950,6 +950,10 @@ class ArgsTestCase(BaseTestCase):
         test_random2 = int(match.group(1))
         self.assertEqual(test_random2, test_random)
 
+        # check that random.seed is used by default
+        output = self.run_tests(test, exitcode=EXITCODE_NO_TESTS_RAN)
+        self.assertIsInstance(self.parse_random_seed(output), int)
+
     def test_fromfile(self):
         # test --fromfile
         tests = [self.create_test() for index in range(5)]
diff --git a/Misc/NEWS.d/next/Tests/2023-10-01-10-27-02.gh-issue-110171.ZPlo0h.rst b/Misc/NEWS.d/next/Tests/2023-10-01-10-27-02.gh-issue-110171.ZPlo0h.rst
new file mode 100644 (file)
index 0000000..9b41b03
--- /dev/null
@@ -0,0 +1,3 @@
+``libregrtest`` now always sets and shows ``random.seed``,
+so tests are more reproducible. Use ``--randseed`` flag
+to pass the explicit random seed for tests.