66from allure .utils import allure_parameters
77from allure .utils import allure_labels , allure_links
88from 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
1111from allure .model2 import StatusDetails
1212from allure .model2 import Parameter
1313from 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
0 commit comments