Skip to content

Commit 6da2cab

Browse files
authored
add dynamic.parameter function (fixes #699, via #565)
1 parent ef8d1f4 commit 6da2cab

File tree

8 files changed

+127
-7
lines changed

8 files changed

+127
-7
lines changed

allure-pytest/src/listener.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
from allure_commons.model2 import Parameter
1414
from allure_commons.model2 import Label, Link
1515
from allure_commons.model2 import Status
16-
from allure_commons.types import LabelType, AttachmentType
16+
from allure_commons.types import LabelType, AttachmentType, ParameterMode
1717
from allure_pytest.utils import allure_description, allure_description_html
1818
from allure_pytest.utils import allure_labels, allure_links, pytest_markers
1919
from allure_pytest.utils import allure_full_name, allure_package, allure_name
@@ -96,8 +96,10 @@ def pytest_runtest_setup(self, item):
9696
test_result.testCaseId = md5(full_name)
9797
test_result.description = allure_description(item)
9898
test_result.descriptionHtml = allure_description_html(item)
99+
current_param_names = [param.name for param in test_result.parameters]
99100
test_result.parameters.extend(
100-
[Parameter(name=name, value=represent(value)) for name, value in params.items()])
101+
[Parameter(name=name, value=represent(value)) for name, value in params.items()
102+
if name not in current_param_names])
101103

102104
@pytest.hookimpl(hookwrapper=True)
103105
def pytest_runtest_call(self, item):
@@ -266,6 +268,16 @@ def add_label(self, label_type, labels):
266268
for label in labels if test_result else ():
267269
test_result.labels.append(Label(label_type, label))
268270

271+
@allure_commons.hookimpl
272+
def add_parameter(self, name, value, excluded, mode: ParameterMode):
273+
test_result: TestResult = self.allure_logger.get_test(None)
274+
existing_param = next(filter(lambda x: x.name == name, test_result.parameters), None)
275+
if existing_param:
276+
existing_param.value = represent(value)
277+
else:
278+
test_result.parameters.append(Parameter(name=name, value=represent(value),
279+
excluded=excluded or None, mode=mode.value if mode else None))
280+
269281

270282
class ItemCache(object):
271283

allure-pytest/test/acceptance/parametrization/parametrization_test.py

Lines changed: 82 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import pytest
22
from hamcrest import assert_that
33
from allure_commons_test.report import has_test_case
4-
from allure_commons_test.result import has_parameter
4+
from allure_commons_test.result import has_parameter, with_excluded, with_mode
55

66

77
def params_name(request):
@@ -92,3 +92,84 @@ def test_parametrization_many_decorators_with_partial_ids(executed_docstring_sou
9292

9393
)
9494
)
95+
96+
97+
def test_dynamic_parameter_add(executed_docstring_source):
98+
"""
99+
>>> import allure
100+
101+
>>> def test_parameter_add():
102+
... allure.dynamic.parameter("param1", "param-value")
103+
"""
104+
assert_that(executed_docstring_source.allure_report,
105+
has_test_case("test_parameter_add",
106+
has_parameter("param1", "'param-value'")
107+
)
108+
)
109+
110+
111+
def test_dynamic_parameter_excluded(executed_docstring_source):
112+
"""
113+
>>> import allure
114+
115+
>>> def test_parameter_excluded():
116+
... allure.dynamic.parameter("param1", "param-value", excluded=True)
117+
"""
118+
assert_that(executed_docstring_source.allure_report,
119+
has_test_case("test_parameter_excluded",
120+
has_parameter("param1", "'param-value'",
121+
with_excluded())
122+
)
123+
)
124+
125+
126+
def test_dynamic_parameter_mode(executed_docstring_source):
127+
"""
128+
>>> import allure
129+
130+
>>> def test_parameter_mode():
131+
... allure.dynamic.parameter("param1", "param-value", mode=allure.parameter_mode.MASKED)
132+
"""
133+
assert_that(executed_docstring_source.allure_report,
134+
has_test_case("test_parameter_mode",
135+
has_parameter("param1", "'param-value'",
136+
with_mode('masked'))
137+
)
138+
)
139+
140+
141+
def test_dynamic_parameter_override(executed_docstring_source):
142+
"""
143+
>>> import pytest
144+
... import allure
145+
146+
>>> @pytest.mark.parametrize("param1", [object()], ids=["param-id"])
147+
... def test_parameter_override(param1):
148+
... allure.dynamic.parameter("param1", "readable-value")
149+
"""
150+
assert_that(executed_docstring_source.allure_report,
151+
has_test_case("test_parameter_override[param-id]",
152+
has_parameter("param1", "'readable-value'")
153+
)
154+
)
155+
156+
157+
def test_dynamic_parameter_override_from_fixture(executed_docstring_source):
158+
"""
159+
>>> import pytest
160+
... import allure
161+
162+
163+
>>> @pytest.fixture()
164+
... def fixt():
165+
... allure.dynamic.parameter("param1", "readable-value")
166+
167+
>>> @pytest.mark.parametrize("param1", [object()], ids=["param-id"])
168+
... def test_parameter_override_from_fixture(fixt, param1):
169+
... pass
170+
"""
171+
assert_that(executed_docstring_source.allure_report,
172+
has_test_case("test_parameter_override_from_fixture[param-id]",
173+
has_parameter("param1", "'readable-value'")
174+
)
175+
)

