Skip to content

Commit 1cbb46f

Browse files
committed
options: add --randomize option
Shuffle testing suites tests list when --randomize|-x option is defined. Reviewed-by: Petr Vorel <pvorel@suse.cz> Reviewed-by: Cyril Hrubis <chrubis@suse.cz> Signed-off-by: Andrea Cervesato <andrea.cervesato@suse.com>
1 parent 09b4f06 commit 1cbb46f

File tree

4 files changed

+66
-0
lines changed

4 files changed

+66
-0
lines changed

libkirk/main.py

+6
Original file line numberDiff line numberDiff line change
@@ -335,6 +335,7 @@ async def session_run() -> None:
335335
restore=restore_dir,
336336
suite_iterate=args.suite_iterate,
337337
skip_tests=skip_tests,
338+
randomize=args.randomize,
338339
)
339340
except asyncio.CancelledError:
340341
await session.stop()
@@ -468,6 +469,11 @@ def run(cmd_args: list = None) -> None:
468469
"-p",
469470
action="store_true",
470471
help="Force parallelization execution of all tests")
472+
parser.add_argument(
473+
"--randomize",
474+
"-x",
475+
action="store_true",
476+
help="Force parallelization execution of all tests")
471477

472478
# session arguments
473479
parser.add_argument(

libkirk/session.py

+8
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import os
99
import re
1010
import copy
11+
import random
1112
import logging
1213
import asyncio
1314
import libkirk
@@ -374,6 +375,8 @@ async def run(self, **kwargs: dict) -> None:
374375
:type restore: str
375376
:param suite_iterate: execute all suites multiple times
376377
:type suite_iterate: int
378+
:param randomize: randomize all tests if True
379+
:type randomize: bool
377380
"""
378381
command = kwargs.get("command", None)
379382
suites = kwargs.get("suites", None)
@@ -382,6 +385,7 @@ async def run(self, **kwargs: dict) -> None:
382385
report_path = kwargs.get("report_path", None)
383386
restore = kwargs.get("restore", None)
384387
suite_iterate = kwargs.get("suite_iterate", 1)
388+
randomize = kwargs.get("randomize", False)
385389

386390
async with self._run_lock:
387391
await libkirk.events.fire("session_started", self._tmpdir.abspath)
@@ -404,6 +408,10 @@ async def run(self, **kwargs: dict) -> None:
404408
suites_obj = self._apply_iterate(
405409
suites_obj, suite_iterate)
406410

411+
if randomize:
412+
for suite in suites_obj:
413+
random.shuffle(suite.tests)
414+
407415
await self._scheduler.schedule(suites_obj)
408416
except KirkException as err:
409417
if not self._stop:

libkirk/tests/test_main.py

+28
Original file line numberDiff line numberDiff line change
@@ -381,3 +381,31 @@ def test_suite_iterate(self, tmpdir):
381381
assert excinfo.value.code == libkirk.main.RC_OK
382382

383383
self.read_report(temp, 8)
384+
385+
def test_randomize(self, tmpdir):
386+
"""
387+
Test --randomize option.
388+
"""
389+
num_of_suites = 10
390+
391+
temp = tmpdir.mkdir("temp")
392+
cmd_args = [
393+
"--tmp-dir", str(temp),
394+
"--framework", "dummy",
395+
"--run-suite",
396+
]
397+
cmd_args.extend(["suite01"] * num_of_suites)
398+
cmd_args.append("--randomize")
399+
400+
with pytest.raises(SystemExit) as excinfo:
401+
libkirk.main.run(cmd_args=cmd_args)
402+
403+
assert excinfo.value.code == libkirk.main.RC_OK
404+
405+
report_d = self.read_report(temp, 2 * num_of_suites)
406+
407+
tests_names = []
408+
for test in report_d["results"]:
409+
tests_names.append(test["test_fqn"])
410+
411+
assert ["test01", "test02"] * num_of_suites != tests_names

libkirk/tests/test_session.py

+24
Original file line numberDiff line numberDiff line change
@@ -139,3 +139,27 @@ async def test_run_suite_iterate(self, tmpdir, session, iterate, expect):
139139
with open(report, "r", encoding="utf-8") as report_file:
140140
report_data = json.loads(report_file.read())
141141
assert len(report_data["results"]) == expect
142+
143+
async def test_run_randomize(self, tmpdir, session):
144+
"""
145+
Test run method when executing shuffled tests.
146+
"""
147+
num_of_suites = 5
148+
149+
report = str(tmpdir / "report.json")
150+
await session.run(
151+
suites=["suite01"] * num_of_suites,
152+
randomize=True,
153+
report_path=report)
154+
155+
report_data = None
156+
with open(report, "r", encoding="utf-8") as report_file:
157+
report_data = json.loads(report_file.read())
158+
159+
assert len(report_data["results"]) == 2 * num_of_suites
160+
161+
tests_names = []
162+
for test in report_data["results"]:
163+
tests_names.append(test["test_fqn"])
164+
165+
assert ["test01", "test02"] * num_of_suites != tests_names

0 commit comments

Comments
 (0)