@@ -149,6 +149,7 @@ def _handleClassSetUp(self, test, result):
149
149
if getattr (currentClass , "__unittest_skip__" , False ):
150
150
return
151
151
152
+ failed = False
152
153
try :
153
154
currentClass ._classSetupFailed = False
154
155
except TypeError :
@@ -157,27 +158,32 @@ def _handleClassSetUp(self, test, result):
157
158
pass
158
159
159
160
setUpClass = getattr (currentClass , 'setUpClass' , None )
161
+ doClassCleanups = getattr (currentClass , 'doClassCleanups' , None )
160
162
if setUpClass is not None :
161
163
_call_if_exists (result , '_setupStdout' )
162
164
try :
163
- setUpClass ()
164
- except Exception as e :
165
- if isinstance (result , _DebugResult ):
166
- raise
167
- currentClass ._classSetupFailed = True
168
- className = util .strclass (currentClass )
169
- self ._createClassOrModuleLevelException (result , e ,
170
- 'setUpClass' ,
171
- className )
165
+ try :
166
+ setUpClass ()
167
+ except Exception as e :
168
+ if isinstance (result , _DebugResult ):
169
+ raise
170
+ failed = True
171
+ try :
172
+ currentClass ._classSetupFailed = True
173
+ except TypeError :
174
+ pass
175
+ className = util .strclass (currentClass )
176
+ self ._createClassOrModuleLevelException (result , e ,
177
+ 'setUpClass' ,
178
+ className )
179
+ if failed and doClassCleanups is not None :
180
+ doClassCleanups ()
181
+ for exc_info in currentClass .tearDown_exceptions :
182
+ self ._createClassOrModuleLevelException (
183
+ result , exc_info [1 ], 'setUpClass' , className ,
184
+ info = exc_info )
172
185
finally :
173
186
_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 )
181
187
182
188
def _get_previous_module (self , result ):
183
189
previousModule = None
@@ -205,20 +211,22 @@ def _handleModuleFixture(self, test, result):
205
211
if setUpModule is not None :
206
212
_call_if_exists (result , '_setupStdout' )
207
213
try :
208
- setUpModule ()
209
- except Exception as e :
210
214
try :
211
- case .doModuleCleanups ()
212
- except Exception as exc :
213
- self ._createClassOrModuleLevelException (result , exc ,
215
+ setUpModule ()
216
+ except Exception as e :
217
+ if isinstance (result , _DebugResult ):
218
+ raise
219
+ result ._moduleSetUpFailed = True
220
+ self ._createClassOrModuleLevelException (result , e ,
214
221
'setUpModule' ,
215
222
currentModule )
216
- if isinstance (result , _DebugResult ):
217
- raise
218
- result ._moduleSetUpFailed = True
219
- self ._createClassOrModuleLevelException (result , e ,
220
- 'setUpModule' ,
221
- currentModule )
223
+ if result ._moduleSetUpFailed :
224
+ try :
225
+ case .doModuleCleanups ()
226
+ except Exception as e :
227
+ self ._createClassOrModuleLevelException (result , e ,
228
+ 'setUpModule' ,
229
+ currentModule )
222
230
finally :
223
231
_call_if_exists (result , '_restoreStdout' )
224
232
@@ -251,30 +259,33 @@ def _handleModuleTearDown(self, result):
251
259
except KeyError :
252
260
return
253
261
254
- tearDownModule = getattr (module , 'tearDownModule' , None )
255
- if tearDownModule is not None :
256
- _call_if_exists (result , '_setupStdout' )
262
+ _call_if_exists (result , '_setupStdout' )
263
+ try :
264
+ tearDownModule = getattr (module , 'tearDownModule' , None )
265
+ if tearDownModule is not None :
266
+ try :
267
+ tearDownModule ()
268
+ except Exception as e :
269
+ if isinstance (result , _DebugResult ):
270
+ raise
271
+ self ._createClassOrModuleLevelException (result , e ,
272
+ 'tearDownModule' ,
273
+ previousModule )
257
274
try :
258
- tearDownModule ()
275
+ case . doModuleCleanups ()
259
276
except Exception as e :
260
277
if isinstance (result , _DebugResult ):
261
278
raise
262
279
self ._createClassOrModuleLevelException (result , e ,
263
280
'tearDownModule' ,
264
281
previousModule )
265
- finally :
266
- _call_if_exists (result , '_restoreStdout' )
267
- try :
268
- case .doModuleCleanups ()
269
- except Exception as e :
270
- self ._createClassOrModuleLevelException (result , e ,
271
- 'tearDownModule' ,
272
- previousModule )
282
+ finally :
283
+ _call_if_exists (result , '_restoreStdout' )
273
284
274
285
def _tearDownPreviousClass (self , test , result ):
275
286
previousClass = getattr (result , '_previousTestClass' , None )
276
287
currentClass = test .__class__
277
- if currentClass == previousClass :
288
+ if currentClass == previousClass or previousClass is None :
278
289
return
279
290
if getattr (previousClass , '_classSetupFailed' , False ):
280
291
return
@@ -284,27 +295,34 @@ def _tearDownPreviousClass(self, test, result):
284
295
return
285
296
286
297
tearDownClass = getattr (previousClass , 'tearDownClass' , None )
287
- if tearDownClass is not None :
288
- _call_if_exists (result , '_setupStdout' )
289
- try :
290
- tearDownClass ()
291
- except Exception as e :
292
- if isinstance (result , _DebugResult ):
293
- raise
294
- className = util .strclass (previousClass )
295
- self ._createClassOrModuleLevelException (result , e ,
296
- 'tearDownClass' ,
297
- className )
298
- finally :
299
- _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 )
298
+ doClassCleanups = getattr (previousClass , 'doClassCleanups' , None )
299
+ if tearDownClass is None and doClassCleanups is None :
300
+ return
301
+
302
+ _call_if_exists (result , '_setupStdout' )
303
+ try :
304
+ if tearDownClass is not None :
305
+ try :
306
+ tearDownClass ()
307
+ except Exception as e :
308
+ if isinstance (result , _DebugResult ):
309
+ raise
310
+ className = util .strclass (previousClass )
311
+ self ._createClassOrModuleLevelException (result , e ,
312
+ 'tearDownClass' ,
313
+ className )
314
+ if doClassCleanups is not None :
315
+ doClassCleanups ()
316
+ for exc_info in previousClass .tearDown_exceptions :
317
+ if isinstance (result , _DebugResult ):
318
+ raise exc_info [1 ]
319
+ className = util .strclass (previousClass )
320
+ self ._createClassOrModuleLevelException (result , exc_info [1 ],
321
+ 'tearDownClass' ,
322
+ className ,
323
+ info = exc_info )
324
+ finally :
325
+ _call_if_exists (result , '_restoreStdout' )
308
326
309
327
310
328
class _ErrorHolder (object ):
0 commit comments