3
from cStringIO import StringIO
9
return unittest.TestResult()
12
class TestSetups(unittest.TestCase):
15
return unittest.TextTestRunner(resultclass=resultFactory,
17
def runTests(self, *cases):
18
suite = unittest.TestSuite()
20
tests = unittest.defaultTestLoader.loadTestsFromTestCase(case)
23
runner = self.getRunner()
25
# creating a nested suite exposes some potential bugs
26
realSuite = unittest.TestSuite()
27
realSuite.addTest(suite)
28
# adding empty suites to the end exposes potential bugs
29
suite.addTest(unittest.TestSuite())
30
realSuite.addTest(unittest.TestSuite())
31
return runner.run(realSuite)
33
def test_setup_class(self):
34
class Test(unittest.TestCase):
39
unittest.TestCase.setUpClass()
45
result = self.runTests(Test)
47
self.assertEqual(Test.setUpCalled, 1)
48
self.assertEqual(result.testsRun, 2)
49
self.assertEqual(len(result.errors), 0)
51
def test_teardown_class(self):
52
class Test(unittest.TestCase):
55
def tearDownClass(cls):
56
Test.tearDownCalled += 1
57
unittest.TestCase.tearDownClass()
63
result = self.runTests(Test)
65
self.assertEqual(Test.tearDownCalled, 1)
66
self.assertEqual(result.testsRun, 2)
67
self.assertEqual(len(result.errors), 0)
69
def test_teardown_class_two_classes(self):
70
class Test(unittest.TestCase):
73
def tearDownClass(cls):
74
Test.tearDownCalled += 1
75
unittest.TestCase.tearDownClass()
81
class Test2(unittest.TestCase):
84
def tearDownClass(cls):
85
Test2.tearDownCalled += 1
86
unittest.TestCase.tearDownClass()
92
result = self.runTests(Test, Test2)
94
self.assertEqual(Test.tearDownCalled, 1)
95
self.assertEqual(Test2.tearDownCalled, 1)
96
self.assertEqual(result.testsRun, 4)
97
self.assertEqual(len(result.errors), 0)
99
def test_error_in_setupclass(self):
100
class BrokenTest(unittest.TestCase):
103
raise TypeError('foo')
109
result = self.runTests(BrokenTest)
111
self.assertEqual(result.testsRun, 0)
112
self.assertEqual(len(result.errors), 1)
113
error, _ = result.errors[0]
114
self.assertEqual(str(error),
115
'setUpClass (%s.BrokenTest)' % __name__)
117
def test_error_in_teardown_class(self):
118
class Test(unittest.TestCase):
121
def tearDownClass(cls):
123
raise TypeError('foo')
129
class Test2(unittest.TestCase):
132
def tearDownClass(cls):
134
raise TypeError('foo')
140
result = self.runTests(Test, Test2)
141
self.assertEqual(result.testsRun, 4)
142
self.assertEqual(len(result.errors), 2)
143
self.assertEqual(Test.tornDown, 1)
144
self.assertEqual(Test2.tornDown, 1)
146
error, _ = result.errors[0]
147
self.assertEqual(str(error),
148
'tearDownClass (%s.Test)' % __name__)
150
def test_class_not_torndown_when_setup_fails(self):
151
class Test(unittest.TestCase):
157
def tearDownClass(cls):
159
raise TypeError('foo')
164
self.assertFalse(Test.tornDown)
166
def test_class_not_setup_or_torndown_when_skipped(self):
167
class Test(unittest.TestCase):
172
Test.classSetUp = True
174
def tearDownClass(cls):
179
Test = unittest.skip("hop")(Test)
181
self.assertFalse(Test.classSetUp)
182
self.assertFalse(Test.tornDown)
184
def test_setup_teardown_order_with_pathological_suite(self):
187
class Module1(object):
190
results.append('Module1.setUpModule')
192
def tearDownModule():
193
results.append('Module1.tearDownModule')
195
class Module2(object):
198
results.append('Module2.setUpModule')
200
def tearDownModule():
201
results.append('Module2.tearDownModule')
203
class Test1(unittest.TestCase):
206
results.append('setup 1')
208
def tearDownClass(cls):
209
results.append('teardown 1')
211
results.append('Test1.testOne')
213
results.append('Test1.testTwo')
215
class Test2(unittest.TestCase):
218
results.append('setup 2')
220
def tearDownClass(cls):
221
results.append('teardown 2')
223
results.append('Test2.testOne')
225
results.append('Test2.testTwo')
227
class Test3(unittest.TestCase):
230
results.append('setup 3')
232
def tearDownClass(cls):
233
results.append('teardown 3')
235
results.append('Test3.testOne')
237
results.append('Test3.testTwo')
239
Test1.__module__ = Test2.__module__ = 'Module'
240
Test3.__module__ = 'Module2'
241
sys.modules['Module'] = Module1
242
sys.modules['Module2'] = Module2
244
first = unittest.TestSuite((Test1('testOne'),))
245
second = unittest.TestSuite((Test1('testTwo'),))
246
third = unittest.TestSuite((Test2('testOne'),))
247
fourth = unittest.TestSuite((Test2('testTwo'),))
248
fifth = unittest.TestSuite((Test3('testOne'),))
249
sixth = unittest.TestSuite((Test3('testTwo'),))
250
suite = unittest.TestSuite((first, second, third, fourth, fifth, sixth))
252
runner = self.getRunner()
253
result = runner.run(suite)
254
self.assertEqual(result.testsRun, 6)
255
self.assertEqual(len(result.errors), 0)
257
self.assertEqual(results,
258
['Module1.setUpModule', 'setup 1',
259
'Test1.testOne', 'Test1.testTwo', 'teardown 1',
260
'setup 2', 'Test2.testOne', 'Test2.testTwo',
261
'teardown 2', 'Module1.tearDownModule',
262
'Module2.setUpModule', 'setup 3',
263
'Test3.testOne', 'Test3.testTwo',
264
'teardown 3', 'Module2.tearDownModule'])
266
def test_setup_module(self):
267
class Module(object):
271
Module.moduleSetup += 1
273
class Test(unittest.TestCase):
278
Test.__module__ = 'Module'
279
sys.modules['Module'] = Module
281
result = self.runTests(Test)
282
self.assertEqual(Module.moduleSetup, 1)
283
self.assertEqual(result.testsRun, 2)
284
self.assertEqual(len(result.errors), 0)
286
def test_error_in_setup_module(self):
287
class Module(object):
292
Module.moduleSetup += 1
293
raise TypeError('foo')
295
def tearDownModule():
296
Module.moduleTornDown += 1
298
class Test(unittest.TestCase):
300
classTornDown = False
303
Test.classSetUp = True
305
def tearDownClass(cls):
306
Test.classTornDown = True
312
class Test2(unittest.TestCase):
317
Test.__module__ = 'Module'
318
Test2.__module__ = 'Module'
319
sys.modules['Module'] = Module
321
result = self.runTests(Test, Test2)
322
self.assertEqual(Module.moduleSetup, 1)
323
self.assertEqual(Module.moduleTornDown, 0)
324
self.assertEqual(result.testsRun, 0)
325
self.assertFalse(Test.classSetUp)
326
self.assertFalse(Test.classTornDown)
327
self.assertEqual(len(result.errors), 1)
328
error, _ = result.errors[0]
329
self.assertEqual(str(error), 'setUpModule (Module)')
331
def test_testcase_with_missing_module(self):
332
class Test(unittest.TestCase):
337
Test.__module__ = 'Module'
338
sys.modules.pop('Module', None)
340
result = self.runTests(Test)
341
self.assertEqual(result.testsRun, 2)
343
def test_teardown_module(self):
344
class Module(object):
347
def tearDownModule():
348
Module.moduleTornDown += 1
350
class Test(unittest.TestCase):
355
Test.__module__ = 'Module'
356
sys.modules['Module'] = Module
358
result = self.runTests(Test)
359
self.assertEqual(Module.moduleTornDown, 1)
360
self.assertEqual(result.testsRun, 2)
361
self.assertEqual(len(result.errors), 0)
363
def test_error_in_teardown_module(self):
364
class Module(object):
367
def tearDownModule():
368
Module.moduleTornDown += 1
369
raise TypeError('foo')
371
class Test(unittest.TestCase):
373
classTornDown = False
376
Test.classSetUp = True
378
def tearDownClass(cls):
379
Test.classTornDown = True
385
class Test2(unittest.TestCase):
390
Test.__module__ = 'Module'
391
Test2.__module__ = 'Module'
392
sys.modules['Module'] = Module
394
result = self.runTests(Test, Test2)
395
self.assertEqual(Module.moduleTornDown, 1)
396
self.assertEqual(result.testsRun, 4)
397
self.assertTrue(Test.classSetUp)
398
self.assertTrue(Test.classTornDown)
399
self.assertEqual(len(result.errors), 1)
400
error, _ = result.errors[0]
401
self.assertEqual(str(error), 'tearDownModule (Module)')
403
def test_skiptest_in_setupclass(self):
404
class Test(unittest.TestCase):
407
raise unittest.SkipTest('foo')
413
result = self.runTests(Test)
414
self.assertEqual(result.testsRun, 0)
415
self.assertEqual(len(result.errors), 0)
416
self.assertEqual(len(result.skipped), 1)
417
skipped = result.skipped[0][0]
418
self.assertEqual(str(skipped), 'setUpClass (%s.Test)' % __name__)
420
def test_skiptest_in_setupmodule(self):
421
class Test(unittest.TestCase):
427
class Module(object):
430
raise unittest.SkipTest('foo')
432
Test.__module__ = 'Module'
433
sys.modules['Module'] = Module
435
result = self.runTests(Test)
436
self.assertEqual(result.testsRun, 0)
437
self.assertEqual(len(result.errors), 0)
438
self.assertEqual(len(result.skipped), 1)
439
skipped = result.skipped[0][0]
440
self.assertEqual(str(skipped), 'setUpModule (Module)')
442
def test_suite_debug_executes_setups_and_teardowns(self):
445
class Module(object):
448
ordering.append('setUpModule')
450
def tearDownModule():
451
ordering.append('tearDownModule')
453
class Test(unittest.TestCase):
456
ordering.append('setUpClass')
458
def tearDownClass(cls):
459
ordering.append('tearDownClass')
460
def test_something(self):
461
ordering.append('test_something')
463
Test.__module__ = 'Module'
464
sys.modules['Module'] = Module
466
suite = unittest.defaultTestLoader.loadTestsFromTestCase(Test)
468
expectedOrder = ['setUpModule', 'setUpClass', 'test_something', 'tearDownClass', 'tearDownModule']
469
self.assertEqual(ordering, expectedOrder)
471
def test_suite_debug_propagates_exceptions(self):
472
class Module(object):
476
raise Exception('setUpModule')
478
def tearDownModule():
480
raise Exception('tearDownModule')
482
class Test(unittest.TestCase):
486
raise Exception('setUpClass')
488
def tearDownClass(cls):
490
raise Exception('tearDownClass')
491
def test_something(self):
493
raise Exception('test_something')
495
Test.__module__ = 'Module'
496
sys.modules['Module'] = Module
498
_suite = unittest.defaultTestLoader.loadTestsFromTestCase(Test)
499
suite = unittest.TestSuite()
500
suite.addTest(_suite)
502
messages = ('setUpModule', 'tearDownModule', 'setUpClass', 'tearDownClass', 'test_something')
503
for phase, msg in enumerate(messages):
504
with self.assertRaisesRegexp(Exception, msg):
507
if __name__ == '__main__':