Skip to content

Commit ed38912

Browse files
author
Artem Ryabkov
authored
added @allure.title annotation support for fixtures (fixes #210 via #527)
1 parent 23da5fd commit ed38912

File tree

7 files changed

+138
-17
lines changed

7 files changed

+138
-17
lines changed

allure-pytest/__init__.py

Whitespace-only changes.

allure-pytest/src/helper.py

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,29 @@
33

44
import pytest
55
import allure_commons
6-
from allure_pytest.utils import ALLURE_DISPLAY_NAME_MARK
76
from allure_pytest.utils import ALLURE_DESCRIPTION_MARK, ALLURE_DESCRIPTION_HTML_MARK
87
from allure_pytest.utils import ALLURE_LABEL_MARK, ALLURE_LINK_MARK
98

109

11-
class AllureTestHelper(object):
10+
class AllureTitleHelper(object):
11+
@allure_commons.hookimpl
12+
def decorate_as_title(self, test_title):
13+
def decorator(func):
14+
# pytest.fixture wraps function, so we need to get it directly
15+
if getattr(func, '__pytest_wrapped__', None):
16+
function = func.__pytest_wrapped__.obj
17+
else:
18+
function = func
19+
function.__allure_display_name__ = test_title
20+
return func
21+
22+
return decorator
23+
1224

25+
class AllureTestHelper(object):
1326
def __init__(self, config):
1427
self.config = config
1528

16-
@allure_commons.hookimpl
17-
def decorate_as_title(self, test_title):
18-
allure_title = getattr(pytest.mark, ALLURE_DISPLAY_NAME_MARK)
19-
return allure_title(test_title)
20-
2129
@allure_commons.hookimpl
2230
def decorate_as_description(self, test_description):
2331
allure_description = getattr(pytest.mark, ALLURE_DESCRIPTION_MARK)

allure-pytest/src/listener.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ def pytest_runtest_teardown(self, item):
122122

123123
@pytest.hookimpl(hookwrapper=True)
124124
def pytest_fixture_setup(self, fixturedef, request):
125-
fixture_name = fixturedef.argname
125+
fixture_name = getattr(fixturedef.func, '__allure_display_name__', fixturedef.argname)
126126

127127
container_uuid = self._cache.get(fixturedef)
128128

@@ -146,7 +146,7 @@ def pytest_fixture_setup(self, fixturedef, request):
146146

147147
finalizers = getattr(fixturedef, '_finalizers', [])
148148
for index, finalizer in enumerate(finalizers):
149-
name = '{fixture}::{finalizer}'.format(fixture=fixturedef.argname,
149+
name = '{fixture}::{finalizer}'.format(fixture=fixture_name,
150150
finalizer=getattr(finalizer, "__name__", index))
151151
finalizers[index] = allure_commons.fixture(finalizer, parent_uuid=container_uuid, name=name)
152152

@@ -177,8 +177,8 @@ def pytest_runtest_makereport(self, item, call):
177177
message=message,
178178
trace=trace)
179179
if (status != Status.SKIPPED
180-
and not (call.excinfo.errisinstance(AssertionError)
181-
or call.excinfo.errisinstance(pytest.fail.Exception))):
180+
and not (call.excinfo.errisinstance(AssertionError)
181+
or call.excinfo.errisinstance(pytest.fail.Exception))):
182182
status = Status.BROKEN
183183

184184
if status == Status.PASSED and hasattr(report, 'wasxfail'):

allure-pytest/src/plugin.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,9 @@
99
from allure_commons.utils import get_testplan
1010

1111
from allure_pytest.utils import allure_label, allure_labels, allure_full_name
12-
from allure_pytest.helper import AllureTestHelper
12+
from allure_pytest.helper import AllureTestHelper, AllureTitleHelper
1313
from allure_pytest.listener import AllureListener
1414

15-
from allure_pytest.utils import ALLURE_DISPLAY_NAME_MARK
1615
from allure_pytest.utils import ALLURE_DESCRIPTION_MARK, ALLURE_DESCRIPTION_HTML_MARK
1716
from allure_pytest.utils import ALLURE_LABEL_MARK, ALLURE_LINK_MARK
1817

@@ -111,12 +110,17 @@ def clean_up():
111110
return clean_up
112111

113112

113+
def pytest_addhooks(pluginmanager):
114+
# Need register title hooks before conftest init
115+
title_helper = AllureTitleHelper()
116+
allure_commons.plugin_manager.register(title_helper)
117+
118+
114119
def pytest_configure(config):
115120
report_dir = config.option.allure_report_dir
116121
clean = config.option.clean_alluredir
117122

118123
test_helper = AllureTestHelper(config)
119-
# TODO: Why helper is present anyway?
120124
allure_commons.plugin_manager.register(test_helper)
121125
config.add_cleanup(cleanup_factory(test_helper))
122126

@@ -133,7 +137,6 @@ def pytest_configure(config):
133137

