Skip to content

Commit f7268d8

Browse files
committed
fix: new random seed not random after trace rerun
Given a test run containing multiple model-based suites and the previous suite used a specific seed to rerun a trace when the following suite uses 'seed=new' (default) then the newly generated seed would always be the same
1 parent 0fe8eba commit f7268d8

2 files changed

Lines changed: 17 additions & 5 deletions

File tree

robotmbt/suiteprocessors.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,9 +354,11 @@ def _init_randomiser(seed: str | int | bytes | bytearray | None):
354354
if isinstance(seed, str):
355355
seed = seed.strip()
356356
if str(seed).lower() == 'none':
357+
random.seed()
357358
logger.info(
358359
"Using system's random seed for trace generation. This trace cannot be rerun. Use `seed=new` to generate a reusable seed.")
359360
elif str(seed).lower() == 'new':
361+
random.seed()
360362
new_seed = SuiteProcessors._generate_seed()
361363
logger.info(f"seed={new_seed} (use seed to rerun this trace)")
362364
random.seed(new_seed)

utest/test_suiteprocessors.py

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3232

3333
import unittest
34-
from unittest.mock import patch
34+
from unittest.mock import patch, call
3535

3636
from robotmbt.suiteprocessors import SuiteProcessors
3737

@@ -48,19 +48,19 @@ def test_provided_seed_is_stripped(self, mock):
4848

4949
def test_seed_none_keeps_system_seed(self, mock):
5050
SuiteProcessors._init_randomiser(None)
51-
mock.assert_not_called()
51+
mock.assert_called_with()
5252

5353
def test_seed_none_as_string(self, mock):
5454
SuiteProcessors._init_randomiser("None")
55-
mock.assert_not_called()
55+
mock.assert_called_with()
5656

5757
def test_seed_none_as_string_is_stripped(self, mock):
5858
SuiteProcessors._init_randomiser(" None\t")
59-
mock.assert_not_called()
59+
mock.assert_called_with()
6060

6161
def test_seed_none_as_string_is_case_insensitive(self, mock):
6262
SuiteProcessors._init_randomiser("nOnE")
63-
mock.assert_not_called()
63+
mock.assert_called_with()
6464

6565
def test_seed_new_generates_reusable_seed(self, mock):
6666
SuiteProcessors._init_randomiser("new")
@@ -82,6 +82,16 @@ def test_generated_seeds_have_max_2_consecutive_vowels_or_consonants(self, mock)
8282
self.assertNotIn('***', new_seed.translate({ord(c): '*' for c in 'aeiouy'}))
8383
self.assertNotIn('***', new_seed.translate({ord(c): '*' for c in 'bcdfghjklmnpqrstvwxz'}))
8484

85+
def test_seed_is_reset_after_using_specific_seed(self, mock):
86+
"""
87+
added to cover the issue where, after having rerun a specific trace, the next
88+
generated seed was always the same.
89+
"""
90+
SuiteProcessors._init_randomiser("specific seed")
91+
SuiteProcessors._init_randomiser("new")
92+
new_seed = mock.call_args.args[0]
93+
mock.assert_has_calls([call("specific seed"), call(), call(new_seed)])
94+
8595
def _is_generated_seed(self, arg):
8696
"""
8797
Generated seeds are formatted as 5 dash-separated [-] words, where

0 commit comments

Comments
 (0)