@@ -166,10 +166,18 @@ def _handleClassSetUp(self, test, result):
166166 raise
167167 currentClass ._classSetupFailed = True
168168 className = util .strclass (currentClass )
169- errorName = 'setUpClass (%s)' % className
170- self ._addClassOrModuleLevelException (result , e , errorName )
169+ self ._createClassOrModuleLevelException (result , e ,
170+ 'setUpClass' ,
171+ className )
171172 finally :
172173 _call_if_exists (result , '_restoreStdout' )
174+ if currentClass ._classSetupFailed is True :
175+ currentClass .doClassCleanups ()
176+ if len (currentClass .tearDown_exceptions ) > 0 :
177+ for exc in currentClass .tearDown_exceptions :
178+ self ._createClassOrModuleLevelException (
179+ result , exc [1 ], 'setUpClass' , className ,
180+ info = exc )
173181
174182 def _get_previous_module (self , result ):
175183 previousModule = None
@@ -199,21 +207,37 @@ def _handleModuleFixture(self, test, result):
199207 try :
200208 setUpModule ()
201209 except Exception as e :
210+ try :
211+ case .doModuleCleanups ()
212+ except Exception as exc :
213+ self ._createClassOrModuleLevelException (result , exc ,
214+ 'setUpModule' ,
215+ currentModule )
202216 if isinstance (result , _DebugResult ):
203217 raise
204218 result ._moduleSetUpFailed = True
205- errorName = 'setUpModule (%s)' % currentModule
206- self ._addClassOrModuleLevelException (result , e , errorName )
219+ self ._createClassOrModuleLevelException (result , e ,
220+ 'setUpModule' ,
221+ currentModule )
207222 finally :
208223 _call_if_exists (result , '_restoreStdout' )
209224
210- def _addClassOrModuleLevelException (self , result , exception , errorName ):
225+ def _createClassOrModuleLevelException (self , result , exc , method_name ,
226+ parent , info = None ):
227+ errorName = f'{ method_name } ({ parent } )'
228+ self ._addClassOrModuleLevelException (result , exc , errorName , info )
229+
230+ def _addClassOrModuleLevelException (self , result , exception , errorName ,
231+ info = None ):
211232 error = _ErrorHolder (errorName )
212233 addSkip = getattr (result , 'addSkip' , None )
213234 if addSkip is not None and isinstance (exception , case .SkipTest ):
214235 addSkip (error , str (exception ))
215236 else :
216- result .addError (error , sys .exc_info ())
237+ if not info :
238+ result .addError (error , sys .exc_info ())
239+ else :
240+ result .addError (error , info )
217241
218242 def _handleModuleTearDown (self , result ):
219243 previousModule = self ._get_previous_module (result )
@@ -235,10 +259,17 @@ def _handleModuleTearDown(self, result):
235259 except Exception as e :
236260 if isinstance (result , _DebugResult ):
237261 raise
238- errorName = 'tearDownModule (%s)' % previousModule
239- self ._addClassOrModuleLevelException (result , e , errorName )
262+ self ._createClassOrModuleLevelException (result , e ,
263+ 'tearDownModule' ,
264+ previousModule )
240265 finally :
241266 _call_if_exists (result , '_restoreStdout' )
267+ try :
268+ case .doModuleCleanups ()
269+ except Exception as e :
270+ self ._createClassOrModuleLevelException (result , e ,
271+ 'tearDownModule' ,
272+ previousModule )
242273
243274 def _tearDownPreviousClass (self , test , result ):
244275 previousClass = getattr (result , '_previousTestClass' , None )
@@ -261,10 +292,19 @@ def _tearDownPreviousClass(self, test, result):
261292 if isinstance (result , _DebugResult ):
262293 raise
263294 className = util .strclass (previousClass )
264- errorName = 'tearDownClass (%s)' % className
265- self ._addClassOrModuleLevelException (result , e , errorName )
295+ self ._createClassOrModuleLevelException (result , e ,
296+ 'tearDownClass' ,
297+ className )
266298 finally :
267299 _call_if_exists (result , '_restoreStdout' )
300+ previousClass .doClassCleanups ()
301+ if len (previousClass .tearDown_exceptions ) > 0 :
302+ for exc in previousClass .tearDown_exceptions :
303+ className = util .strclass (previousClass )
304+ self ._createClassOrModuleLevelException (result , exc [1 ],
305+ 'tearDownClass' ,
306+ className ,
307+ info = exc )
268308
269309
270310class _ErrorHolder (object ):
0 commit comments