python (3.12.0)
1 import io
2 import os
3 import sys
4 import pickle
5 import subprocess
6 from test import support
7
8 import unittest
9 from unittest.case import _Outcome
10
11 from test.test_unittest.support import (
12 BufferedWriter,
13 LoggingResult,
14 ResultWithNoStartTestRunStopTestRun,
15 )
16
17
18 def resultFactory(*_):
19 return unittest.TestResult()
20
21
22 def getRunner():
23 return unittest.TextTestRunner(resultclass=resultFactory,
24 stream=io.StringIO())
25
26
27 class ESC[4;38;5;81mCustomError(ESC[4;38;5;149mException):
28 pass
29
30 # For test output compat:
31 CustomErrorRepr = f"{__name__ + '.' if __name__ != '__main__' else ''}CustomError"
32
33
34 def runTests(*cases):
35 suite = unittest.TestSuite()
36 for case in cases:
37 tests = unittest.defaultTestLoader.loadTestsFromTestCase(case)
38 suite.addTests(tests)
39
40 runner = getRunner()
41
42 # creating a nested suite exposes some potential bugs
43 realSuite = unittest.TestSuite()
44 realSuite.addTest(suite)
45 # adding empty suites to the end exposes potential bugs
46 suite.addTest(unittest.TestSuite())
47 realSuite.addTest(unittest.TestSuite())
48 return runner.run(realSuite)
49
50
51 def cleanup(ordering, blowUp=False):
52 if not blowUp:
53 ordering.append('cleanup_good')
54 else:
55 ordering.append('cleanup_exc')
56 raise CustomError('CleanUpExc')
57
58
59 class ESC[4;38;5;81mTestCM:
60 def __init__(self, ordering, enter_result=None):
61 self.ordering = ordering
62 self.enter_result = enter_result
63
64 def __enter__(self):
65 self.ordering.append('enter')
66 return self.enter_result
67
68 def __exit__(self, *exc_info):
69 self.ordering.append('exit')
70
71
72 class ESC[4;38;5;81mLacksEnterAndExit:
73 pass
74 class ESC[4;38;5;81mLacksEnter:
75 def __exit__(self, *exc_info):
76 pass
77 class ESC[4;38;5;81mLacksExit:
78 def __enter__(self):
79 pass
80
81
82 class ESC[4;38;5;81mTestCleanUp(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
83 def testCleanUp(self):
84 class ESC[4;38;5;81mTestableTest(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
85 def testNothing(self):
86 pass
87
88 test = TestableTest('testNothing')
89 self.assertEqual(test._cleanups, [])
90
91 cleanups = []
92
93 def cleanup1(*args, **kwargs):
94 cleanups.append((1, args, kwargs))
95
96 def cleanup2(*args, **kwargs):
97 cleanups.append((2, args, kwargs))
98
99 test.addCleanup(cleanup1, 1, 2, 3, four='hello', five='goodbye')
100 test.addCleanup(cleanup2)
101
102 self.assertEqual(test._cleanups,
103 [(cleanup1, (1, 2, 3), dict(four='hello', five='goodbye')),
104 (cleanup2, (), {})])
105
106 self.assertTrue(test.doCleanups())
107 self.assertEqual(cleanups, [(2, (), {}), (1, (1, 2, 3), dict(four='hello', five='goodbye'))])
108
109 def testCleanUpWithErrors(self):
110 class ESC[4;38;5;81mTestableTest(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
111 def testNothing(self):
112 pass
113
114 test = TestableTest('testNothing')
115 result = unittest.TestResult()
116 outcome = test._outcome = _Outcome(result=result)
117
118 CleanUpExc = CustomError('foo')
119 exc2 = CustomError('bar')
120 def cleanup1():
121 raise CleanUpExc
122
123 def cleanup2():
124 raise exc2
125
126 test.addCleanup(cleanup1)
127 test.addCleanup(cleanup2)
128
129 self.assertFalse(test.doCleanups())
130 self.assertFalse(outcome.success)
131
132 (_, msg2), (_, msg1) = result.errors
133 self.assertIn('in cleanup1', msg1)
134 self.assertIn('raise CleanUpExc', msg1)
135 self.assertIn(f'{CustomErrorRepr}: foo', msg1)
136 self.assertIn('in cleanup2', msg2)
137 self.assertIn('raise exc2', msg2)
138 self.assertIn(f'{CustomErrorRepr}: bar', msg2)
139
140 def testCleanupInRun(self):
141 blowUp = False
142 ordering = []
143
144 class ESC[4;38;5;81mTestableTest(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
145 def setUp(self):
146 ordering.append('setUp')
147 test.addCleanup(cleanup2)
148 if blowUp:
149 raise CustomError('foo')
150
151 def testNothing(self):
152 ordering.append('test')
153 test.addCleanup(cleanup3)
154
155 def tearDown(self):
156 ordering.append('tearDown')
157
158 test = TestableTest('testNothing')
159
160 def cleanup1():
161 ordering.append('cleanup1')
162 def cleanup2():
163 ordering.append('cleanup2')
164 def cleanup3():
165 ordering.append('cleanup3')
166 test.addCleanup(cleanup1)
167
168 def success(some_test):
169 self.assertEqual(some_test, test)
170 ordering.append('success')
171
172 result = unittest.TestResult()
173 result.addSuccess = success
174
175 test.run(result)
176 self.assertEqual(ordering, ['setUp', 'test', 'tearDown', 'cleanup3',
177 'cleanup2', 'cleanup1', 'success'])
178
179 blowUp = True
180 ordering = []
181 test = TestableTest('testNothing')
182 test.addCleanup(cleanup1)
183 test.run(result)
184 self.assertEqual(ordering, ['setUp', 'cleanup2', 'cleanup1'])
185
186 def testTestCaseDebugExecutesCleanups(self):
187 ordering = []
188
189 class ESC[4;38;5;81mTestableTest(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
190 def setUp(self):
191 ordering.append('setUp')
192 self.addCleanup(cleanup1)
193
194 def testNothing(self):
195 ordering.append('test')
196 self.addCleanup(cleanup3)
197
198 def tearDown(self):
199 ordering.append('tearDown')
200 test.addCleanup(cleanup4)
201
202 test = TestableTest('testNothing')
203
204 def cleanup1():
205 ordering.append('cleanup1')
206 test.addCleanup(cleanup2)
207 def cleanup2():
208 ordering.append('cleanup2')
209 def cleanup3():
210 ordering.append('cleanup3')
211 def cleanup4():
212 ordering.append('cleanup4')
213
214 test.debug()
215 self.assertEqual(ordering, ['setUp', 'test', 'tearDown', 'cleanup4',
216 'cleanup3', 'cleanup1', 'cleanup2'])
217
218
219 def test_enterContext(self):
220 class ESC[4;38;5;81mTestableTest(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
221 def testNothing(self):
222 pass
223
224 test = TestableTest('testNothing')
225 cleanups = []
226
227 test.addCleanup(cleanups.append, 'cleanup1')
228 cm = TestCM(cleanups, 42)
229 self.assertEqual(test.enterContext(cm), 42)
230 test.addCleanup(cleanups.append, 'cleanup2')
231
232 self.assertTrue(test.doCleanups())
233 self.assertEqual(cleanups, ['enter', 'cleanup2', 'exit', 'cleanup1'])
234
235 def test_enterContext_arg_errors(self):
236 class ESC[4;38;5;81mTestableTest(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
237 def testNothing(self):
238 pass
239
240 test = TestableTest('testNothing')
241
242 with self.assertRaisesRegex(TypeError, 'the context manager'):
243 test.enterContext(LacksEnterAndExit())
244 with self.assertRaisesRegex(TypeError, 'the context manager'):
245 test.enterContext(LacksEnter())
246 with self.assertRaisesRegex(TypeError, 'the context manager'):
247 test.enterContext(LacksExit())
248
249 self.assertEqual(test._cleanups, [])
250
251
252 class ESC[4;38;5;81mTestClassCleanup(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
253 def test_addClassCleanUp(self):
254 class ESC[4;38;5;81mTestableTest(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
255 def testNothing(self):
256 pass
257 test = TestableTest('testNothing')
258 self.assertEqual(test._class_cleanups, [])
259 class_cleanups = []
260
261 def class_cleanup1(*args, **kwargs):
262 class_cleanups.append((3, args, kwargs))
263
264 def class_cleanup2(*args, **kwargs):
265 class_cleanups.append((4, args, kwargs))
266
267 TestableTest.addClassCleanup(class_cleanup1, 1, 2, 3,
268 four='hello', five='goodbye')
269 TestableTest.addClassCleanup(class_cleanup2)
270
271 self.assertEqual(test._class_cleanups,
272 [(class_cleanup1, (1, 2, 3),
273 dict(four='hello', five='goodbye')),
274 (class_cleanup2, (), {})])
275
276 TestableTest.doClassCleanups()
277 self.assertEqual(class_cleanups, [(4, (), {}), (3, (1, 2, 3),
278 dict(four='hello', five='goodbye'))])
279
280 def test_run_class_cleanUp(self):
281 ordering = []
282 blowUp = True
283
284 class ESC[4;38;5;81mTestableTest(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
285 @classmethod
286 def setUpClass(cls):
287 ordering.append('setUpClass')
288 cls.addClassCleanup(cleanup, ordering)
289 if blowUp:
290 raise CustomError()
291 def testNothing(self):
292 ordering.append('test')
293 @classmethod
294 def tearDownClass(cls):
295 ordering.append('tearDownClass')
296
297 runTests(TestableTest)
298 self.assertEqual(ordering, ['setUpClass', 'cleanup_good'])
299
300 ordering = []
301 blowUp = False
302 runTests(TestableTest)
303 self.assertEqual(ordering,
304 ['setUpClass', 'test', 'tearDownClass', 'cleanup_good'])
305
306 def test_run_class_cleanUp_without_tearDownClass(self):
307 ordering = []
308 blowUp = True
309
310 class ESC[4;38;5;81mTestableTest(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
311 @classmethod
312 def setUpClass(cls):
313 ordering.append('setUpClass')
314 cls.addClassCleanup(cleanup, ordering)
315 if blowUp:
316 raise CustomError()
317 def testNothing(self):
318 ordering.append('test')
319 @classmethod
320 @property
321 def tearDownClass(cls):
322 raise AttributeError
323
324 runTests(TestableTest)
325 self.assertEqual(ordering, ['setUpClass', 'cleanup_good'])
326
327 ordering = []
328 blowUp = False
329 runTests(TestableTest)
330 self.assertEqual(ordering,
331 ['setUpClass', 'test', 'cleanup_good'])
332
333 def test_debug_executes_classCleanUp(self):
334 ordering = []
335 blowUp = False
336
337 class ESC[4;38;5;81mTestableTest(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
338 @classmethod
339 def setUpClass(cls):
340 ordering.append('setUpClass')
341 cls.addClassCleanup(cleanup, ordering, blowUp=blowUp)
342 def testNothing(self):
343 ordering.append('test')
344 @classmethod
345 def tearDownClass(cls):
346 ordering.append('tearDownClass')
347
348 suite = unittest.defaultTestLoader.loadTestsFromTestCase(TestableTest)
349 suite.debug()
350 self.assertEqual(ordering,
351 ['setUpClass', 'test', 'tearDownClass', 'cleanup_good'])
352
353 ordering = []
354 blowUp = True
355 suite = unittest.defaultTestLoader.loadTestsFromTestCase(TestableTest)
356 with self.assertRaises(CustomError) as cm:
357 suite.debug()
358 self.assertEqual(str(cm.exception), 'CleanUpExc')
359 self.assertEqual(ordering,
360 ['setUpClass', 'test', 'tearDownClass', 'cleanup_exc'])
361
362 def test_debug_executes_classCleanUp_when_teardown_exception(self):
363 ordering = []
364 blowUp = False
365
366 class ESC[4;38;5;81mTestableTest(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
367 @classmethod
368 def setUpClass(cls):
369 ordering.append('setUpClass')
370 cls.addClassCleanup(cleanup, ordering, blowUp=blowUp)
371 def testNothing(self):
372 ordering.append('test')
373 @classmethod
374 def tearDownClass(cls):
375 ordering.append('tearDownClass')
376 raise CustomError('TearDownClassExc')
377
378 suite = unittest.defaultTestLoader.loadTestsFromTestCase(TestableTest)
379 with self.assertRaises(CustomError) as cm:
380 suite.debug()
381 self.assertEqual(str(cm.exception), 'TearDownClassExc')
382 self.assertEqual(ordering, ['setUpClass', 'test', 'tearDownClass'])
383 self.assertTrue(TestableTest._class_cleanups)
384 TestableTest._class_cleanups.clear()
385
386 ordering = []
387 blowUp = True
388 suite = unittest.defaultTestLoader.loadTestsFromTestCase(TestableTest)
389 with self.assertRaises(CustomError) as cm:
390 suite.debug()
391 self.assertEqual(str(cm.exception), 'TearDownClassExc')
392 self.assertEqual(ordering, ['setUpClass', 'test', 'tearDownClass'])
393 self.assertTrue(TestableTest._class_cleanups)
394 TestableTest._class_cleanups.clear()
395
396 def test_doClassCleanups_with_errors_addClassCleanUp(self):
397 class ESC[4;38;5;81mTestableTest(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
398 def testNothing(self):
399 pass
400
401 def cleanup1():
402 raise CustomError('cleanup1')
403
404 def cleanup2():
405 raise CustomError('cleanup2')
406
407 TestableTest.addClassCleanup(cleanup1)
408 TestableTest.addClassCleanup(cleanup2)
409 TestableTest.doClassCleanups()
410
411 self.assertEqual(len(TestableTest.tearDown_exceptions), 2)
412
413 e1, e2 = TestableTest.tearDown_exceptions
414 self.assertIsInstance(e1[1], CustomError)
415 self.assertEqual(str(e1[1]), 'cleanup2')
416 self.assertIsInstance(e2[1], CustomError)
417 self.assertEqual(str(e2[1]), 'cleanup1')
418
419 def test_with_errors_addCleanUp(self):
420 ordering = []
421 class ESC[4;38;5;81mTestableTest(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
422 @classmethod
423 def setUpClass(cls):
424 ordering.append('setUpClass')
425 cls.addClassCleanup(cleanup, ordering)
426 def setUp(self):
427 ordering.append('setUp')
428 self.addCleanup(cleanup, ordering, blowUp=True)
429 def testNothing(self):
430 pass
431 @classmethod
432 def tearDownClass(cls):
433 ordering.append('tearDownClass')
434
435 result = runTests(TestableTest)
436 self.assertEqual(result.errors[0][1].splitlines()[-1],
437 f'{CustomErrorRepr}: CleanUpExc')
438 self.assertEqual(ordering,
439 ['setUpClass', 'setUp', 'cleanup_exc',
440 'tearDownClass', 'cleanup_good'])
441
442 def test_run_with_errors_addClassCleanUp(self):
443 ordering = []
444 class ESC[4;38;5;81mTestableTest(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
445 @classmethod
446 def setUpClass(cls):
447 ordering.append('setUpClass')
448 cls.addClassCleanup(cleanup, ordering, blowUp=True)
449 def setUp(self):
450 ordering.append('setUp')
451 self.addCleanup(cleanup, ordering)
452 def testNothing(self):
453 ordering.append('test')
454 @classmethod
455 def tearDownClass(cls):
456 ordering.append('tearDownClass')
457
458 result = runTests(TestableTest)
459 self.assertEqual(result.errors[0][1].splitlines()[-1],
460 f'{CustomErrorRepr}: CleanUpExc')
461 self.assertEqual(ordering,
462 ['setUpClass', 'setUp', 'test', 'cleanup_good',
463 'tearDownClass', 'cleanup_exc'])
464
465 def test_with_errors_in_addClassCleanup_and_setUps(self):
466 ordering = []
467 class_blow_up = False
468 method_blow_up = False
469
470 class ESC[4;38;5;81mTestableTest(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
471 @classmethod
472 def setUpClass(cls):
473 ordering.append('setUpClass')
474 cls.addClassCleanup(cleanup, ordering, blowUp=True)
475 if class_blow_up:
476 raise CustomError('ClassExc')
477 def setUp(self):
478 ordering.append('setUp')
479 if method_blow_up:
480 raise CustomError('MethodExc')
481 def testNothing(self):
482 ordering.append('test')
483 @classmethod
484 def tearDownClass(cls):
485 ordering.append('tearDownClass')
486
487 result = runTests(TestableTest)
488 self.assertEqual(result.errors[0][1].splitlines()[-1],
489 f'{CustomErrorRepr}: CleanUpExc')
490 self.assertEqual(ordering,
491 ['setUpClass', 'setUp', 'test',
492 'tearDownClass', 'cleanup_exc'])
493
494 ordering = []
495 class_blow_up = True
496 method_blow_up = False
497 result = runTests(TestableTest)
498 self.assertEqual(result.errors[0][1].splitlines()[-1],
499 f'{CustomErrorRepr}: ClassExc')
500 self.assertEqual(result.errors[1][1].splitlines()[-1],
501 f'{CustomErrorRepr}: CleanUpExc')
502 self.assertEqual(ordering,
503 ['setUpClass', 'cleanup_exc'])
504
505 ordering = []
506 class_blow_up = False
507 method_blow_up = True
508 result = runTests(TestableTest)
509 self.assertEqual(result.errors[0][1].splitlines()[-1],
510 f'{CustomErrorRepr}: MethodExc')
511 self.assertEqual(result.errors[1][1].splitlines()[-1],
512 f'{CustomErrorRepr}: CleanUpExc')
513 self.assertEqual(ordering,
514 ['setUpClass', 'setUp', 'tearDownClass',
515 'cleanup_exc'])
516
517 def test_with_errors_in_tearDownClass(self):
518 ordering = []
519 class ESC[4;38;5;81mTestableTest(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
520 @classmethod
521 def setUpClass(cls):
522 ordering.append('setUpClass')
523 cls.addClassCleanup(cleanup, ordering)
524 def testNothing(self):
525 ordering.append('test')
526 @classmethod
527 def tearDownClass(cls):
528 ordering.append('tearDownClass')
529 raise CustomError('TearDownExc')
530
531 result = runTests(TestableTest)
532 self.assertEqual(result.errors[0][1].splitlines()[-1],
533 f'{CustomErrorRepr}: TearDownExc')
534 self.assertEqual(ordering,
535 ['setUpClass', 'test', 'tearDownClass', 'cleanup_good'])
536
537 def test_enterClassContext(self):
538 class ESC[4;38;5;81mTestableTest(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
539 def testNothing(self):
540 pass
541
542 cleanups = []
543
544 TestableTest.addClassCleanup(cleanups.append, 'cleanup1')
545 cm = TestCM(cleanups, 42)
546 self.assertEqual(TestableTest.enterClassContext(cm), 42)
547 TestableTest.addClassCleanup(cleanups.append, 'cleanup2')
548
549 TestableTest.doClassCleanups()
550 self.assertEqual(cleanups, ['enter', 'cleanup2', 'exit', 'cleanup1'])
551
552 def test_enterClassContext_arg_errors(self):
553 class ESC[4;38;5;81mTestableTest(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
554 def testNothing(self):
555 pass
556
557 with self.assertRaisesRegex(TypeError, 'the context manager'):
558 TestableTest.enterClassContext(LacksEnterAndExit())
559 with self.assertRaisesRegex(TypeError, 'the context manager'):
560 TestableTest.enterClassContext(LacksEnter())
561 with self.assertRaisesRegex(TypeError, 'the context manager'):
562 TestableTest.enterClassContext(LacksExit())
563
564 self.assertEqual(TestableTest._class_cleanups, [])
565
566 def test_run_nested_test(self):
567 ordering = []
568
569 class ESC[4;38;5;81mInnerTest(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
570 @classmethod
571 def setUpClass(cls):
572 ordering.append('inner setup')
573 cls.addClassCleanup(ordering.append, 'inner cleanup')
574 def test(self):
575 ordering.append('inner test')
576
577 class ESC[4;38;5;81mOuterTest(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
578 @classmethod
579 def setUpClass(cls):
580 ordering.append('outer setup')
581 cls.addClassCleanup(ordering.append, 'outer cleanup')
582 def test(self):
583 ordering.append('start outer test')
584 runTests(InnerTest)
585 ordering.append('end outer test')
586
587 runTests(OuterTest)
588 self.assertEqual(ordering, [
589 'outer setup', 'start outer test',
590 'inner setup', 'inner test', 'inner cleanup',
591 'end outer test', 'outer cleanup'])
592
593 def test_run_empty_suite_error_message(self):
594 class ESC[4;38;5;81mEmptyTest(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
595 pass
596
597 suite = unittest.defaultTestLoader.loadTestsFromTestCase(EmptyTest)
598 runner = getRunner()
599 runner.run(suite)
600
601 self.assertIn("\nNO TESTS RAN\n", runner.stream.getvalue())
602
603
604 class ESC[4;38;5;81mTestModuleCleanUp(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
605 def test_add_and_do_ModuleCleanup(self):
606 module_cleanups = []
607
608 def module_cleanup1(*args, **kwargs):
609 module_cleanups.append((3, args, kwargs))
610
611 def module_cleanup2(*args, **kwargs):
612 module_cleanups.append((4, args, kwargs))
613
614 class ESC[4;38;5;81mModule(ESC[4;38;5;149mobject):
615 unittest.addModuleCleanup(module_cleanup1, 1, 2, 3,
616 four='hello', five='goodbye')
617 unittest.addModuleCleanup(module_cleanup2)
618
619 self.assertEqual(unittest.case._module_cleanups,
620 [(module_cleanup1, (1, 2, 3),
621 dict(four='hello', five='goodbye')),
622 (module_cleanup2, (), {})])
623
624 unittest.case.doModuleCleanups()
625 self.assertEqual(module_cleanups, [(4, (), {}), (3, (1, 2, 3),
626 dict(four='hello', five='goodbye'))])
627 self.assertEqual(unittest.case._module_cleanups, [])
628
629 def test_doModuleCleanup_with_errors_in_addModuleCleanup(self):
630 module_cleanups = []
631
632 def module_cleanup_good(*args, **kwargs):
633 module_cleanups.append((3, args, kwargs))
634
635 def module_cleanup_bad(*args, **kwargs):
636 raise CustomError('CleanUpExc')
637
638 class ESC[4;38;5;81mModule(ESC[4;38;5;149mobject):
639 unittest.addModuleCleanup(module_cleanup_good, 1, 2, 3,
640 four='hello', five='goodbye')
641 unittest.addModuleCleanup(module_cleanup_bad)
642 self.assertEqual(unittest.case._module_cleanups,
643 [(module_cleanup_good, (1, 2, 3),
644 dict(four='hello', five='goodbye')),
645 (module_cleanup_bad, (), {})])
646 with self.assertRaises(CustomError) as e:
647 unittest.case.doModuleCleanups()
648 self.assertEqual(str(e.exception), 'CleanUpExc')
649 self.assertEqual(unittest.case._module_cleanups, [])
650
651 def test_addModuleCleanup_arg_errors(self):
652 cleanups = []
653 def cleanup(*args, **kwargs):
654 cleanups.append((args, kwargs))
655
656 class ESC[4;38;5;81mModule(ESC[4;38;5;149mobject):
657 unittest.addModuleCleanup(cleanup, 1, 2, function='hello')
658 with self.assertRaises(TypeError):
659 unittest.addModuleCleanup(function=cleanup, arg='hello')
660 with self.assertRaises(TypeError):
661 unittest.addModuleCleanup()
662 unittest.case.doModuleCleanups()
663 self.assertEqual(cleanups,
664 [((1, 2), {'function': 'hello'})])
665
666 def test_run_module_cleanUp(self):
667 blowUp = True
668 ordering = []
669 class ESC[4;38;5;81mModule(ESC[4;38;5;149mobject):
670 @staticmethod
671 def setUpModule():
672 ordering.append('setUpModule')
673 unittest.addModuleCleanup(cleanup, ordering)
674 if blowUp:
675 raise CustomError('setUpModule Exc')
676 @staticmethod
677 def tearDownModule():
678 ordering.append('tearDownModule')
679
680 class ESC[4;38;5;81mTestableTest(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
681 @classmethod
682 def setUpClass(cls):
683 ordering.append('setUpClass')
684 def testNothing(self):
685 ordering.append('test')
686 @classmethod
687 def tearDownClass(cls):
688 ordering.append('tearDownClass')
689
690 TestableTest.__module__ = 'Module'
691 sys.modules['Module'] = Module
692 result = runTests(TestableTest)
693 self.assertEqual(ordering, ['setUpModule', 'cleanup_good'])
694 self.assertEqual(result.errors[0][1].splitlines()[-1],
695 f'{CustomErrorRepr}: setUpModule Exc')
696
697 ordering = []
698 blowUp = False
699 runTests(TestableTest)
700 self.assertEqual(ordering,
701 ['setUpModule', 'setUpClass', 'test', 'tearDownClass',
702 'tearDownModule', 'cleanup_good'])
703 self.assertEqual(unittest.case._module_cleanups, [])
704
705 def test_run_multiple_module_cleanUp(self):
706 blowUp = True
707 blowUp2 = False
708 ordering = []
709 class ESC[4;38;5;81mModule1(ESC[4;38;5;149mobject):
710 @staticmethod
711 def setUpModule():
712 ordering.append('setUpModule')
713 unittest.addModuleCleanup(cleanup, ordering)
714 if blowUp:
715 raise CustomError()
716 @staticmethod
717 def tearDownModule():
718 ordering.append('tearDownModule')
719
720 class ESC[4;38;5;81mModule2(ESC[4;38;5;149mobject):
721 @staticmethod
722 def setUpModule():
723 ordering.append('setUpModule2')
724 unittest.addModuleCleanup(cleanup, ordering)
725 if blowUp2:
726 raise CustomError()
727 @staticmethod
728 def tearDownModule():
729 ordering.append('tearDownModule2')
730
731 class ESC[4;38;5;81mTestableTest(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
732 @classmethod
733 def setUpClass(cls):
734 ordering.append('setUpClass')
735 def testNothing(self):
736 ordering.append('test')
737 @classmethod
738 def tearDownClass(cls):
739 ordering.append('tearDownClass')
740
741 class ESC[4;38;5;81mTestableTest2(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
742 @classmethod
743 def setUpClass(cls):
744 ordering.append('setUpClass2')
745 def testNothing(self):
746 ordering.append('test2')
747 @classmethod
748 def tearDownClass(cls):
749 ordering.append('tearDownClass2')
750
751 TestableTest.__module__ = 'Module1'
752 sys.modules['Module1'] = Module1
753 TestableTest2.__module__ = 'Module2'
754 sys.modules['Module2'] = Module2
755 runTests(TestableTest, TestableTest2)
756 self.assertEqual(ordering, ['setUpModule', 'cleanup_good',
757 'setUpModule2', 'setUpClass2', 'test2',
758 'tearDownClass2', 'tearDownModule2',
759 'cleanup_good'])
760 ordering = []
761 blowUp = False
762 blowUp2 = True
763 runTests(TestableTest, TestableTest2)
764 self.assertEqual(ordering, ['setUpModule', 'setUpClass', 'test',
765 'tearDownClass', 'tearDownModule',
766 'cleanup_good', 'setUpModule2',
767 'cleanup_good'])
768
769 ordering = []
770 blowUp = False
771 blowUp2 = False
772 runTests(TestableTest, TestableTest2)
773 self.assertEqual(ordering,
774 ['setUpModule', 'setUpClass', 'test', 'tearDownClass',
775 'tearDownModule', 'cleanup_good', 'setUpModule2',
776 'setUpClass2', 'test2', 'tearDownClass2',
777 'tearDownModule2', 'cleanup_good'])
778 self.assertEqual(unittest.case._module_cleanups, [])
779
780 def test_run_module_cleanUp_without_teardown(self):
781 ordering = []
782 class ESC[4;38;5;81mModule(ESC[4;38;5;149mobject):
783 @staticmethod
784 def setUpModule():
785 ordering.append('setUpModule')
786 unittest.addModuleCleanup(cleanup, ordering)
787
788 class ESC[4;38;5;81mTestableTest(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
789 @classmethod
790 def setUpClass(cls):
791 ordering.append('setUpClass')
792 def testNothing(self):
793 ordering.append('test')
794 @classmethod
795 def tearDownClass(cls):
796 ordering.append('tearDownClass')
797
798 TestableTest.__module__ = 'Module'
799 sys.modules['Module'] = Module
800 runTests(TestableTest)
801 self.assertEqual(ordering, ['setUpModule', 'setUpClass', 'test',
802 'tearDownClass', 'cleanup_good'])
803 self.assertEqual(unittest.case._module_cleanups, [])
804
805 def test_run_module_cleanUp_when_teardown_exception(self):
806 ordering = []
807 class ESC[4;38;5;81mModule(ESC[4;38;5;149mobject):
808 @staticmethod
809 def setUpModule():
810 ordering.append('setUpModule')
811 unittest.addModuleCleanup(cleanup, ordering)
812 @staticmethod
813 def tearDownModule():
814 ordering.append('tearDownModule')
815 raise CustomError('CleanUpExc')
816
817 class ESC[4;38;5;81mTestableTest(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
818 @classmethod
819 def setUpClass(cls):
820 ordering.append('setUpClass')
821 def testNothing(self):
822 ordering.append('test')
823 @classmethod
824 def tearDownClass(cls):
825 ordering.append('tearDownClass')
826
827 TestableTest.__module__ = 'Module'
828 sys.modules['Module'] = Module
829 result = runTests(TestableTest)
830 self.assertEqual(result.errors[0][1].splitlines()[-1],
831 f'{CustomErrorRepr}: CleanUpExc')
832 self.assertEqual(ordering, ['setUpModule', 'setUpClass', 'test',
833 'tearDownClass', 'tearDownModule',
834 'cleanup_good'])
835 self.assertEqual(unittest.case._module_cleanups, [])
836
837 def test_debug_module_executes_cleanUp(self):
838 ordering = []
839 blowUp = False
840 class ESC[4;38;5;81mModule(ESC[4;38;5;149mobject):
841 @staticmethod
842 def setUpModule():
843 ordering.append('setUpModule')
844 unittest.addModuleCleanup(cleanup, ordering, blowUp=blowUp)
845 @staticmethod
846 def tearDownModule():
847 ordering.append('tearDownModule')
848
849 class ESC[4;38;5;81mTestableTest(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
850 @classmethod
851 def setUpClass(cls):
852 ordering.append('setUpClass')
853 def testNothing(self):
854 ordering.append('test')
855 @classmethod
856 def tearDownClass(cls):
857 ordering.append('tearDownClass')
858
859 TestableTest.__module__ = 'Module'
860 sys.modules['Module'] = Module
861 suite = unittest.defaultTestLoader.loadTestsFromTestCase(TestableTest)
862 suite.debug()
863 self.assertEqual(ordering,
864 ['setUpModule', 'setUpClass', 'test', 'tearDownClass',
865 'tearDownModule', 'cleanup_good'])
866 self.assertEqual(unittest.case._module_cleanups, [])
867
868 ordering = []
869 blowUp = True
870 suite = unittest.defaultTestLoader.loadTestsFromTestCase(TestableTest)
871 with self.assertRaises(CustomError) as cm:
872 suite.debug()
873 self.assertEqual(str(cm.exception), 'CleanUpExc')
874 self.assertEqual(ordering, ['setUpModule', 'setUpClass', 'test',
875 'tearDownClass', 'tearDownModule', 'cleanup_exc'])
876 self.assertEqual(unittest.case._module_cleanups, [])
877
878 def test_debug_module_cleanUp_when_teardown_exception(self):
879 ordering = []
880 blowUp = False
881 class ESC[4;38;5;81mModule(ESC[4;38;5;149mobject):
882 @staticmethod
883 def setUpModule():
884 ordering.append('setUpModule')
885 unittest.addModuleCleanup(cleanup, ordering, blowUp=blowUp)
886 @staticmethod
887 def tearDownModule():
888 ordering.append('tearDownModule')
889 raise CustomError('TearDownModuleExc')
890
891 class ESC[4;38;5;81mTestableTest(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
892 @classmethod
893 def setUpClass(cls):
894 ordering.append('setUpClass')
895 def testNothing(self):
896 ordering.append('test')
897 @classmethod
898 def tearDownClass(cls):
899 ordering.append('tearDownClass')
900
901 TestableTest.__module__ = 'Module'
902 sys.modules['Module'] = Module
903 suite = unittest.defaultTestLoader.loadTestsFromTestCase(TestableTest)
904 with self.assertRaises(CustomError) as cm:
905 suite.debug()
906 self.assertEqual(str(cm.exception), 'TearDownModuleExc')
907 self.assertEqual(ordering, ['setUpModule', 'setUpClass', 'test',
908 'tearDownClass', 'tearDownModule'])
909 self.assertTrue(unittest.case._module_cleanups)
910 unittest.case._module_cleanups.clear()
911
912 ordering = []
913 blowUp = True
914 suite = unittest.defaultTestLoader.loadTestsFromTestCase(TestableTest)
915 with self.assertRaises(CustomError) as cm:
916 suite.debug()
917 self.assertEqual(str(cm.exception), 'TearDownModuleExc')
918 self.assertEqual(ordering, ['setUpModule', 'setUpClass', 'test',
919 'tearDownClass', 'tearDownModule'])
920 self.assertTrue(unittest.case._module_cleanups)
921 unittest.case._module_cleanups.clear()
922
923 def test_addClassCleanup_arg_errors(self):
924 cleanups = []
925 def cleanup(*args, **kwargs):
926 cleanups.append((args, kwargs))
927
928 class ESC[4;38;5;81mTestableTest(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
929 @classmethod
930 def setUpClass(cls):
931 cls.addClassCleanup(cleanup, 1, 2, function=3, cls=4)
932 with self.assertRaises(TypeError):
933 cls.addClassCleanup(function=cleanup, arg='hello')
934 def testNothing(self):
935 pass
936
937 with self.assertRaises(TypeError):
938 TestableTest.addClassCleanup()
939 with self.assertRaises(TypeError):
940 unittest.TestCase.addCleanup(cls=TestableTest(), function=cleanup)
941 runTests(TestableTest)
942 self.assertEqual(cleanups,
943 [((1, 2), {'function': 3, 'cls': 4})])
944
945 def test_addCleanup_arg_errors(self):
946 cleanups = []
947 def cleanup(*args, **kwargs):
948 cleanups.append((args, kwargs))
949
950 class ESC[4;38;5;81mTestableTest(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
951 def setUp(self2):
952 self2.addCleanup(cleanup, 1, 2, function=3, self=4)
953 with self.assertRaises(TypeError):
954 self2.addCleanup(function=cleanup, arg='hello')
955 def testNothing(self):
956 pass
957
958 with self.assertRaises(TypeError):
959 TestableTest().addCleanup()
960 with self.assertRaises(TypeError):
961 unittest.TestCase.addCleanup(self=TestableTest(), function=cleanup)
962 runTests(TestableTest)
963 self.assertEqual(cleanups,
964 [((1, 2), {'function': 3, 'self': 4})])
965
966 def test_with_errors_in_addClassCleanup(self):
967 ordering = []
968
969 class ESC[4;38;5;81mModule(ESC[4;38;5;149mobject):
970 @staticmethod
971 def setUpModule():
972 ordering.append('setUpModule')
973 unittest.addModuleCleanup(cleanup, ordering)
974 @staticmethod
975 def tearDownModule():
976 ordering.append('tearDownModule')
977
978 class ESC[4;38;5;81mTestableTest(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
979 @classmethod
980 def setUpClass(cls):
981 ordering.append('setUpClass')
982 cls.addClassCleanup(cleanup, ordering, blowUp=True)
983 def testNothing(self):
984 ordering.append('test')
985 @classmethod
986 def tearDownClass(cls):
987 ordering.append('tearDownClass')
988
989 TestableTest.__module__ = 'Module'
990 sys.modules['Module'] = Module
991
992 result = runTests(TestableTest)
993 self.assertEqual(result.errors[0][1].splitlines()[-1],
994 f'{CustomErrorRepr}: CleanUpExc')
995 self.assertEqual(ordering,
996 ['setUpModule', 'setUpClass', 'test', 'tearDownClass',
997 'cleanup_exc', 'tearDownModule', 'cleanup_good'])
998
999 def test_with_errors_in_addCleanup(self):
1000 ordering = []
1001 class ESC[4;38;5;81mModule(ESC[4;38;5;149mobject):
1002 @staticmethod
1003 def setUpModule():
1004 ordering.append('setUpModule')
1005 unittest.addModuleCleanup(cleanup, ordering)
1006 @staticmethod
1007 def tearDownModule():
1008 ordering.append('tearDownModule')
1009
1010 class ESC[4;38;5;81mTestableTest(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
1011 def setUp(self):
1012 ordering.append('setUp')
1013 self.addCleanup(cleanup, ordering, blowUp=True)
1014 def testNothing(self):
1015 ordering.append('test')
1016 def tearDown(self):
1017 ordering.append('tearDown')
1018
1019 TestableTest.__module__ = 'Module'
1020 sys.modules['Module'] = Module
1021
1022 result = runTests(TestableTest)
1023 self.assertEqual(result.errors[0][1].splitlines()[-1],
1024 f'{CustomErrorRepr}: CleanUpExc')
1025 self.assertEqual(ordering,
1026 ['setUpModule', 'setUp', 'test', 'tearDown',
1027 'cleanup_exc', 'tearDownModule', 'cleanup_good'])
1028
1029 def test_with_errors_in_addModuleCleanup_and_setUps(self):
1030 ordering = []
1031 module_blow_up = False
1032 class_blow_up = False
1033 method_blow_up = False
1034 class ESC[4;38;5;81mModule(ESC[4;38;5;149mobject):
1035 @staticmethod
1036 def setUpModule():
1037 ordering.append('setUpModule')
1038 unittest.addModuleCleanup(cleanup, ordering, blowUp=True)
1039 if module_blow_up:
1040 raise CustomError('ModuleExc')
1041 @staticmethod
1042 def tearDownModule():
1043 ordering.append('tearDownModule')
1044
1045 class ESC[4;38;5;81mTestableTest(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
1046 @classmethod
1047 def setUpClass(cls):
1048 ordering.append('setUpClass')
1049 if class_blow_up:
1050 raise CustomError('ClassExc')
1051 def setUp(self):
1052 ordering.append('setUp')
1053 if method_blow_up:
1054 raise CustomError('MethodExc')
1055 def testNothing(self):
1056 ordering.append('test')
1057 @classmethod
1058 def tearDownClass(cls):
1059 ordering.append('tearDownClass')
1060
1061 TestableTest.__module__ = 'Module'
1062 sys.modules['Module'] = Module
1063
1064 result = runTests(TestableTest)
1065 self.assertEqual(result.errors[0][1].splitlines()[-1],
1066 f'{CustomErrorRepr}: CleanUpExc')
1067 self.assertEqual(ordering,
1068 ['setUpModule', 'setUpClass', 'setUp', 'test',
1069 'tearDownClass', 'tearDownModule',
1070 'cleanup_exc'])
1071
1072 ordering = []
1073 module_blow_up = True
1074 class_blow_up = False
1075 method_blow_up = False
1076 result = runTests(TestableTest)
1077 self.assertEqual(result.errors[0][1].splitlines()[-1],
1078 f'{CustomErrorRepr}: ModuleExc')
1079 self.assertEqual(result.errors[1][1].splitlines()[-1],
1080 f'{CustomErrorRepr}: CleanUpExc')
1081 self.assertEqual(ordering, ['setUpModule', 'cleanup_exc'])
1082
1083 ordering = []
1084 module_blow_up = False
1085 class_blow_up = True
1086 method_blow_up = False
1087 result = runTests(TestableTest)
1088 self.assertEqual(result.errors[0][1].splitlines()[-1],
1089 f'{CustomErrorRepr}: ClassExc')
1090 self.assertEqual(result.errors[1][1].splitlines()[-1],
1091 f'{CustomErrorRepr}: CleanUpExc')
1092 self.assertEqual(ordering, ['setUpModule', 'setUpClass',
1093 'tearDownModule', 'cleanup_exc'])
1094
1095 ordering = []
1096 module_blow_up = False
1097 class_blow_up = False
1098 method_blow_up = True
1099 result = runTests(TestableTest)
1100 self.assertEqual(result.errors[0][1].splitlines()[-1],
1101 f'{CustomErrorRepr}: MethodExc')
1102 self.assertEqual(result.errors[1][1].splitlines()[-1],
1103 f'{CustomErrorRepr}: CleanUpExc')
1104 self.assertEqual(ordering, ['setUpModule', 'setUpClass', 'setUp',
1105 'tearDownClass', 'tearDownModule',
1106 'cleanup_exc'])
1107
1108 def test_module_cleanUp_with_multiple_classes(self):
1109 ordering =[]
1110 def cleanup1():
1111 ordering.append('cleanup1')
1112
1113 def cleanup2():
1114 ordering.append('cleanup2')
1115
1116 def cleanup3():
1117 ordering.append('cleanup3')
1118
1119 class ESC[4;38;5;81mModule(ESC[4;38;5;149mobject):
1120 @staticmethod
1121 def setUpModule():
1122 ordering.append('setUpModule')
1123 unittest.addModuleCleanup(cleanup1)
1124 @staticmethod
1125 def tearDownModule():
1126 ordering.append('tearDownModule')
1127
1128 class ESC[4;38;5;81mTestableTest(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
1129 def setUp(self):
1130 ordering.append('setUp')
1131 self.addCleanup(cleanup2)
1132 def testNothing(self):
1133 ordering.append('test')
1134 def tearDown(self):
1135 ordering.append('tearDown')
1136
1137 class ESC[4;38;5;81mOtherTestableTest(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
1138 def setUp(self):
1139 ordering.append('setUp2')
1140 self.addCleanup(cleanup3)
1141 def testNothing(self):
1142 ordering.append('test2')
1143 def tearDown(self):
1144 ordering.append('tearDown2')
1145
1146 TestableTest.__module__ = 'Module'
1147 OtherTestableTest.__module__ = 'Module'
1148 sys.modules['Module'] = Module
1149 runTests(TestableTest, OtherTestableTest)
1150 self.assertEqual(ordering,
1151 ['setUpModule', 'setUp', 'test', 'tearDown',
1152 'cleanup2', 'setUp2', 'test2', 'tearDown2',
1153 'cleanup3', 'tearDownModule', 'cleanup1'])
1154
1155 def test_enterModuleContext(self):
1156 cleanups = []
1157
1158 unittest.addModuleCleanup(cleanups.append, 'cleanup1')
1159 cm = TestCM(cleanups, 42)
1160 self.assertEqual(unittest.enterModuleContext(cm), 42)
1161 unittest.addModuleCleanup(cleanups.append, 'cleanup2')
1162
1163 unittest.case.doModuleCleanups()
1164 self.assertEqual(cleanups, ['enter', 'cleanup2', 'exit', 'cleanup1'])
1165
1166 def test_enterModuleContext_arg_errors(self):
1167 class ESC[4;38;5;81mTestableTest(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
1168 def testNothing(self):
1169 pass
1170
1171 with self.assertRaisesRegex(TypeError, 'the context manager'):
1172 unittest.enterModuleContext(LacksEnterAndExit())
1173 with self.assertRaisesRegex(TypeError, 'the context manager'):
1174 unittest.enterModuleContext(LacksEnter())
1175 with self.assertRaisesRegex(TypeError, 'the context manager'):
1176 unittest.enterModuleContext(LacksExit())
1177
1178 self.assertEqual(unittest.case._module_cleanups, [])
1179
1180
1181 class ESC[4;38;5;81mTest_TextTestRunner(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
1182 """Tests for TextTestRunner."""
1183
1184 def setUp(self):
1185 # clean the environment from pre-existing PYTHONWARNINGS to make
1186 # test_warnings results consistent
1187 self.pythonwarnings = os.environ.get('PYTHONWARNINGS')
1188 if self.pythonwarnings:
1189 del os.environ['PYTHONWARNINGS']
1190
1191 def tearDown(self):
1192 # bring back pre-existing PYTHONWARNINGS if present
1193 if self.pythonwarnings:
1194 os.environ['PYTHONWARNINGS'] = self.pythonwarnings
1195
1196 def test_init(self):
1197 runner = unittest.TextTestRunner()
1198 self.assertFalse(runner.failfast)
1199 self.assertFalse(runner.buffer)
1200 self.assertEqual(runner.verbosity, 1)
1201 self.assertEqual(runner.warnings, None)
1202 self.assertTrue(runner.descriptions)
1203 self.assertEqual(runner.resultclass, unittest.TextTestResult)
1204 self.assertFalse(runner.tb_locals)
1205 self.assertIsNone(runner.durations)
1206
1207 def test_multiple_inheritance(self):
1208 class ESC[4;38;5;81mAResult(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestResult):
1209 def __init__(self, stream, descriptions, verbosity):
1210 super(AResult, self).__init__(stream, descriptions, verbosity)
1211
1212 class ESC[4;38;5;81mATextResult(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTextTestResult, ESC[4;38;5;149mAResult):
1213 pass
1214
1215 # This used to raise an exception due to TextTestResult not passing
1216 # on arguments in its __init__ super call
1217 ATextResult(None, None, 1)
1218
1219 def testBufferAndFailfast(self):
1220 class ESC[4;38;5;81mTest(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
1221 def testFoo(self):
1222 pass
1223 result = unittest.TestResult()
1224 runner = unittest.TextTestRunner(stream=io.StringIO(), failfast=True,
1225 buffer=True)
1226 # Use our result object
1227 runner._makeResult = lambda: result
1228 runner.run(Test('testFoo'))
1229
1230 self.assertTrue(result.failfast)
1231 self.assertTrue(result.buffer)
1232
1233 def test_locals(self):
1234 runner = unittest.TextTestRunner(stream=io.StringIO(), tb_locals=True)
1235 result = runner.run(unittest.TestSuite())
1236 self.assertEqual(True, result.tb_locals)
1237
1238 def testRunnerRegistersResult(self):
1239 class ESC[4;38;5;81mTest(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
1240 def testFoo(self):
1241 pass
1242 originalRegisterResult = unittest.runner.registerResult
1243 def cleanup():
1244 unittest.runner.registerResult = originalRegisterResult
1245 self.addCleanup(cleanup)
1246
1247 result = unittest.TestResult()
1248 runner = unittest.TextTestRunner(stream=io.StringIO())
1249 # Use our result object
1250 runner._makeResult = lambda: result
1251
1252 self.wasRegistered = 0
1253 def fakeRegisterResult(thisResult):
1254 self.wasRegistered += 1
1255 self.assertEqual(thisResult, result)
1256 unittest.runner.registerResult = fakeRegisterResult
1257
1258 runner.run(unittest.TestSuite())
1259 self.assertEqual(self.wasRegistered, 1)
1260
1261 def test_works_with_result_without_startTestRun_stopTestRun(self):
1262 class ESC[4;38;5;81mOldTextResult(ESC[4;38;5;149mResultWithNoStartTestRunStopTestRun):
1263 separator2 = ''
1264 def printErrors(self):
1265 pass
1266
1267 class ESC[4;38;5;81mRunner(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTextTestRunner):
1268 def __init__(self):
1269 super(Runner, self).__init__(io.StringIO())
1270
1271 def _makeResult(self):
1272 return OldTextResult()
1273
1274 runner = Runner()
1275 runner.run(unittest.TestSuite())
1276
1277 def test_startTestRun_stopTestRun_called(self):
1278 class ESC[4;38;5;81mLoggingTextResult(ESC[4;38;5;149mLoggingResult):
1279 separator2 = ''
1280 def printErrors(self):
1281 pass
1282
1283 class ESC[4;38;5;81mLoggingRunner(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTextTestRunner):
1284 def __init__(self, events):
1285 super(LoggingRunner, self).__init__(io.StringIO())
1286 self._events = events
1287
1288 def _makeResult(self):
1289 return LoggingTextResult(self._events)
1290
1291 events = []
1292 runner = LoggingRunner(events)
1293 runner.run(unittest.TestSuite())
1294 expected = ['startTestRun', 'stopTestRun']
1295 self.assertEqual(events, expected)
1296
1297 def test_pickle_unpickle(self):
1298 # Issue #7197: a TextTestRunner should be (un)pickleable. This is
1299 # required by test_multiprocessing under Windows (in verbose mode).
1300 stream = io.StringIO("foo")
1301 runner = unittest.TextTestRunner(stream)
1302 for protocol in range(2, pickle.HIGHEST_PROTOCOL + 1):
1303 s = pickle.dumps(runner, protocol)
1304 obj = pickle.loads(s)
1305 # StringIO objects never compare equal, a cheap test instead.
1306 self.assertEqual(obj.stream.getvalue(), stream.getvalue())
1307
1308 def test_resultclass(self):
1309 def MockResultClass(*args):
1310 return args
1311 STREAM = object()
1312 DESCRIPTIONS = object()
1313 VERBOSITY = object()
1314 runner = unittest.TextTestRunner(STREAM, DESCRIPTIONS, VERBOSITY,
1315 resultclass=MockResultClass)
1316 self.assertEqual(runner.resultclass, MockResultClass)
1317
1318 expectedresult = (runner.stream, DESCRIPTIONS, VERBOSITY)
1319 self.assertEqual(runner._makeResult(), expectedresult)
1320
1321 @support.requires_subprocess()
1322 def test_warnings(self):
1323 """
1324 Check that warnings argument of TextTestRunner correctly affects the
1325 behavior of the warnings.
1326 """
1327 # see #10535 and the _test_warnings file for more information
1328
1329 def get_parse_out_err(p):
1330 return [b.splitlines() for b in p.communicate()]
1331 opts = dict(stdout=subprocess.PIPE, stderr=subprocess.PIPE,
1332 cwd=os.path.dirname(__file__))
1333
1334 # no args -> all the warnings are printed, unittest warnings only once
1335 p = subprocess.Popen([sys.executable, '-E', '_test_warnings.py'], **opts)
1336 with p:
1337 out, err = get_parse_out_err(p)
1338 self.assertIn(b'OK', err)
1339 # check that the total number of warnings in the output is correct
1340 self.assertEqual(len(out), 10)
1341 # check that the numbers of the different kind of warnings is correct
1342 for msg in [b'dw', b'iw', b'uw']:
1343 self.assertEqual(out.count(msg), 3)
1344 for msg in [b'rw']:
1345 self.assertEqual(out.count(msg), 1)
1346
1347 args_list = (
1348 # passing 'ignore' as warnings arg -> no warnings
1349 [sys.executable, '_test_warnings.py', 'ignore'],
1350 # -W doesn't affect the result if the arg is passed
1351 [sys.executable, '-Wa', '_test_warnings.py', 'ignore'],
1352 # -W affects the result if the arg is not passed
1353 [sys.executable, '-Wi', '_test_warnings.py']
1354 )
1355 # in all these cases no warnings are printed
1356 for args in args_list:
1357 p = subprocess.Popen(args, **opts)
1358 with p:
1359 out, err = get_parse_out_err(p)
1360 self.assertIn(b'OK', err)
1361 self.assertEqual(len(out), 0)
1362
1363
1364 # passing 'always' as warnings arg -> all the warnings printed,
1365 # unittest warnings only once
1366 p = subprocess.Popen([sys.executable, '_test_warnings.py', 'always'],
1367 **opts)
1368 with p:
1369 out, err = get_parse_out_err(p)
1370 self.assertIn(b'OK', err)
1371 self.assertEqual(len(out), 12)
1372 for msg in [b'dw', b'iw', b'uw', b'rw']:
1373 self.assertEqual(out.count(msg), 3)
1374
1375 def testStdErrLookedUpAtInstantiationTime(self):
1376 # see issue 10786
1377 old_stderr = sys.stderr
1378 f = io.StringIO()
1379 sys.stderr = f
1380 try:
1381 runner = unittest.TextTestRunner()
1382 self.assertTrue(runner.stream.stream is f)
1383 finally:
1384 sys.stderr = old_stderr
1385
1386 def testSpecifiedStreamUsed(self):
1387 # see issue 10786
1388 f = io.StringIO()
1389 runner = unittest.TextTestRunner(f)
1390 self.assertTrue(runner.stream.stream is f)
1391
1392 def test_durations(self):
1393 def run(test, *, expect_durations=True):
1394 stream = BufferedWriter()
1395 runner = unittest.TextTestRunner(stream=stream, durations=5, verbosity=2)
1396 result = runner.run(test)
1397 self.assertEqual(result.durations, 5)
1398 stream.flush()
1399 text = stream.getvalue()
1400 regex = r"\n\d+.\d\d\ds"
1401 if expect_durations:
1402 self.assertEqual(len(result.collectedDurations), 1)
1403 self.assertIn('Slowest test durations', text)
1404 self.assertRegex(text, regex)
1405 else:
1406 self.assertEqual(len(result.collectedDurations), 0)
1407 self.assertNotIn('Slowest test durations', text)
1408 self.assertNotRegex(text, regex)
1409
1410 # success
1411 class ESC[4;38;5;81mFoo(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
1412 def test_1(self):
1413 pass
1414
1415 run(Foo('test_1'), expect_durations=True)
1416
1417 # failure
1418 class ESC[4;38;5;81mFoo(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
1419 def test_1(self):
1420 self.assertEqual(0, 1)
1421
1422 run(Foo('test_1'), expect_durations=True)
1423
1424 # error
1425 class ESC[4;38;5;81mFoo(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
1426 def test_1(self):
1427 1 / 0
1428
1429 run(Foo('test_1'), expect_durations=True)
1430
1431
1432 # error in setUp and tearDown
1433 class ESC[4;38;5;81mFoo(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
1434 def setUp(self):
1435 1 / 0
1436 tearDown = setUp
1437 def test_1(self):
1438 pass
1439
1440 run(Foo('test_1'), expect_durations=True)
1441
1442 # skip (expect no durations)
1443 class ESC[4;38;5;81mFoo(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
1444 @unittest.skip("reason")
1445 def test_1(self):
1446 pass
1447
1448 run(Foo('test_1'), expect_durations=False)
1449
1450
1451
1452 if __name__ == "__main__":
1453 unittest.main()