Skip to content

Commit 3e8c51a

Browse files
czarflixnemesifier
andauthored
[fix] Fixed broken skipped Selenium tests in Django parallel runner #619
Fixes #619 Co-authored-by: Federico Capoano <f.capoano@openwisp.io>
1 parent e1d24be commit 3e8c51a

2 files changed

Lines changed: 78 additions & 4 deletions

File tree

openwisp_utils/tests/selenium.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,11 +54,16 @@ def _setup_and_call(self, result, debug=False):
5454
)
5555
super()._setup_and_call(result, debug)
5656
# IMPORTANT: a skip is not a success; propagate it as a skip and stop.
57-
if getattr(result, "skipped", None):
58-
for _, reason in result.skipped:
57+
if hasattr(result, "events"):
58+
skip_reasons = [
59+
event[2] for event in result.events if event[0] == "addSkip"
60+
]
61+
else:
62+
skip_reasons = [reason for _, reason in getattr(result, "skipped", [])]
63+
if skip_reasons:
64+
for reason in skip_reasons:
5965
original_result.addSkip(self, reason)
60-
if hasattr(original_result, "events") and hasattr(result, "events"):
61-
original_result.events = result.events
66+
original_result.stopTest(self)
6267
return
6368
if result.wasSuccessful():
6469
if attempt == 0:
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
from unittest import TestResult, TestSuite, skip
2+
3+
from django.test import SimpleTestCase
4+
from django.test.runner import RemoteTestRunner
5+
from openwisp_utils.tests.selenium import SeleniumTestMixin
6+
7+
8+
class TestSeleniumMixinSkipHandling(SimpleTestCase):
9+
def _run_skipped_standard_test(self):
10+
class SkippedSeleniumTest(SeleniumTestMixin, SimpleTestCase):
11+
retry_max = 0
12+
retry_delay = 0
13+
14+
@skip("skip propagation regression test")
15+
def test_skip(self):
16+
pass
17+
18+
test = SkippedSeleniumTest("test_skip")
19+
result = TestResult()
20+
test._setup_and_call(result)
21+
return result
22+
23+
def _run_skipped_remote_suite(self):
24+
class DummyWebDriver:
25+
def quit(self):
26+
pass
27+
28+
class SkippedSeleniumTest(SeleniumTestMixin, SimpleTestCase):
29+
retry_max = 0
30+
retry_delay = 0
31+
32+
@classmethod
33+
def get_webdriver(cls):
34+
return DummyWebDriver()
35+
36+
@skip("first skip propagation regression test")
37+
def test_first_skip(self):
38+
pass
39+
40+
@skip("second skip propagation regression test")
41+
def test_second_skip(self):
42+
pass
43+
44+
suite = TestSuite(
45+
[
46+
SkippedSeleniumTest("test_first_skip"),
47+
SkippedSeleniumTest("test_second_skip"),
48+
]
49+
)
50+
return RemoteTestRunner().run(suite)
51+
52+
def test_setup_and_call_propagates_skip_to_standard_result(self):
53+
result = self._run_skipped_standard_test()
54+
self.assertEqual(len(result.skipped), 1)
55+
self.assertEqual(result.skipped[0][1], "skip propagation regression test")
56+
57+
def test_setup_and_call_preserves_remote_skip_events_for_multiple_tests(self):
58+
result = self._run_skipped_remote_suite()
59+
self.assertEqual(
60+
result.events,
61+
[
62+
("startTest", 0),
63+
("addSkip", 0, "first skip propagation regression test"),
64+
("stopTest", 0),
65+
("startTest", 1),
66+
("addSkip", 1, "second skip propagation regression test"),
67+
("stopTest", 1),
68+
],
69+
)

0 commit comments

Comments
 (0)