Skip to content

Commit 7b56b03

Browse files
skhomutisseliverstov
authored andcommitted
traceback for robotframework (via #317)
1 parent cc4e597 commit 7b56b03

File tree

5 files changed

+53
-2
lines changed

5 files changed

+53
-2
lines changed
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,17 @@
11

22
.. code:: robotframework
33
4+
*** Settings ***
5+
Library ./status_library.py
6+
47
*** Test Cases ***
58
Failed Test Case With Message
69
Fail msg=Failed Details
10+
11+
Failed Test Case With Traceback
12+
Set Log Level DEBUG
13+
Fail msg=Failed Details
14+
15+
Failed Test Case With Python Traceback
16+
Set Log Level DEBUG
17+
Fail With Traceback Fail message
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
2+
from robot.libraries.BuiltIn import BuiltIn
3+
4+
5+
def fail_with_traceback(traceback_message):
6+
BuiltIn().fail(traceback_message)

allure-robotframework/src/listener/robot_listener.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ def __init__(self, logger_path=DEFAULT_OUTPUT_PATH):
3232
self.items_log = {}
3333
self.pool_id = None
3434
self.links = OrderedDict()
35+
self._previous_keyword_failed = False
36+
self._traceback_message = None
3537

3638
self.reporter = AllureReporter()
3739
self.listener = AllureListener(self.reporter)
@@ -65,7 +67,11 @@ def end_keyword(self, name, attributes):
6567

6668
def log_message(self, message):
6769
level = message.get('level')
70+
if self._previous_keyword_failed:
71+
self._traceback_message = message.get('message')
72+
self._previous_keyword_failed = False
6873
if level == RobotLogLevel.FAIL:
74+
self._previous_keyword_failed = True
6975
self.reporter.get_item(self.stack[-1]).statusDetails = StatusDetails(message=message.get('message'))
7076
self.append_message_to_last_item_log(message, level)
7177

@@ -113,7 +119,7 @@ def stop_current_test(self, name, attributes):
113119
test.labels.append(Label(name=LabelType.HOST, value=host_tag()))
114120
test.labels.append(Label(name=LabelType.FRAMEWORK, value='robotframework'))
115121
test.labels.append(Label(name=LabelType.LANGUAGE, value=platform_label()))
116-
test.statusDetails = StatusDetails(message=attributes.get('message'))
122+
test.statusDetails = StatusDetails(message=attributes.get('message'), trace=self.get_traceback_message())
117123
test.description = attributes.get('doc')
118124
last_link = list(self.links.values())[-1] if self.links else None
119125
if attributes.get(Severity.CRITICAL, 'no') == 'yes':
@@ -189,6 +195,11 @@ def remove_suite_link(self, uuid):
189195
if self.links.get(uuid):
190196
self.links.pop(uuid)
191197

198+
def get_traceback_message(self):
199+
if BuiltIn().get_variable_value('${LOG LEVEL}') in (RobotLogLevel.DEBUG, RobotLogLevel.TRACE):
200+
return self._traceback_message
201+
return None
202+
192203
def close(self):
193204
for plugin in [self.logger, self.listener]:
194205
name = allure_commons.plugin_manager.get_name(plugin)

allure-robotframework/test/status/status.robot

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,20 @@ Failed Test Case With Message
1111
Should Has Status Detail With Message ${test_case} Failed Details
1212
${step} Should Has Step ${test_case} BuiltIn.Fail
1313
Should Has Status ${step} failed
14-
Should Has Status Detail With Message ${step} Failed Details
14+
Should Has Status Detail With Message ${step} Failed Details
15+
16+
Failed Test Case With Traceback
17+
${allure_report} Run Robot With Allure examples/status/status.rst
18+
${test_case} Should Has Test Case ${allure_report} Failed Test Case With Traceback
19+
Should Has Status ${test_case} failed
20+
Should Has Status Detail With Traceback ${test_case} Traceback (most recent call last):\n${SPACE * 2}None
21+
${step} Should Has Step ${test_case} BuiltIn.Fail
22+
Should Has Status ${step} failed
23+
24+
Failed Test Case With Python Traceback
25+
${allure_report} Run Robot With Allure examples/status/status.rst
26+
${test_case} Should Has Test Case ${allure_report} Failed Test Case With Python Traceback
27+
Should Has Status ${test_case} failed
28+
Should Has Status Detail With Traceback ${test_case} fail_with_traceback\n${SPACE * 4}BuiltIn().fail(traceback_message)
29+
${step} Should Has Step ${test_case} status_library.Fail With Traceback
30+
Should Has Status ${step} failed

allure-robotframework/test/test_allure_library.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from allure_commons_test.result import has_link
1010
from allure_commons_test.result import has_status_details
1111
from allure_commons_test.result import with_message_contains
12+
from allure_commons_test.result import with_trace_contains
1213
from allure_commons_test.result import has_attachment
1314
from allure_commons_test.label import has_severity
1415
from allure_commons_test.label import has_tag
@@ -114,6 +115,12 @@ def should_has_status_detail_with_message(conext, message):
114115
assert_that(allure_report, matcher())
115116

116117

118+
def should_has_status_detail_with_traceback(conext, traceback):
119+
allure_report, item_matcher = conext
120+
matcher = partial(item_matcher, has_status_details, with_trace_contains, traceback)
121+
assert_that(allure_report, matcher())
122+
123+
117124
def should_has_link(context, link, link_type=None, link_name=None):
118125
allure_report, test_case_matcher = context
119126
matcher = partial(test_case_matcher, has_link, link, link_type, link_name)

0 commit comments

Comments
 (0)