Skip to content

Commit 1465386

Browse files
authored
gh-110171: libregrtest always sets random.seed (#110172)
1 parent 5b9a3fd commit 1465386

File tree

5 files changed

+24
-16
lines changed

5 files changed

+24
-16
lines changed

Lib/test/libregrtest/cmdline.py

+7-6
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,10 @@
2727
Additional option details:
2828
2929
-r randomizes test execution order. You can use --randseed=int to provide an
30-
int seed value for the randomizer; this is useful for reproducing troublesome
31-
test orders.
30+
int seed value for the randomizer. The randseed value will be used
31+
to set seeds for all random usages in tests
32+
(including randomizing the tests order if -r is set).
33+
By default we always set random seed, but do not randomize test order.
3234
3335
-s On the first invocation of regrtest using -s, the first test file found
3436
or the first test file given on the command line is run, and the name of
@@ -229,6 +231,9 @@ def _create_parser():
229231
more_details)
230232
group.add_argument('-p', '--python', metavar='PYTHON',
231233
help='Command to run Python test subprocesses with.')
234+
group.add_argument('--randseed', metavar='SEED',
235+
dest='random_seed', type=int,
236+
help='pass a global random seed')
232237

233238
group = parser.add_argument_group('Verbosity')
234239
group.add_argument('-v', '--verbose', action='count',
@@ -249,10 +254,6 @@ def _create_parser():
249254
group = parser.add_argument_group('Selecting tests')
250255
group.add_argument('-r', '--randomize', action='store_true',
251256
help='randomize test execution order.' + more_details)
252-
group.add_argument('--randseed', metavar='SEED',
253-
dest='random_seed', type=int,
254-
help='pass a random seed to reproduce a previous '
255-
'random run')
256257
group.add_argument('-f', '--fromfile', metavar='FILE',
257258
help='read names of tests to run from a file.' +
258259
more_details)

Lib/test/libregrtest/main.py

+7-6
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,11 @@ def __init__(self, ns: Namespace, _add_python_opts: bool = False):
129129

130130
# Randomize
131131
self.randomize: bool = ns.randomize
132-
self.random_seed: int | None = ns.random_seed
132+
self.random_seed: int | None = (
133+
ns.random_seed
134+
if ns.random_seed is not None
135+
else random.getrandbits(32)
136+
)
133137
if 'SOURCE_DATE_EPOCH' in os.environ:
134138
self.randomize = False
135139
self.random_seed = None
@@ -214,10 +218,8 @@ def find_tests(self, tests: TestList | None = None) -> tuple[TestTuple, TestList
214218
print(f"Cannot find starting test: {self.starting_test}")
215219
sys.exit(1)
216220

221+
random.seed(self.random_seed)
217222
if self.randomize:
218-
if self.random_seed is None:
219-
self.random_seed = random.randrange(100_000_000)
220-
random.seed(self.random_seed)
221223
random.shuffle(selected)
222224

223225
return (tuple(selected), tests)
@@ -439,8 +441,7 @@ def _run_tests(self, selected: TestTuple, tests: TestList | None) -> int:
439441
or tests or self.cmdline_args)):
440442
display_header(self.use_resources, self.python_cmd)
441443

442-
if self.randomize:
443-
print("Using random seed", self.random_seed)
444+
print("Using random seed", self.random_seed)
444445

445446
runtests = self.create_run_tests(selected)
446447
self.first_runtests = runtests

Lib/test/libregrtest/setup.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -126,5 +126,4 @@ def setup_tests(runtests: RunTests):
126126
if runtests.gc_threshold is not None:
127127
gc.set_threshold(runtests.gc_threshold)
128128

129-
if runtests.randomize:
130-
random.seed(runtests.random_seed)
129+
random.seed(runtests.random_seed)

Lib/test/test_regrtest.py

+6-2
Original file line numberDiff line numberDiff line change
@@ -392,7 +392,7 @@ def check_ci_mode(self, args, use_resources, rerun=True):
392392
self.assertEqual(regrtest.num_workers, -1)
393393
self.assertEqual(regrtest.want_rerun, rerun)
394394
self.assertTrue(regrtest.randomize)
395-
self.assertIsNone(regrtest.random_seed)
395+
self.assertIsInstance(regrtest.random_seed, int)
396396
self.assertTrue(regrtest.fail_env_changed)
397397
self.assertTrue(regrtest.fail_rerun)
398398
self.assertTrue(regrtest.print_slowest)
@@ -663,7 +663,7 @@ def list_regex(line_format, tests):
663663
def parse_random_seed(self, output):
664664
match = self.regex_search(r'Using random seed ([0-9]+)', output)
665665
randseed = int(match.group(1))
666-
self.assertTrue(0 <= randseed <= 100_000_000, randseed)
666+
self.assertTrue(0 <= randseed, randseed)
667667
return randseed
668668

669669
def run_command(self, args, input=None, exitcode=0, **kw):
@@ -950,6 +950,10 @@ def test_random(self):
950950
test_random2 = int(match.group(1))
951951
self.assertEqual(test_random2, test_random)
952952

953+
# check that random.seed is used by default
954+
output = self.run_tests(test, exitcode=EXITCODE_NO_TESTS_RAN)
955+
self.assertIsInstance(self.parse_random_seed(output), int)
956+
953957
def test_fromfile(self):
954958
# test --fromfile
955959
tests = [self.create_test() for index in range(5)]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
``libregrtest`` now always sets and shows ``random.seed``,
2+
so tests are more reproducible. Use ``--randseed`` flag
3+
to pass the explicit random seed for tests.

0 commit comments

Comments
 (0)