Skip to content

Commit f3ef21c

Browse files
committed
Implementaion and test cases for skip in suite teardown
1 parent 000d391 commit f3ef21c

File tree

7 files changed

+51
-11
lines changed

7 files changed

+51
-11
lines changed

atest/robot/running/skip.robot

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,12 @@ Skip in Suite Setup
6464
Skip in Directory Suite Setup
6565
Check Test Case ${TEST NAME}
6666

67+
Skip In Suite Teardown
68+
Check Test Case ${TEST NAME}
69+
70+
Skip In Directory Suite Teardown
71+
Check Test Case ${TEST NAME}
72+
6773
Skipped with --skip
6874
Check Test Case ${TEST NAME}
6975

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
*** Settings ***
2+
Suite Teardown Skip All children must be skipped
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
*** Test Cases ***
2+
Skip In Directory Suite Teardown
3+
[Documentation] SKIP Skipped in parent suite teardown:\nAll children must be skipped\n\nEarlier message:\nFailure!
4+
Fail Failure!
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
*** Settings ***
2+
Suite Teardown Skip Cannot go on
3+
4+
*** Test Cases ***
5+
Skip In Suite Teardown
6+
[Documentation] SKIP Skipped in parent suite teardown:\nCannot go on\n\nEarlier message:\nOh no, a failure
7+
Fail Oh no, a failure

src/robot/result/model.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,10 @@ def handle_suite_teardown_failures(self):
325325
"""Internal usage only."""
326326
self.visit(SuiteTeardownFailureHandler())
327327

328-
def suite_teardown_failed(self, message):
328+
def suite_teardown_failed(self, error):
329329
"""Internal usage only."""
330-
self.visit(SuiteTeardownFailed(message))
330+
self.visit(SuiteTeardownFailed(error))
331+
332+
def suite_teardown_skipped(self, message):
333+
"""Internal usage only."""
334+
self.visit(SuiteTeardownFailed(message, skipped=True))

src/robot/result/suiteteardownfailed.py

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ def end_suite(self, suite):
2323
# Both 'PASS' and 'NOT_RUN' (used in dry-run) statuses are OK.
2424
if teardown and teardown.status == 'FAIL':
2525
suite.suite_teardown_failed(teardown.message)
26+
if teardown and teardown.status == 'SKIP':
27+
suite.suite_teardown_skipped(teardown.message)
2628

2729
def visit_test(self, test):
2830
pass
@@ -32,16 +34,26 @@ def visit_keyword(self, keyword):
3234

3335

3436
class SuiteTeardownFailed(SuiteVisitor):
35-
_normal_msg = 'Parent suite teardown failed:\n'
36-
_also_msg = '\n\nAlso parent suite teardown failed:\n'
37+
_normal_msg = 'Parent suite teardown failed:\n%s'
38+
_also_msg = '\n\nAlso parent suite teardown failed:\n%s'
39+
_normal_skip_msg = 'Skipped in parent suite teardown:\n%s'
40+
_also_skip_msg = 'Skipped in parent suite teardown:\n%s\n\nEarlier message:\n%s'
3741

38-
def __init__(self, error):
39-
self._normal_msg += error
40-
self._also_msg += error
42+
def __init__(self, message, skipped=False):
43+
self._skipped = skipped
44+
self._message = message
4145

4246
def visit_test(self, test):
43-
test.status = 'FAIL'
44-
test.message += self._also_msg if test.message else self._normal_msg
47+
if not self._skipped:
48+
test.status = 'FAIL'
49+
prefix = self._also_msg if test.message else self._normal_msg
50+
test.message += prefix % self._message
51+
else:
52+
test.status = 'SKIP'
53+
if test.message:
54+
test.message = self._also_skip_msg % (self._message, test.message)
55+
else:
56+
test.message = self._normal_skip_msg % self._message
4557

4658
def visit_keyword(self, keyword):
4759
pass

src/robot/running/runner.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,10 @@ def end_suite(self, suite):
9797
with self._context.suite_teardown():
9898
failure = self._run_teardown(suite.keywords.teardown, self._suite_status)
9999
if failure:
100-
self._suite.suite_teardown_failed(unic(failure))
100+
if failure.skip:
101+
self._suite.suite_teardown_skipped(unic(failure))
102+
else:
103+
self._suite.suite_teardown_failed(unic(failure))
101104
self._suite_status.failure_occurred()
102105
self._suite.endtime = get_timestamp()
103106
self._suite.message = self._suite_status.message
@@ -198,9 +201,11 @@ def _run_teardown(self, teardown, status, result=None):
198201
status.teardown_executed(exception)
199202
failed = exception and not isinstance(exception, PassExecution)
200203
if result and exception:
201-
if failed or not result.passed:
204+
if failed or status.skipped or exception.skip:
202205
result.message = status.message
203206
else:
207+
# Pass execution used in teardown,
208+
# and it overrides previous failure message
204209
result.message = exception.message
205210
return exception if failed else None
206211

0 commit comments

Comments
 (0)