Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit aa7a29a

Browse files
authored
Merge pull request allure-framework#637 from ShurikMen/master
Fix missing dynamic called fixtures in reports
2 parents a7a8aa1 + b186b93 commit aa7a29a

File tree

2 files changed

+116
-10
lines changed

2 files changed

+116
-10
lines changed

allure-pytest/src/listener.py

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,19 @@ def stop_fixture(self, parent_uuid, uuid, name, exc_type, exc_val, exc_tb):
5858
status=get_status(exc_val),
5959
statusDetails=get_status_details(exc_type, exc_val, exc_tb))
6060

61+
def _update_fixtures_children(self, item):
62+
uuid = self._cache.get(item.nodeid)
63+
for fixturedef in _test_fixtures(item):
64+
group_uuid = self._cache.get(fixturedef)
65+
if group_uuid:
66+
group = self.allure_logger.get_item(group_uuid)
67+
else:
68+
group_uuid = self._cache.push(fixturedef)
69+
group = TestResultContainer(uuid=group_uuid)
70+
self.allure_logger.start_group(group_uuid, group)
71+
if uuid not in group.children:
72+
self.allure_logger.update_group(group_uuid, children=uuid)
73+
6174
@pytest.hookimpl(hookwrapper=True, tryfirst=True)
6275
def pytest_runtest_protocol(self, item, nextitem):
6376
uuid = self._cache.push(item.nodeid)
@@ -71,20 +84,11 @@ def pytest_runtest_setup(self, item):
7184
uuid = self._cache.push(item.nodeid)
7285
test_result = TestResult(name=item.name, uuid=uuid, start=now(), stop=now())
7386
self.allure_logger.schedule_test(uuid, test_result)
74-
7587
yield
76-
88+
self._update_fixtures_children(item)
7789
uuid = self._cache.get(item.nodeid)
7890
test_result = self.allure_logger.get_test(uuid)
79-
for fixturedef in _test_fixtures(item):
80-
group_uuid = self._cache.get(fixturedef)
81-
if not group_uuid:
82-
group_uuid = self._cache.push(fixturedef)
83-
group = TestResultContainer(uuid=group_uuid)
84-
self.allure_logger.start_group(group_uuid, group)
85-
self.allure_logger.update_group(group_uuid, children=uuid)
8691
params = item.callspec.params if hasattr(item, 'callspec') else {}
87-
8892
test_result.name = allure_name(item, params)
8993
full_name = allure_full_name(item)
9094
test_result.fullName = full_name
@@ -104,12 +108,14 @@ def pytest_runtest_call(self, item):
104108
self.allure_logger.schedule_test(uuid, test_result)
105109
test_result.start = now()
106110
yield
111+
self._update_fixtures_children(item)
107112
if test_result:
108113
test_result.stop = now()
109114

110115
@pytest.hookimpl(hookwrapper=True)
111116
def pytest_runtest_teardown(self, item):
112117
yield
118+
self._update_fixtures_children(item)
113119
uuid = self._cache.get(item.nodeid)
114120
test_result = self.allure_logger.get_test(uuid)
115121
test_result.labels.extend([Label(name=name, value=value) for name, value in allure_labels(item)])

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

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,3 +272,103 @@ def test_with_redefined_fixture(my_fixture):
272272
),
273273
)
274274
)
275+
276+
277+
@pytest.mark.parametrize(
278+
["parent_scope", "child_scope"],
279+
list(combinations_with_replacement(fixture_scopes, 2))
280+
)
281+
def test_dynamically_called_fixture(allured_testdir, parent_scope, child_scope):
282+
allured_testdir.testdir.makepyfile("""
283+
import pytest
284+
285+
@pytest.fixture(scope="{parent_scope}", autouse=True)
286+
def parent_auto_call_fixture():
287+
yield
288+
289+
@pytest.fixture(scope="{child_scope}")
290+
def child_manual_call_fixture():
291+
yield
292+
293+
@pytest.fixture(scope="{parent_scope}")
294+
def parent_dyn_call_fixture():
295+
yield
296+
297+
@pytest.fixture(scope="{child_scope}")
298+
def child_dyn_call_fixture(request):
299+
request.getfixturevalue('parent_dyn_call_fixture')
300+
301+
def test_one(child_manual_call_fixture):
302+
pass
303+
304+
def test_two(request):
305+
request.getfixturevalue('child_dyn_call_fixture')
306+
307+
def test_three(request):
308+
request.getfixturevalue('parent_dyn_call_fixture')
309+
""".format(parent_scope=parent_scope, child_scope=child_scope))
310+
311+
allured_testdir.run_with_allure()
312+
313+
assert_that(allured_testdir.allure_report,
314+
has_test_case("test_one",
315+
has_container(allured_testdir.allure_report,
316+
has_before("parent_auto_call_fixture"),
317+
has_after("parent_auto_call_fixture::0"),
318+
),
319+
has_container(allured_testdir.allure_report,
320+
has_before("child_manual_call_fixture"),
321+
has_after("child_manual_call_fixture::0"),
322+
),
323+
not_(has_container(allured_testdir.allure_report,
324+
has_before("parent_dyn_call_fixture"),
325+
has_after("parent_dyn_call_fixture::0"),
326+
),
327+
),
328+
not_(has_container(allured_testdir.allure_report,
329+
has_before("child_dyn_call_fixture"),
330+
),
331+
)
332+
)
333+
)
334+
assert_that(allured_testdir.allure_report,
335+
has_test_case("test_two",
336+
has_container(allured_testdir.allure_report,
337+
has_before("parent_auto_call_fixture"),
338+
has_after("parent_auto_call_fixture::0"),
339+
),
340+
not_(has_container(allured_testdir.allure_report,
341+
has_before("child_manual_call_fixture"),
342+
has_after("child_manual_call_fixture::0"),
343+
),
344+
),
345+
has_container(allured_testdir.allure_report,
346+
has_before("parent_dyn_call_fixture"),
347+
has_after("parent_dyn_call_fixture::0"),
348+
),
349+
has_container(allured_testdir.allure_report,
350+
has_before("child_dyn_call_fixture"),
351+
),
352+
),
353+
)
354+
assert_that(allured_testdir.allure_report,
355+
has_test_case("test_three",
356+
has_container(allured_testdir.allure_report,
357+
has_before("parent_auto_call_fixture"),
358+
has_after("parent_auto_call_fixture::0"),
359+
),
360+
not_(has_container(allured_testdir.allure_report,
361+
has_before("child_manual_call_fixture"),
362+
has_after("child_manual_call_fixture::0"),
363+
),
364+
),
365+
has_container(allured_testdir.allure_report,
366+
has_before("parent_dyn_call_fixture"),
367+
has_after("parent_dyn_call_fixture::0"),
368+
),
369+
not_(has_container(allured_testdir.allure_report,
370+
has_before("child_dyn_call_fixture"),
371+
),
372+
)
373+
)
374+
)

0 commit comments

Comments
 (0)