allure-python-commons-test/src/result.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,12 +90,13 @@ def has_step(name, *matchers):
9090
))
9191

9292

93-
def has_parameter(name, value):
93+
def has_parameter(name, value, *matchers):
9494
return has_entry('parameters',
9595
has_item(
9696
all_of(
9797
has_entry('name', equal_to(name)),
98-
has_entry('value', equal_to(value))
98+
has_entry('value', equal_to(value)),
99+
*matchers
99100
)
100101
))
101102

@@ -158,5 +159,13 @@ def with_trace_contains(string):
158159
return has_entry('trace', contains_string(string))
159160

160161

162+
def with_excluded():
163+
return has_entry('excluded', True)
164+
165+
166+
def with_mode(mode):
167+
return has_entry('mode', mode)
168+
169+
161170
def has_history_id():
162171
return has_entry('historyId', anything())

allure-python-commons/allure.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from allure_commons._allure import manual
1414
from allure_commons.types import Severity as severity_level
1515
from allure_commons.types import AttachmentType as attachment_type
16+
from allure_commons.types import ParameterMode as parameter_mode
1617

1718

1819
__all__ = [
@@ -32,10 +33,11 @@
3233
'link',
3334
'issue',
3435
'testcase',
36+
'manual',
3537
'step',
3638
'dynamic',
3739
'severity_level',
3840
'attach',
3941
'attachment_type',
40-
'manual'
42+
'parameter_mode'
4143
]

allure-python-commons/src/_allure.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from typing import Any, Callable, TypeVar
33

44
from allure_commons._core import plugin_manager
5-
from allure_commons.types import LabelType, LinkType
5+
from allure_commons.types import LabelType, LinkType, ParameterMode
66
from allure_commons.utils import uuid4
77
from allure_commons.utils import func_parameters, represent
88

@@ -132,6 +132,10 @@ def id(id):
132132
def link(url, link_type=LinkType.LINK, name=None):
133133
plugin_manager.hook.add_link(url=url, link_type=link_type, name=name)
134134

135+
@staticmethod
136+
def parameter(name, value, excluded=None, mode: ParameterMode = None):
137+
plugin_manager.hook.add_parameter(name=name, value=value, excluded=excluded, mode=mode)
138+
135139
@staticmethod
136140
def issue(url, name=None):
137141
Dynamic.link(url, link_type=LinkType.ISSUE, name=name)

allure-python-commons/src/_hooks.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,10 @@ def decorate_as_link(self, url, link_type, name):
4646
def add_link(self, url, link_type, name):
4747
""" url """
4848

49+
@hookspec
50+
def add_parameter(self, name, value, excluded, mode):
51+
""" parameter """
52+
4953
@hookspec
5054
def start_step(self, uuid, title, params):
5155
""" step """

allure-python-commons/src/model2.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,8 @@ class TestAfterResult(ExecutableItem):
7070
class Parameter(object):
7171
name = attrib(default=None)
7272
value = attrib(default=None)
73+
excluded = attrib(default=None)
74+
mode = attrib(default=None)
7375

7476

7577
@attrs

allure-python-commons/src/types.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,3 +63,9 @@ def __init__(self, mime_type, extension):
6363
WEBM = ("video/webm", "webm")
6464

6565
PDF = ("application/pdf", "pdf")
66+
67+
68+
class ParameterMode(Enum):
69+
HIDDEN = 'hidden'
70+
MASKED = 'masked'
71+
DEFAULT = None

0 commit comments

Comments
 (0)