Skip to content

Commit 0b9b453

Browse files
authored
support next model version (fixes #40 via #42)
* rename report files * delete PENDING status * fix tests * children ids and containers * pyflakes * bump version * fix tox.ini =)
1 parent b6cf8c4 commit 0b9b453

27 files changed

+415
-385
lines changed

allure-pytest/setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from setuptools import setup
33

44
PACKAGE = "pytest-allure-adaptor"
5-
VERSION = "2.0.1"
5+
VERSION = "2.0.3"
66

77
install_requires = [
88
"pytest>=2.7.3",

allure-pytest/src/allure/constants.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,7 @@ class Status(object):
99
FAILED = 'failed'
1010
BROKEN = 'broken'
1111
PASSED = 'passed'
12-
CANCELED = 'canceled'
13-
PENDING = 'pending'
12+
SKIPPED = 'skipped'
1413

1514

1615
class Severity(Enum):

allure-pytest/src/allure/listener.py

Lines changed: 35 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
from allure.utils import allure_parameters
77
from allure.utils import allure_labels, allure_links
88
from allure.utils import allure_full_name, allure_package
9-
from allure.model2 import TestStepResult, TestGroupResult, TestCaseResult
10-
from allure.model2 import ExecutableItem
9+
from allure.model2 import TestStepResult, TestResult, TestBeforeResult, TestAfterResult
10+
from allure.model2 import TestResultContainer
1111
from allure.model2 import StatusDetails
1212
from allure.model2 import Parameter
1313
from allure.model2 import Label, Link
@@ -32,33 +32,33 @@ def pytest_allure_after_step(self, uuid, exc_type, exc_val, exc_tb):
3232
status = Status.PASSED
3333
if exc_type is not None:
3434
if exc_type == pytest.skip.Exception:
35-
status = Status.CANCELED
35+
status = Status.SKIPPED
3636
else:
3737
status = Status.FAILED
3838

3939
self.allure_logger.stop_step(uuid, stop=now(), status=status)
4040

4141
@pytest.hookimpl
4242
def pytest_allure_before_finalizer(self, parent_uuid, uuid, name):
43-
self.allure_logger.start_after_fixture(parent_uuid, uuid, name=name)
43+
after_fixture = TestAfterResult(name=name, start=now())
44+
self.allure_logger.start_after_fixture(parent_uuid, uuid, after_fixture)
4445

4546
@pytest.hookimpl
4647
def pytest_allure_after_finalizer(self, uuid, exc_type, exc_val, exc_tb):
47-
self.allure_logger.stop_after_fixture(uuid)
48+
self.allure_logger.stop_after_fixture(uuid, stop=now())
4849

4950
@pytest.hookimpl(hookwrapper=True, tryfirst=True)
5051
def pytest_runtest_protocol(self, item, nextitem):
5152
uuid = self._cache.set(item.nodeid)
52-
parent_ids = []
5353
for fixturedef in _test_fixtures(item):
5454
group_uuid = self._cache.get(fixturedef)
55-
if not group_uuid and fixturedef.baseid:
55+
if not group_uuid:
5656
group_uuid = self._cache.set(fixturedef)
57-
group = TestGroupResult(id=group_uuid)
57+
group = TestResultContainer(id=group_uuid)
5858
self.allure_logger.start_group(group_uuid, group)
59-
parent_ids.append(group_uuid)
59+
self.allure_logger.update_group(group_uuid, children=uuid)
6060

61-
test_case = TestCaseResult(name=item.name, id=uuid, parentIds=parent_ids)
61+
test_case = TestResult(name=item.name, id=uuid)
6262
self.allure_logger.schedule_test(uuid, test_case)
6363

6464
yield
@@ -80,45 +80,47 @@ def pytest_runtest_call(self, item):
8080

8181
@pytest.hookimpl(hookwrapper=True)
8282
def pytest_fixture_setup(self, fixturedef, request):
83-
uuid = uuid4()
84-
node_id = request.node.nodeid
85-
parent_uuid = self._cache.get(node_id) if fixturedef.scope == 'function' else self._cache.get(fixturedef)
86-
parameters = allure_parameters(fixturedef, request)
83+
fixture_name = fixturedef.argname
84+
85+
container_uuid = self._cache.get(fixturedef)
86+
87+
if not container_uuid:
88+
container_uuid = self._cache.set(fixturedef)
89+
container = TestResultContainer(id=container_uuid)
90+
self.allure_logger.start_group(container_uuid, container)
8791

88-
# ToDo autouse fixtures
89-
if fixturedef.baseid and parent_uuid:
90-
fixture = ExecutableItem(start=now(), name=fixturedef.argname)
91-
self.allure_logger.start_before_fixture(parent_uuid, uuid, fixture)
92+
self.allure_logger.update_group(container_uuid, start=now())
9293

93-
if parameters and parent_uuid:
94+
before_fixture_uuid = uuid4
95+
before_fixture = TestBeforeResult(name=fixture_name, start=now())
96+
self.allure_logger.start_before_fixture(container_uuid, before_fixture_uuid, before_fixture)
97+
98+
parameters = allure_parameters(fixturedef, request)
99+
if parameters:
94100
test_uuid = self._cache.get(request._pyfuncitem.nodeid)
95101
parameters = Parameter(**parameters) if parameters else []
96102
self.allure_logger.update_test(test_uuid, parameters=parameters)
97103

98104
yield
99105

100-
# ToDo autouse fixtures
101-
if fixturedef.baseid and parent_uuid:
102-
self.allure_logger.stop_before_fixture(uuid, stop=now())
106+
self.allure_logger.stop_before_fixture(before_fixture_uuid, stop=now())
103107

104-
for index, finalizer in enumerate(fixturedef._finalizer or ()):
105-
fixturedef._finalizer[index] = FinalizerSpy(parent_uuid, fixturedef.argname, finalizer, self.config)
108+
for index, finalizer in enumerate(fixturedef._finalizer or ()):
109+
fixturedef._finalizer[index] = FinalizerSpy(container_uuid, fixturedef.argname, finalizer, self.config)
106110

107111
@pytest.hookimpl(hookwrapper=True)
108112
def pytest_fixture_post_finalizer(self, fixturedef):
109113
yield
110-
# ToDo autouse fixtures
111-
if hasattr(fixturedef, 'cached_result') and fixturedef.scope != 'function' and fixturedef.baseid \
112-
and self._cache.get(fixturedef):
113-
uuid = self._cache.pop(fixturedef)
114-
self.allure_logger.stop_group(uuid)
114+
if hasattr(fixturedef, 'cached_result') and self._cache.get(fixturedef):
115+
container_uuid = self._cache.pop(fixturedef)
116+
self.allure_logger.stop_group(container_uuid, stop=now())
115117

116118
@pytest.hookimpl(hookwrapper=True)
117119
def pytest_runtest_makereport(self, item, call):
118120
uuid = self._cache.set(item.nodeid)
119121
report = (yield).get_result()
120122
allure_item = self.allure_logger.get_item(uuid)
121-
status = allure_item.status or Status.PENDING
123+
status = allure_item.status or None
122124
status_details = None
123125

124126
if call.excinfo and hasattr(call.excinfo.value, 'msg'):
@@ -134,15 +136,15 @@ def pytest_runtest_makereport(self, item, call):
134136
if report.failed:
135137
status = Status.BROKEN
136138
if report.skipped:
137-
status = Status.CANCELED
139+
status = Status.SKIPPED
138140

139141
if report.when == 'call':
140142
if report.passed and status == Status.PASSED:
141143
pass
142144
if report.failed:
143145
status = Status.FAILED
144146
if report.skipped:
145-
status = Status.CANCELED
147+
status = Status.SKIPPED
146148

147149
if report.when == 'teardown':
148150
if report.failed and status == Status.PASSED:
@@ -208,7 +210,7 @@ def _test_fixtures(item):
208210
if hasattr(item, "fixturenames"):
209211
for name in item.fixturenames:
210212
fixturedef = fixturemanager.getfixturedefs(name, item.nodeid)
211-
if fixturedef and fixturedef[-1].scope != 'function':
213+
if fixturedef:
212214
fixturedefs.append(fixturedef[-1])
213215

214216
return fixturedefs

allure-pytest/src/allure/logger.py

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,14 @@ def get_item(self, uuid):
2929
def start_group(self, uuid, group):
3030
self._items[uuid] = group
3131

32-
def stop_group(self, uuid):
32+
def stop_group(self, uuid, **kwargs):
33+
self._update_item(uuid, **kwargs)
3334
group = self._items.pop(uuid)
3435
group.write(self._report_dir)
3536

37+
def update_group(self, uuid, **kwargs):
38+
self._update_item(uuid, **kwargs)
39+
3640
def start_before_fixture(self, parent_uuid, uuid, fixture):
3741
self._items.get(parent_uuid).befores.append(fixture)
3842
self._items[uuid] = fixture
@@ -41,12 +45,12 @@ def stop_before_fixture(self, uuid, **kwargs):
4145
self._update_item(uuid, **kwargs)
4246
self._items.pop(uuid)
4347

44-
def start_after_fixture(self, parent_uuid, uuid, **kwargs):
45-
fixture = ExecutableItem(start=now(), **kwargs)
48+
def start_after_fixture(self, parent_uuid, uuid, fixture):
4649
self._items.get(parent_uuid).afters.append(fixture)
4750
self._items[uuid] = fixture
4851

49-
def stop_after_fixture(self, uuid):
52+
def stop_after_fixture(self, uuid, **kwargs):
53+
self._update_item(uuid, **kwargs)
5054
fixture = self._items.pop(uuid)
5155
fixture.stop = now()
5256

@@ -61,8 +65,13 @@ def close_test(self, uuid):
6165
test_case.write(self._report_dir)
6266

6367
def start_step(self, uuid, step):
64-
last_uuid = next(reversed(self._items))
65-
self._items[last_uuid].steps.append(step)
68+
parent_uuid = None
69+
for _uuid in reversed(self._items):
70+
if isinstance(self._items[_uuid], ExecutableItem):
71+
parent_uuid = _uuid
72+
break
73+
if parent_uuid:
74+
self._items[parent_uuid].steps.append(step)
6675
self._items[uuid] = step
6776

6877
def stop_step(self, uuid, **kwargs):

allure-pytest/src/allure/model2.py

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
import uuid
77

88

9-
TEST_GROUP_PATTERN = "{prefix}-testgroup.json"
10-
TEST_CASE_PATTERN = "{prefix}-testcase.json"
9+
TEST_GROUP_PATTERN = "{prefix}-container.json"
10+
TEST_CASE_PATTERN = "{prefix}-result.json"
1111
ATTACHMENT_PATTERN = '{prefix}-attachment.{ext}'
1212
INDENT = 4
1313

@@ -24,11 +24,10 @@ def _write(report_dir, item, glob):
2424

2525

2626
@attrs
27-
class TestGroupResult(object):
27+
class TestResultContainer(object):
2828
id = attrib(default=None)
29-
parentIds = attrib(default=Factory(list))
30-
type = attrib(default=None)
3129
name = attrib(default=None)
30+
children = attrib(default=Factory(list))
3231
description = attrib(default=None)
3332
descriptionHtml = attrib(default=None)
3433
befores = attrib(default=Factory(list))
@@ -44,24 +43,22 @@ def write(self, report_dir):
4443
@attrs
4544
class ExecutableItem(object):
4645
name = attrib(default=None)
46+
status = attrib(default=None)
47+
statusDetails = attrib(default=None)
48+
stage = attrib(default=None)
4749
description = attrib(default=None)
4850
descriptionHtml = attrib(default=None)
4951
steps = attrib(default=Factory(list))
5052
attachments = attrib(default=Factory(list))
53+
parameters = attrib(default=Factory(list))
5154
start = attrib(default=None)
5255
stop = attrib(default=None)
5356

5457

5558
@attrs
56-
class TestCaseResult(ExecutableItem):
59+
class TestResult(ExecutableItem):
5760
id = attrib(default=None)
5861
fullName = attrib(default=None)
59-
parentIds = attrib(default=Factory(list))
60-
status = attrib(default=None)
61-
statusDetails = attrib(default=None)
62-
parameters = attrib(default=Factory(list))
63-
befores = attrib(default=Factory(list))
64-
afters = attrib(default=Factory(list))
6562
labels = attrib(default=Factory(list))
6663
links = attrib(default=Factory(list))
6764

@@ -72,9 +69,16 @@ def write(self, report_dir):
7269
@attrs
7370
class TestStepResult(ExecutableItem):
7471
id = attrib(default=None)
75-
status = attrib(default=None)
76-
parameters = attrib(default=Factory(list))
77-
statusDetails = attrib(default=None)
72+
73+
74+
@attrs
75+
class TestBeforeResult(ExecutableItem):
76+
pass
77+
78+
79+
@attrs
80+
class TestAfterResult(ExecutableItem):
81+
pass
7882

7983

8084
@attrs
@@ -98,6 +102,8 @@ class Link(object):
98102

99103
@attrs
100104
class StatusDetails(object):
105+
known = attrib(default=None)
106+
flaky = attrib(default=None)
101107
message = attrib(default=None)
102108
trace = attrib(default=None)
103109

0 commit comments

Comments
 (0)