2323from allure_behave .utils import scenario_labels
2424from allure_behave .utils import get_fullname
2525from allure_behave .utils import TEST_PLAN_SKIP_REASON
26-
27-
28- BEFORE_FIXTURES = ['before_all' , 'before_tag' , 'before_feature' , 'before_scenario' ]
29- AFTER_FIXTURES = ['after_all' , 'after_tag' , 'after_feature' , 'after_scenario' ]
30- FIXTURES = BEFORE_FIXTURES + AFTER_FIXTURES
26+ from allure_behave .utils import get_hook_name
3127
3228
3329class AllureListener (object ):
@@ -39,62 +35,46 @@ def __init__(self, behave_config):
3935 self .logger = AllureReporter ()
4036 self .current_step_uuid = None
4137 self .current_scenario_uuid = None
42- self .execution_context = Context ( )
43- self .fixture_context = Context ()
38+ self .group_context = GroupContext ( self . logger )
39+ self .group_context . enter ()
4440 self .steps = deque ()
4541
46- def __del__ (self ):
47- for group in self .fixture_context .exit ():
48- group .children .extend (self .execution_context )
49- self .logger .stop_group (group .uuid )
42+ def start_file (self ):
43+ self .group_context .enter ()
5044
5145 @allure_commons .hookimpl
5246 def start_fixture (self , parent_uuid , uuid , name , parameters ):
53- parameters = [Parameter (name = param_name , value = param_value ) for param_name , param_value in parameters .items ()]
54-
55- if name in FIXTURES and not self .fixture_context :
56- group = TestResultContainer (uuid = uuid4 ())
57- self .logger .start_group (group .uuid , group )
58- self .fixture_context .append (group )
47+ # parameters = [Parameter(name=param_name, value=param_value) for param_name, param_value in parameters.items()]
5948
60- if name in BEFORE_FIXTURES :
61- fixture = TestBeforeResult (name = name , start = now (), parameters = parameters )
62- for group in self .fixture_context :
63- self .logger .start_before_fixture (group .uuid , uuid , fixture )
49+ if name .startswith ("before_" ):
50+ name = get_hook_name (name , parameters )
51+ fixture = TestBeforeResult (name = name , start = now (), parameters = None )
52+ group = self .group_context .current_group ()
53+ self .logger .start_before_fixture (group .uuid , uuid , fixture )
6454
65- elif name in AFTER_FIXTURES :
66- fixture = TestAfterResult (name = name , start = now (), parameters = parameters )
67- for group in self .fixture_context :
68- self .logger .start_after_fixture (group .uuid , uuid , fixture )
55+ elif name .startswith ("after_" ):
56+ name = get_hook_name (name , parameters )
57+ fixture = TestAfterResult (name = name , start = now (), parameters = None )
58+ group = self .group_context .current_group ()
59+ self .logger .start_after_fixture (group .uuid , uuid , fixture )
6960
7061 @allure_commons .hookimpl
7162 def stop_fixture (self , parent_uuid , uuid , name , exc_type , exc_val , exc_tb ):
72- if name in FIXTURES :
73- self .logger .stop_before_fixture (uuid = uuid ,
74- stop = now (),
75- status = get_status (exc_val ),
76- statusDetails = get_status_details (exc_type , exc_val , exc_tb ))
77-
78- def start_feature (self ):
79- self .execution_context .enter ()
80- self .fixture_context .enter ()
63+ self .logger .stop_before_fixture (uuid = uuid ,
64+ stop = now (),
65+ status = get_status (exc_val ),
66+ statusDetails = get_status_details (exc_type , exc_val , exc_tb ))
8167
8268 def stop_feature (self ):
83- uuids = self .execution_context .exit ()
84- for group in self .fixture_context .exit ():
85- group .children .extend (uuids )
86- self .logger .stop_group (group .uuid )
87- self .execution_context .extend (uuids )
69+ self .group_context .exit ()
8870
8971 @allure_commons .hookimpl
9072 def start_test (self , parent_uuid , uuid , name , parameters , context ):
9173 self .start_scenario (context ['scenario' ])
9274
9375 def start_scenario (self , scenario ):
9476 self .current_scenario_uuid = uuid4 ()
95- self .fixture_context .enter ()
96- self .execution_context .enter ()
97- self .execution_context .append (self .current_scenario_uuid )
77+ self .group_context .enter ()
9878
9979 test_case = TestResult (uuid = self .current_scenario_uuid , start = now ())
10080 test_case .name = scenario_name (scenario )
@@ -137,13 +117,9 @@ def stop_scenario(self, scenario):
137117 test_result .statusDetails = status_details
138118 self .logger .close_test (self .current_scenario_uuid )
139119 self .current_step_uuid = None
120+ self .group_context .append_test (self .current_scenario_uuid )
121+ self .group_context .exit ()
140122
141- for group in self .fixture_context .exit ():
142- group .children .append (self .current_scenario_uuid )
143- self .logger .stop_group (group .uuid )
144-
145- self .execution_context .exit ()
146- self .execution_context .append (self .current_scenario_uuid )
147123 self .current_scenario_uuid = None
148124
149125 def schedule_step (self , step ):
@@ -229,17 +205,30 @@ def add_link(self, url, link_type, name):
229205
230206 test_result .links .append (new_link )
231207
208+ def stop_session (self ):
209+ self .group_context .exit ()
232210
233- class Context (list ):
234- def __init__ (self , _list = list ()):
235- super (Context , self ).__init__ (_list )
236- self ._stack = [_list ]
237211
238- def enter (self , _list = list ()):
239- self ._stack .append (self [:])
240- self [:] = _list
241- return self
212+ class GroupContext (object ):
213+ def __init__ (self , logger ):
214+ self ._logger = logger
215+ self ._groups = []
216+
217+ def enter (self ):
218+ group = TestResultContainer (uuid = uuid4 ())
219+ self ._logger .start_group (group .uuid , group )
220+ self ._groups .append (group )
242221
243222 def exit (self ):
244- gone , self [:] = self [:], self ._stack .pop ()
245- return gone
223+ group = self ._groups .pop ()
224+ if group .befores or group .afters :
225+ self ._logger .stop_group (group .uuid )
226+ else :
227+ self ._logger ._items .pop (group .uuid )
228+
229+ def current_group (self ):
230+ return self ._groups [- 1 ]
231+
232+ def append_test (self , uuid ):
233+ for group in self ._groups :
234+ group .children .append (uuid )
0 commit comments