Skip to content

Commit 2079164

Browse files
authored
User defined labels and links (fixes #82 via #83)
* user defined labels and links, also dynamic define labels and links allowed * add changes in commons
1 parent 7331fb0 commit 2079164

File tree

8 files changed

+117
-37
lines changed

8 files changed

+117
-37
lines changed

allure-pytest/src/helper.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ def decorate_as_label(self, label_type, labels):
1717
@allure_commons.hookimpl
1818
def decorate_as_link(self, url, link_type, name):
1919
allure_link_marker = u'{prefix}.{link_type}'.format(prefix=ALLURE_LINK_PREFIX, link_type=link_type)
20-
pattern = dict(self.config.option.allure_link_pattern).get(str(link_type), u'{}')
20+
pattern = dict(self.config.option.allure_link_pattern).get(link_type, u'{}')
2121
url = pattern.format(url)
2222
allure_link = getattr(pytest.mark, allure_link_marker)
2323
return allure_link(url, name=name)

allure-pytest/src/listener.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,8 @@ def pytest_runtest_protocol(self, item, nextitem):
6868

6969
yield
7070

71-
test_case.labels = [Label(name, value) for name, value in allure_labels(item)]
72-
test_case.links = [Link(link_type, url, name) for link_type, url, name in allure_links(item)]
71+
test_case.labels += [Label(name, value) for name, value in allure_labels(item)]
72+
test_case.links += [Link(link_type, url, name) for link_type, url, name in allure_links(item)]
7373
test_case.fullName = allure_full_name(item.nodeid)
7474
test_case.historyId = md5(test_case.fullName)
7575
test_case.labels.append(Label('package', allure_package(item.nodeid)))
@@ -170,6 +170,15 @@ def attach_data(self, body, name, attachment_type, extension):
170170
def attach_file(self, source, name, attachment_type, extension):
171171
self.allure_logger.attach_file(uuid4(), source, name=name, attachment_type=attachment_type, extension=extension)
172172

173+
@allure_commons.hookimpl
174+
def add_link(self, url, link_type, name):
175+
self.allure_logger.update_test(None, links=[Link(link_type, url, name)])
176+
177+
@allure_commons.hookimpl
178+
def add_label(self, label_type, labels):
179+
for label in labels:
180+
self.allure_logger.update_test(None, labels=Label(label_type, label))
181+
173182

174183
class ItemCache(object):
175184

allure-pytest/src/utils.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,11 +51,11 @@ def allure_labels(item):
5151
if keyword.startswith(ALLURE_LABEL_PREFIX):
5252
marker = item.get_marker(keyword)
5353
label_type = marker.kwargs['label_type']
54-
if label_type.value in ALLURE_UNIQUE_LABELS:
55-
yield (label_type.value, marker.args[0])
54+
if label_type in ALLURE_UNIQUE_LABELS:
55+
yield (label_type, marker.args[0])
5656
else:
5757
for value in marker.args:
58-
yield (label_type.value, value)
58+
yield (label_type, value)
5959

6060

6161
def allure_links(item):
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
"""
2+
>>> allure_report = getfixture('allure_report')
3+
>>> assert_that(allure_report,
4+
... all_of(
5+
... has_property('test_cases', has_length(3)),
6+
... has_property('test_groups', has_length(0))
7+
... )) # doctest: +SKIP
8+
"""
9+
10+
import allure
11+
12+
13+
@allure.label('user_label', 'work', 'cool')
14+
def test_user_label():
15+
"""
16+
>>> allure_report = getfixture('allure_report')
17+
>>> assert_that(allure_report,
18+
... has_test_case('test_user_label',
19+
... all_of(
20+
... has_label('user_label', 'work'),
21+
... has_label('user_label', 'cool'),
22+
... )
23+
... ))
24+
"""
25+
pass
26+
27+
28+
def test_user_dynamic_label():
29+
"""
30+
>>> allure_report = getfixture('allure_report')
31+
>>> assert_that(allure_report,
32+
... has_test_case('test_user_dynamic_label',
33+
... all_of(
34+
... has_label('user_label', 'work'),
35+
... has_label('user_label', 'cool'),
36+
... )
37+
... ))
38+
"""
39+
allure.dynamic.label('user_label', 'work', 'cool')
40+
pass
41+
42+
43+
@allure.label('user_label', 'work')
44+
def test_update_labels():
45+
"""
46+
>>> allure_report = getfixture('allure_report')
47+
>>> assert_that(allure_report,
48+
... has_test_case('test_user_dynamic_label',
49+
... all_of(
50+
... has_label('user_label', 'work'),
51+
... has_label('user_label', 'cool'),
52+
... )
53+
... ))
54+
"""
55+
allure.dynamic.label('user_label', 'very cool')
56+
pass

allure-python-commons/src/_allure.py

Lines changed: 33 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
from functools import partial
21
from functools import wraps
32

43
from allure_commons._core import plugin_manager
@@ -24,10 +23,6 @@ def severity(severity_level):
2423
return label(LabelType.SEVERITY, severity_level)
2524

2625

27-
def tag(*tags):
28-
return label(LabelType.TAG, *tags)
29-
30-
3126
def feature(*features):
3227
return label(LabelType.FEATURE, *features)
3328

@@ -36,6 +31,10 @@ def story(*stories):
3631
return label(LabelType.STORY, *stories)
3732

3833

34+
def tag(*tags):
35+
return label(LabelType.TAG, *tags)
36+
37+
3938
def link(url, link_type=LinkType.LINK, name=None):
4039
return safely(plugin_manager.hook.decorate_as_link(url=url, link_type=link_type, name=name))
4140

@@ -48,24 +47,39 @@ def testcase(url, name=None):
4847
return link(url, link_type=LinkType.TEST_CASE, name=name)
4948

5049

51-
def add_label(label_type, labels):
52-
print("Y"*29)
50+
class Dynamic(object):
51+
52+
@staticmethod
53+
def label(label_type, *labels):
54+
plugin_manager.hook.add_label(label_type=label_type, labels=labels)
5355

56+
@staticmethod
57+
def severity(severity_level):
58+
Dynamic.label(LabelType.SEVERITY, severity_level)
5459

55-
def add_link(url, link_type=LinkType.LINK, name=None):
56-
print ("X"*23)
60+
@staticmethod
61+
def feature(*features):
62+
Dynamic.label(LabelType.FEATURE, *features)
5763

64+
@staticmethod
65+
def story(*stories):
66+
Dynamic.label(LabelType.STORY, *stories)
5867

59-
class Dynamic(object):
60-
label = partial(add_label)
61-
severity = partial(add_label, LabelType.SEVERITY)
62-
tag = partial(add_label, LabelType.TAG)
63-
feature = partial(add_label, LabelType.FEATURE)
64-
story = partial(add_label, LabelType.STORY)
65-
66-
link = partial(add_link)
67-
issue = partial(add_link, link_type=LinkType.ISSUE)
68-
testcase = partial(add_link, link_type=LinkType.TEST_CASE)
68+
@staticmethod
69+
def tag(*tags):
70+
Dynamic.label(LabelType.TAG, *tags)
71+
72+
@staticmethod
73+
def link(url, link_type=LinkType.LINK, name=None):
74+
plugin_manager.hook.add_link(url=url, link_type=link_type, name=name)
75+
76+
@staticmethod
77+
def issue(url, name=None):
78+
Dynamic.link(url, link_type=LinkType.TEST_CASE, name=name)
79+
80+
@staticmethod
81+
def testcase(url, name=None):
82+
Dynamic.link(url, link_type=LinkType.TEST_CASE, name=name)
6983

7084

7185
def step(title):

allure-python-commons/src/_hooks.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,21 @@ def decorate_as_label(label_type, labels):
99
""" label """
1010

1111

12+
@hookspec
13+
def add_label(label_type, labels):
14+
""" label """
15+
16+
1217
@hookspec
1318
def decorate_as_link(url, link_type, name):
1419
""" url """
1520

1621

22+
@hookspec
23+
def add_link(url, link_type, name):
24+
""" url """
25+
26+
1727
@hookspec
1828
def start_step(uuid, title, params):
1929
""" step """

allure-python-commons/src/logger.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ def __init__(self, report_dir):
1717
os.makedirs(report_dir)
1818

1919
def _update_item(self, uuid, **kwargs):
20-
item = self._items[uuid]
20+
item = self._items[uuid] if uuid else self._items[next(reversed(self._items))]
2121
for name, value in kwargs.items():
2222
attr = getattr(item, name)
2323
if isinstance(attr, list):

allure-python-commons/src/types.py

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,29 +4,20 @@
44

55

66
class Severity(str, Enum):
7-
def __str__(self):
8-
return self.value
9-
107
BLOCKER = 'blocker'
118
CRITICAL = 'critical'
129
NORMAL = 'normal'
1310
MINOR = 'minor'
1411
TRIVIAL = 'trivial'
1512

1613

17-
class LinkType(Enum):
18-
def __str__(self):
19-
return self.value
20-
14+
class LinkType(object):
2115
LINK = 'link'
2216
ISSUE = 'issue'
2317
TEST_CASE = 'test_case'
2418

2519

26-
class LabelType(Enum):
27-
def __str__(self):
28-
return self.value
29-
20+
class LabelType(str, Enum):
3021
FEATURE = 'feature'
3122
STORY = 'story'
3223
SEVERITY = 'severity'

0 commit comments

Comments
 (0)