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
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',
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)
# 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
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)
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
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)
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)
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):
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)]
--- /dev/null
+``libregrtest`` now always sets and shows ``random.seed``,
+so tests are more reproducible. Use ``--randseed`` flag
+to pass the explicit random seed for tests.