diff --git a/tests/plugins/seeder/_utils.py b/tests/plugins/seeder/_utils.py index c58f69a..898e5e8 100644 --- a/tests/plugins/seeder/_utils.py +++ b/tests/plugins/seeder/_utils.py @@ -41,11 +41,14 @@ def make_scenario_result(vscenario: Optional[VirtualScenario] = None) -> Scenari async def fire_arg_parsed_event(dispatcher: Dispatcher, *, seed: Optional[str] = None, - fixed_seed: bool = False) -> None: + fixed_seed: bool = Seeder.use_fixed_seed, + show_seeds: bool = Seeder.show_seeds) -> None: arg_parse_event = ArgParseEvent(ArgumentParser()) await dispatcher.fire(arg_parse_event) - arg_parsed_event = ArgParsedEvent(Namespace(seed=seed, fixed_seed=fixed_seed)) + arg_parsed_event = ArgParsedEvent(Namespace(seed=seed, + fixed_seed=fixed_seed, + show_seeds=show_seeds)) await dispatcher.fire(arg_parsed_event) diff --git a/tests/plugins/seeder/test_seeder_plugin.py b/tests/plugins/seeder/test_seeder_plugin.py index 4a83c14..f4b3e21 100644 --- a/tests/plugins/seeder/test_seeder_plugin.py +++ b/tests/plugins/seeder/test_seeder_plugin.py @@ -8,7 +8,7 @@ from vedro.core import Dispatcher from vedro.core import MonotonicScenarioScheduler as Scheduler from vedro.core import Report, ScenarioResult -from vedro.events import CleanupEvent, StartupEvent +from vedro.events import CleanupEvent, ScenarioRunEvent, StartupEvent from vedro.plugins.seeder import Seeder, SeederPlugin, StandardRandomGenerator from ._utils import ( @@ -278,3 +278,21 @@ async def test_dont_show_summary(get_scenario_results: Callable[[], List[Scenari with then: assert report.summary == [] + + +async def test_show_seeds(*, seeder: SeederPlugin, dispatcher: Dispatcher): + with given: + await fire_arg_parsed_event(dispatcher, seed=SEED_INITIAL, show_seeds=True) + + vscenario = make_vscenario("scenario-1.py") + scheduler = Scheduler(scenarios=[vscenario]) + await fire_startup_event(dispatcher, scheduler) + + scenario_result = ScenarioResult(vscenario) + event = ScenarioRunEvent(scenario_result) + + with when: + await dispatcher.fire(event) + + with then: + assert scenario_result.extra_details == ["seed: 75fc9f22..3b0238c4"] diff --git a/vedro/plugins/seeder/_seeder.py b/vedro/plugins/seeder/_seeder.py index c73c197..381953c 100644 --- a/vedro/plugins/seeder/_seeder.py +++ b/vedro/plugins/seeder/_seeder.py @@ -19,6 +19,7 @@ def __init__(self, config: Type["Seeder"], *, random: RandomGenerator = _random) super().__init__(config) self._random = random self._use_fixed_seed = config.use_fixed_seed + self._show_seeds = config.show_seeds self._initial_seed: Union[str, None] = None self._history: Dict[str, int] = {} @@ -37,9 +38,16 @@ def on_arg_parse(self, event: ArgParseEvent) -> None: default=self._use_fixed_seed, help=help_msg) + help_msg = "Show concrete seeds for each scenario run" + event.arg_parser.add_argument("--show-seeds", + action="store_true", + default=self._show_seeds, + help=help_msg) + def on_arg_parsed(self, event: ArgParsedEvent) -> None: self._initial_seed = event.args.seed or self._gen_initial_seed() self._use_fixed_seed = event.args.fixed_seed + self._show_seeds = event.args.show_seeds self._random.set_seed(self._initial_seed) @@ -53,6 +61,10 @@ def on_scenario_run(self, event: ScenarioRunEvent) -> None: seed = self._create_seed(self._initial_seed, unique_id, index) self._random.set_seed(seed) + if self._show_seeds: + seed_repr = self._get_seed_repr(seed) + event.scenario_result.add_extra_details(f"seed: {seed_repr[:8]}..{seed_repr[-8:]}") + def on_cleanup(self, event: CleanupEvent) -> None: if (event.report.passed + event.report.failed) > 0: assert self._initial_seed is not None # for type checker @@ -79,3 +91,6 @@ class Seeder(PluginConfig): # Use the same seed when a scenario is run multiple times in the same execution use_fixed_seed: bool = False + + # Show concrete seeds for each scenario run + show_seeds: bool = False