134138
config.addinivalue_line("markers", "{mark}: allure label marker".format(mark=ALLURE_LABEL_MARK))
135139
config.addinivalue_line("markers", "{mark}: allure link marker".format(mark=ALLURE_LINK_MARK))
136-
config.addinivalue_line("markers", "{mark}: allure test name marker".format(mark=ALLURE_DISPLAY_NAME_MARK))
137140
config.addinivalue_line("markers", "{mark}: allure description".format(mark=ALLURE_DESCRIPTION_MARK))
138141
config.addinivalue_line("markers", "{mark}: allure description html".format(mark=ALLURE_DESCRIPTION_HTML_MARK))
139142

allure-pytest/src/utils.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
from allure_commons.types import LabelType
1212

1313

14-
ALLURE_DISPLAY_NAME_MARK = 'allure_display_name'
1514
ALLURE_DESCRIPTION_MARK = 'allure_description'
1615
ALLURE_DESCRIPTION_HTML_MARK = 'allure_description_html'
1716
ALLURE_LABEL_MARK = 'allure_label'
@@ -32,7 +31,7 @@ def get_marker_value(item, keyword):
3231

3332

3433
def allure_title(item):
35-
return get_marker_value(item, ALLURE_DISPLAY_NAME_MARK)
34+
return getattr(item._obj, '__allure_display_name__', None)
3635

3736

3837
def allure_description(item):

allure-pytest/test/acceptance/display_name/display_name_test.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from hamcrest import assert_that
55
from allure_commons_test.report import has_test_case
66
from allure_commons_test.result import has_title
7+
from allure_commons_test.label import has_label
78

89

910
def test_display_name(executed_docstring_path):
@@ -73,3 +74,26 @@ def test_fixture_value_in_display_name(executed_docstring_source):
7374
has_title("title with fixture value")
7475
)
7576
)
77+
78+
79+
def test_display_name_with_features(allured_testdir):
80+
allured_testdir.testdir.makepyfile("""
81+
import allure
82+
import pytest
83+
84+
@allure.feature('Feature 1')
85+
@allure.title('Titled test with features')
86+
@allure.feature('Feature 2')
87+
def test_feature_label_for_titled_test():
88+
pass
89+
""")
90+
91+
allured_testdir.run_with_allure()
92+
93+
assert_that(allured_testdir.allure_report,
94+
has_test_case("test_feature_label_for_titled_test",
95+
has_label("feature", "Feature 1"),
96+
has_label("feature", "Feature 2"),
97+
has_title("Titled test with features")
98+
)
99+
)

allure-pytest/test/acceptance/fixture/fixture_test.py

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,3 +130,90 @@ def test_nested_fixtures(executed_docstring_source):
130130
)
131131
)
132132
)
133+
134+
135+
@allure.feature("Fixture")
136+
def test_fixture_allure_title(allured_testdir):
137+
allured_testdir.testdir.makepyfile("""
138+
import pytest
139+
import allure
140+
141+
@pytest.fixture
142+
@allure.title("Allure fixture title")
143+
def first_fixture():
144+
pass
145+
146+
def test_titled_fixture_example(first_fixture):
147+
pass
148+
""")
149+
150+
allured_testdir.run_with_allure()
151+
152+
assert_that(allured_testdir.allure_report,
153+
has_test_case("test_titled_fixture_example",
154+
has_container(allured_testdir.allure_report,
155+
has_before("Allure fixture title")
156+
)
157+
)
158+
)
159+
160+
161+
@allure.feature("Fixture")
162+
def test_fixture_allure_title_before(allured_testdir):
163+
allured_testdir.testdir.makepyfile("""
164+
import pytest
165+
import allure
166+
167+
@allure.title("Allure fixture title")
168+
@pytest.fixture
169+
def first_fixture():
170+
pass
171+
172+
def test_titled_before_fixture_example(first_fixture):
173+
pass
174+
""")
175+
176+
allured_testdir.run_with_allure()
177+
178+
assert_that(allured_testdir.allure_report,
179+
has_test_case("test_titled_before_fixture_example",
180+
has_container(allured_testdir.allure_report,
181+
has_before("Allure fixture title")
182+
)
183+
)
184+
)
185+
186+
187+
def test_titled_fixture_from_conftest(allured_testdir):
188+
allured_testdir.testdir.makeconftest("""
189+
import allure
190+
import pytest
191+
192+
@allure.title('Titled fixture before pytest.fixture')
193+
@pytest.fixture
194+
def first_fixture():
195+
pass
196+
197+
@pytest.fixture
198+
@allure.title('Titled fixture after pytest.fixture')
199+
def second_fixture():
200+
pass
201+
""")
202+
203+
allured_testdir.testdir.makepyfile("""
204+
def test_with_titled_conftest_fixtures(first_fixture, second_fixture):
205+
pass
206+
""")
207+
208+
allured_testdir.run_with_allure()
209+
210+
assert_that(allured_testdir.allure_report,
211+
has_test_case("test_with_titled_conftest_fixtures",
212+
has_container(allured_testdir.allure_report,
213+
has_before("Titled fixture before pytest.fixture")
214+
),
215+
has_container(allured_testdir.allure_report,
216+
has_before("Titled fixture after pytest.fixture")
217+
)
218+
)
219+
)

0 commit comments

Comments
 (0)