Skip to content

Commit 93b1a21

Browse files
committed
WIP: Dynamic scheduling
1 parent 74dc4ba commit 93b1a21

File tree

8 files changed

+810
-80
lines changed

8 files changed

+810
-80
lines changed

tests/unit/test_test_report.py

Lines changed: 181 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -288,14 +288,32 @@ def test_junit_report_with_some_skipped_tests(self):
288288

289289
def test_junit_report_with_testcase_classname(self):
290290
report = self._new_report()
291-
report.add_result("test", PASSED, time=1.0, output_file_name=self.output_file_name)
292-
report.add_result("lib.entity", PASSED, time=1.0, output_file_name=self.output_file_name)
293-
report.add_result("lib.entity.test", PASSED, time=1.0, output_file_name=self.output_file_name)
291+
report.add_result(
292+
"test", PASSED, time=1.0, output_file_name=self.output_file_name, test_suite_name="test", start_time=0
293+
)
294+
report.add_result(
295+
"lib.entity",
296+
PASSED,
297+
time=1.0,
298+
output_file_name=self.output_file_name,
299+
test_suite_name="lib.entity",
300+
start_time=0,
301+
)
302+
report.add_result(
303+
"lib.entity.test",
304+
PASSED,
305+
time=1.0,
306+
output_file_name=self.output_file_name,
307+
test_suite_name="lib.entity.test",
308+
start_time=0,
309+
)
294310
report.add_result(
295311
"lib.entity.config.test",
296312
PASSED,
297313
time=1.0,
298314
output_file_name=self.output_file_name,
315+
test_suite_name="lib.entity.config.test",
316+
start_time=0,
299317
)
300318
root = ElementTree.fromstring(report.to_junit_xml_str())
301319
names = set(
@@ -347,56 +365,196 @@ def _report_with_all_passed_tests(self, output_file_name=None):
347365
if not output_file_name:
348366
output_file_name = self.output_file_name
349367
report = self._new_report()
350-
report.add_result("passed_test0", PASSED, time=1.0, output_file_name=output_file_name)
351-
report.add_result("passed_test1", PASSED, time=2.0, output_file_name=output_file_name)
368+
report.add_result(
369+
"passed_test0",
370+
PASSED,
371+
time=1.0,
372+
output_file_name=output_file_name,
373+
test_suite_name="passed_test0",
374+
start_time=0,
375+
)
376+
report.add_result(
377+
"passed_test1",
378+
PASSED,
379+
time=2.0,
380+
output_file_name=output_file_name,
381+
test_suite_name="passed_test0",
382+
start_time=0,
383+
)
352384
report.set_expected_num_tests(2)
353385
return report
354386

355387
def _report_with_missing_tests(self):
356388
"@returns A report with all passed tests"
357389
report = self._new_report()
358-
report.add_result("passed_test0", PASSED, time=1.0, output_file_name=self.output_file_name)
359-
report.add_result("passed_test1", PASSED, time=2.0, output_file_name=self.output_file_name)
390+
report.add_result(
391+
"passed_test0",
392+
PASSED,
393+
time=1.0,
394+
output_file_name=self.output_file_name,
395+
test_suite_name="passed_test0",
396+
start_time=0,
397+
)
398+
report.add_result(
399+
"passed_test1",
400+
PASSED,
401+
time=2.0,
402+
output_file_name=self.output_file_name,
403+
test_suite_name="passed_test0",
404+
start_time=0,
405+
)
360406
report.set_expected_num_tests(3)
361407
return report
362408

363409
def _report_with_some_failed_tests(self):
364410
"@returns A report with some failed tests"
365411
report = self._new_report()
366-
report.add_result("failed_test0", FAILED, time=11.12, output_file_name=self.output_file_name)
367-
report.add_result("passed_test", PASSED, time=2.0, output_file_name=self.output_file_name)
368-
report.add_result("failed_test1", FAILED, time=3.0, output_file_name=self.output_file_name)
412+
report.add_result(
413+
"failed_test0",
414+
FAILED,
415+
time=11.12,
416+
output_file_name=self.output_file_name,
417+
test_suite_name="failed_test0",
418+
start_time=0,
419+
)
420+
report.add_result(
421+
"passed_test",
422+
PASSED,
423+
time=2.0,
424+
output_file_name=self.output_file_name,
425+
test_suite_name="passed_test",
426+
start_time=0,
427+
)
428+
report.add_result(
429+
"failed_test1",
430+
FAILED,
431+
time=3.0,
432+
output_file_name=self.output_file_name,
433+
test_suite_name="failed_test1",
434+
start_time=0,
435+
)
369436
report.set_expected_num_tests(3)
370437
return report
371438

372439
def _report_with_some_skipped_tests(self):
373440
"@returns A report with some skipped tests"
374441
report = self._new_report()
375-
report.add_result("passed_test", PASSED, time=1.0, output_file_name=self.output_file_name)
376-
report.add_result("skipped_test", SKIPPED, time=0.0, output_file_name=self.output_file_name)
377-
report.add_result("failed_test", FAILED, time=3.0, output_file_name=self.output_file_name)
442+
report.add_result(
443+
"passed_test",
444+
PASSED,
445+
time=1.0,
446+
output_file_name=self.output_file_name,
447+
test_suite_name="passed_test",
448+
start_time=0,
449+
)
450+
report.add_result(
451+
"skipped_test",
452+
SKIPPED,
453+
time=0.0,
454+
output_file_name=self.output_file_name,
455+
test_suite_name="skipped_test",
456+
start_time=0,
457+
)
458+
report.add_result(
459+
"failed_test",
460+
FAILED,
461+
time=3.0,
462+
output_file_name=self.output_file_name,
463+
test_suite_name="failed_test",
464+
start_time=0,
465+
)
378466
report.set_expected_num_tests(3)
379467
return report
380468

381469
def _report_with_mixed_length_tests(self):
382470
"@returns A report with various long tests"
383471
report = self._new_report()
384-
report.add_result("passed_test0", PASSED, time=0.2, output_file_name=self.output_file_name)
385-
report.add_result("passed_test1", PASSED, time=2.1, output_file_name=self.output_file_name)
386-
report.add_result("passed_test2", PASSED, time=5.3, output_file_name=self.output_file_name)
387-
report.add_result("passed_test3", PASSED, time=60.3, output_file_name=self.output_file_name)
472+
report.add_result(
473+
"passed_test0",
474+
PASSED,
475+
time=0.2,
476+
output_file_name=self.output_file_name,
477+
test_suite_name="passed_test0",
478+
start_time=0,
479+
)
480+
report.add_result(
481+
"passed_test1",
482+
PASSED,
483+
time=2.1,
484+
output_file_name=self.output_file_name,
485+
test_suite_name="passed_test1",
486+
start_time=0,
487+
)
488+
report.add_result(
489+
"passed_test2",
490+
PASSED,
491+
time=5.3,
492+
output_file_name=self.output_file_name,
493+
test_suite_name="passed_test2",
494+
start_time=0,
495+
)
496+
report.add_result(
497+
"passed_test3",
498+
PASSED,
499+
time=60.3,
500+
output_file_name=self.output_file_name,
501+
test_suite_name="passed_test3",
502+
start_time=0,
503+
)
388504
report.set_expected_num_tests(4)
389505
return report
390506

391507
def _report_with_long_tests(self):
392508
"@returns A report with various long tests"
393509
report = self._new_report()
394-
report.add_result("passed_test0", PASSED, time=0.2, output_file_name=self.output_file_name)
395-
report.add_result("passed_test1", PASSED, time=2.1, output_file_name=self.output_file_name)
396-
report.add_result("passed_test2", PASSED, time=10.3, output_file_name=self.output_file_name)
397-
report.add_result("passed_test3", PASSED, time=60.1, output_file_name=self.output_file_name)
398-
report.add_result("passed_test4", PASSED, time=615.1, output_file_name=self.output_file_name)
399-
report.add_result("passed_test5", PASSED, time=3780.1, output_file_name=self.output_file_name)
510+
report.add_result(
511+
"passed_test0",
512+
PASSED,
513+
time=0.2,
514+
output_file_name=self.output_file_name,
515+
test_suite_name="passed_test0",
516+
start_time=0,
517+
)
518+
report.add_result(
519+
"passed_test1",
520+
PASSED,
521+
time=2.1,
522+
output_file_name=self.output_file_name,
523+
test_suite_name="passed_test1",
524+
start_time=0,
525+
)
526+
report.add_result(
527+
"passed_test2",
528+
PASSED,
529+
time=10.3,
530+
output_file_name=self.output_file_name,
531+
test_suite_name="passed_test2",
532+
start_time=0,
533+
)
534+
report.add_result(
535+
"passed_test3",
536+
PASSED,
537+
time=60.1,
538+
output_file_name=self.output_file_name,
539+
test_suite_name="passed_test3",
540+
start_time=0,
541+
)
542+
report.add_result(
543+
"passed_test4",
544+
PASSED,
545+
time=615.1,
546+
output_file_name=self.output_file_name,
547+
test_suite_name="passed_test4",
548+
start_time=0,
549+
)
550+
report.add_result(
551+
"passed_test5",
552+
PASSED,
553+
time=3780.1,
554+
output_file_name=self.output_file_name,
555+
test_suite_name="passed_test5",
556+
start_time=0,
557+
)
400558
report.set_expected_num_tests(6)
401559
return report
402560

tests/unit/test_test_runner.py

Lines changed: 47 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,21 @@ def test_runs_testcases_in_order(self, tempdir):
3636
test_list.add_test(test_case1)
3737
test_list.add_test(test_case2)
3838
test_list.add_test(test_case3)
39-
runner.run(test_list)
40-
self.assertEqual(test_case1.output_path, runner._get_output_path("test1"))
41-
self.assertEqual(test_case2.output_path, runner._get_output_path("test2"))
42-
self.assertEqual(test_case3.output_path, runner._get_output_path("test3"))
43-
self.assertEqual(order, ["test1", "test2", "test3"])
44-
self.assertTrue(report.result_of("test1").passed)
45-
self.assertTrue(report.result_of("test2").failed)
46-
self.assertTrue(report.result_of("test3").passed)
39+
with mock.patch("time.time", lambda: 1000):
40+
runner.run(test_list)
41+
self.assertEqual(test_case1.output_path, runner._get_output_path("test1"))
42+
self.assertEqual(test_case2.output_path, runner._get_output_path("test2"))
43+
self.assertEqual(test_case3.output_path, runner._get_output_path("test3"))
44+
self.assertEqual(order, ["test1", "test2", "test3"])
45+
self.assertTrue(report.result_of("test1").passed)
46+
self.assertEqual(report.result_of("test1").start_time, 1000)
47+
self.assertEqual(report.result_of("test1").test_suite_name, "test1")
48+
self.assertTrue(report.result_of("test2").failed)
49+
self.assertEqual(report.result_of("test2").start_time, 1000)
50+
self.assertEqual(report.result_of("test2").test_suite_name, "test2")
51+
self.assertTrue(report.result_of("test3").passed)
52+
self.assertEqual(report.result_of("test3").start_time, 1000)
53+
self.assertEqual(report.result_of("test3").test_suite_name, "test3")
4754

4855
@with_tempdir
4956
def test_fail_fast(self, tempdir):
@@ -58,16 +65,21 @@ def test_fail_fast(self, tempdir):
5865
test_list.add_test(test_case1)
5966
test_list.add_test(test_case2)
6067
test_list.add_test(test_case3)
61-
try:
62-
runner.run(test_list)
63-
except KeyboardInterrupt:
64-
pass
65-
self.assertEqual(test_case1.output_path, runner._get_output_path("test1"))
66-
self.assertEqual(test_case2.output_path, runner._get_output_path("test2"))
67-
self.assertEqual(test_case3.called, False)
68-
self.assertEqual(order, ["test1", "test2"])
69-
self.assertTrue(report.result_of("test1").passed)
70-
self.assertTrue(report.result_of("test2").failed)
68+
with mock.patch("time.time", lambda: 1000):
69+
try:
70+
runner.run(test_list)
71+
except KeyboardInterrupt:
72+
pass
73+
self.assertEqual(test_case1.output_path, runner._get_output_path("test1"))
74+
self.assertEqual(test_case2.output_path, runner._get_output_path("test2"))
75+
self.assertEqual(test_case3.called, False)
76+
self.assertEqual(order, ["test1", "test2"])
77+
self.assertTrue(report.result_of("test1").passed)
78+
self.assertEqual(report.result_of("test1").start_time, 1000)
79+
self.assertEqual(report.result_of("test1").test_suite_name, "test1")
80+
self.assertTrue(report.result_of("test2").failed)
81+
self.assertEqual(report.result_of("test2").start_time, 1000)
82+
self.assertEqual(report.result_of("test2").test_suite_name, "test2")
7183

7284
@with_tempdir
7385
def test_handles_python_exeception(self, tempdir):
@@ -82,8 +94,11 @@ def side_effect(*args, **kwargs): # pylint: disable=unused-argument
8294
raise KeyError
8395

8496
test_case.run_side_effect = side_effect
85-
runner.run(test_list)
86-
self.assertTrue(report.result_of("test").failed)
97+
with mock.patch("time.time", lambda: 1000):
98+
runner.run(test_list)
99+
self.assertTrue(report.result_of("test").failed)
100+
self.assertEqual(report.result_of("test").start_time, 1000)
101+
self.assertEqual(report.result_of("test").test_suite_name, "test")
87102

88103
@with_tempdir
89104
def test_collects_output(self, tempdir):
@@ -104,9 +119,12 @@ def side_effect(*args, **kwargs): # pylint: disable=unused-argument
104119
return True
105120

106121
test_case.run_side_effect = side_effect
107-
runner.run(test_list)
108-
self.assertTrue(report.result_of("test").passed)
109-
self.assertEqual(report.result_of("test").output, output)
122+
with mock.patch("time.time", lambda: 1000):
123+
runner.run(test_list)
124+
self.assertTrue(report.result_of("test").passed)
125+
self.assertEqual(report.result_of("test").output, output)
126+
self.assertEqual(report.result_of("test").start_time, 1000)
127+
self.assertEqual(report.result_of("test").test_suite_name, "test")
110128

111129
@with_tempdir
112130
def test_can_read_output(self, tempdir):
@@ -131,9 +149,12 @@ def side_effect(read_output, **kwargs): # pylint: disable=unused-argument
131149
return True
132150

133151
test_case.run_side_effect = side_effect
134-
runner.run(test_list)
135-
self.assertTrue(report.result_of("test").passed)
136-
self.assertEqual(report.result_of("test").output, "out1out2out3out4out5")
152+
with mock.patch("time.time", lambda: 1000):
153+
runner.run(test_list)
154+
self.assertTrue(report.result_of("test").passed)
155+
self.assertEqual(report.result_of("test").output, "out1out2out3out4out5")
156+
self.assertEqual(report.result_of("test").start_time, 1000)
157+
self.assertEqual(report.result_of("test").test_suite_name, "test")
137158

138159
def test_get_output_path_on_linux(self):
139160
output_path = "output_path"

0 commit comments

Comments
 (0)