python (3.12.0)
1 import contextlib
2 import difflib
3 import pprint
4 import pickle
5 import re
6 import sys
7 import logging
8 import warnings
9 import weakref
10 import inspect
11 import types
12
13 from copy import deepcopy
14 from test import support
15
16 import unittest
17
18 from test.test_unittest.support import (
19 TestEquality, TestHashing, LoggingResult, LegacyLoggingResult,
20 ResultWithNoStartTestRunStopTestRun
21 )
22 from test.support import captured_stderr, gc_collect
23
24
25 log_foo = logging.getLogger('foo')
26 log_foobar = logging.getLogger('foo.bar')
27 log_quux = logging.getLogger('quux')
28
29
30 class ESC[4;38;5;81mTest(ESC[4;38;5;149mobject):
31 "Keep these TestCase classes out of the main namespace"
32
33 class ESC[4;38;5;81mFoo(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
34 def runTest(self): pass
35 def test1(self): pass
36
37 class ESC[4;38;5;81mBar(ESC[4;38;5;149mFoo):
38 def test2(self): pass
39
40 class ESC[4;38;5;81mLoggingTestCase(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
41 """A test case which logs its calls."""
42
43 def __init__(self, events):
44 super(Test.LoggingTestCase, self).__init__('test')
45 self.events = events
46
47 def setUp(self):
48 self.events.append('setUp')
49
50 def test(self):
51 self.events.append('test')
52
53 def tearDown(self):
54 self.events.append('tearDown')
55
56
57 class ESC[4;38;5;81mTest_TestCase(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase, ESC[4;38;5;149mTestEquality, ESC[4;38;5;149mTestHashing):
58
59 ### Set up attributes used by inherited tests
60 ################################################################
61
62 # Used by TestHashing.test_hash and TestEquality.test_eq
63 eq_pairs = [(Test.Foo('test1'), Test.Foo('test1'))]
64
65 # Used by TestEquality.test_ne
66 ne_pairs = [(Test.Foo('test1'), Test.Foo('runTest')),
67 (Test.Foo('test1'), Test.Bar('test1')),
68 (Test.Foo('test1'), Test.Bar('test2'))]
69
70 ################################################################
71 ### /Set up attributes used by inherited tests
72
73
74 # "class TestCase([methodName])"
75 # ...
76 # "Each instance of TestCase will run a single test method: the
77 # method named methodName."
78 # ...
79 # "methodName defaults to "runTest"."
80 #
81 # Make sure it really is optional, and that it defaults to the proper
82 # thing.
83 def test_init__no_test_name(self):
84 class ESC[4;38;5;81mTest(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
85 def runTest(self): raise MyException()
86 def test(self): pass
87
88 self.assertEqual(Test().id()[-13:], '.Test.runTest')
89
90 # test that TestCase can be instantiated with no args
91 # primarily for use at the interactive interpreter
92 test = unittest.TestCase()
93 test.assertEqual(3, 3)
94 with test.assertRaises(test.failureException):
95 test.assertEqual(3, 2)
96
97 with self.assertRaises(AttributeError):
98 test.run()
99
100 # "class TestCase([methodName])"
101 # ...
102 # "Each instance of TestCase will run a single test method: the
103 # method named methodName."
104 def test_init__test_name__valid(self):
105 class ESC[4;38;5;81mTest(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
106 def runTest(self): raise MyException()
107 def test(self): pass
108
109 self.assertEqual(Test('test').id()[-10:], '.Test.test')
110
111 # "class TestCase([methodName])"
112 # ...
113 # "Each instance of TestCase will run a single test method: the
114 # method named methodName."
115 def test_init__test_name__invalid(self):
116 class ESC[4;38;5;81mTest(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
117 def runTest(self): raise MyException()
118 def test(self): pass
119
120 try:
121 Test('testfoo')
122 except ValueError:
123 pass
124 else:
125 self.fail("Failed to raise ValueError")
126
127 # "Return the number of tests represented by the this test object. For
128 # TestCase instances, this will always be 1"
129 def test_countTestCases(self):
130 class ESC[4;38;5;81mFoo(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
131 def test(self): pass
132
133 self.assertEqual(Foo('test').countTestCases(), 1)
134
135 # "Return the default type of test result object to be used to run this
136 # test. For TestCase instances, this will always be
137 # unittest.TestResult; subclasses of TestCase should
138 # override this as necessary."
139 def test_defaultTestResult(self):
140 class ESC[4;38;5;81mFoo(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
141 def runTest(self):
142 pass
143
144 result = Foo().defaultTestResult()
145 self.assertEqual(type(result), unittest.TestResult)
146
147 # "When a setUp() method is defined, the test runner will run that method
148 # prior to each test. Likewise, if a tearDown() method is defined, the
149 # test runner will invoke that method after each test. In the example,
150 # setUp() was used to create a fresh sequence for each test."
151 #
152 # Make sure the proper call order is maintained, even if setUp() raises
153 # an exception.
154 def test_run_call_order__error_in_setUp(self):
155 events = []
156 result = LoggingResult(events)
157
158 class ESC[4;38;5;81mFoo(ESC[4;38;5;149mTestESC[4;38;5;149m.ESC[4;38;5;149mLoggingTestCase):
159 def setUp(self):
160 super(Foo, self).setUp()
161 raise RuntimeError('raised by Foo.setUp')
162
163 Foo(events).run(result)
164 expected = ['startTest', 'setUp', 'addError', 'stopTest']
165 self.assertEqual(events, expected)
166
167 # "With a temporary result stopTestRun is called when setUp errors.
168 def test_run_call_order__error_in_setUp_default_result(self):
169 events = []
170
171 class ESC[4;38;5;81mFoo(ESC[4;38;5;149mTestESC[4;38;5;149m.ESC[4;38;5;149mLoggingTestCase):
172 def defaultTestResult(self):
173 return LoggingResult(self.events)
174
175 def setUp(self):
176 super(Foo, self).setUp()
177 raise RuntimeError('raised by Foo.setUp')
178
179 Foo(events).run()
180 expected = ['startTestRun', 'startTest', 'setUp', 'addError',
181 'stopTest', 'stopTestRun']
182 self.assertEqual(events, expected)
183
184 # "When a setUp() method is defined, the test runner will run that method
185 # prior to each test. Likewise, if a tearDown() method is defined, the
186 # test runner will invoke that method after each test. In the example,
187 # setUp() was used to create a fresh sequence for each test."
188 #
189 # Make sure the proper call order is maintained, even if the test raises
190 # an error (as opposed to a failure).
191 def test_run_call_order__error_in_test(self):
192 events = []
193 result = LoggingResult(events)
194
195 class ESC[4;38;5;81mFoo(ESC[4;38;5;149mTestESC[4;38;5;149m.ESC[4;38;5;149mLoggingTestCase):
196 def test(self):
197 super(Foo, self).test()
198 raise RuntimeError('raised by Foo.test')
199
200 expected = ['startTest', 'setUp', 'test',
201 'addError', 'tearDown', 'stopTest']
202 Foo(events).run(result)
203 self.assertEqual(events, expected)
204
205 # "With a default result, an error in the test still results in stopTestRun
206 # being called."
207 def test_run_call_order__error_in_test_default_result(self):
208 events = []
209
210 class ESC[4;38;5;81mFoo(ESC[4;38;5;149mTestESC[4;38;5;149m.ESC[4;38;5;149mLoggingTestCase):
211 def defaultTestResult(self):
212 return LoggingResult(self.events)
213
214 def test(self):
215 super(Foo, self).test()
216 raise RuntimeError('raised by Foo.test')
217
218 expected = ['startTestRun', 'startTest', 'setUp', 'test',
219 'addError', 'tearDown', 'stopTest', 'stopTestRun']
220 Foo(events).run()
221 self.assertEqual(events, expected)
222
223 # "When a setUp() method is defined, the test runner will run that method
224 # prior to each test. Likewise, if a tearDown() method is defined, the
225 # test runner will invoke that method after each test. In the example,
226 # setUp() was used to create a fresh sequence for each test."
227 #
228 # Make sure the proper call order is maintained, even if the test signals
229 # a failure (as opposed to an error).
230 def test_run_call_order__failure_in_test(self):
231 events = []
232 result = LoggingResult(events)
233
234 class ESC[4;38;5;81mFoo(ESC[4;38;5;149mTestESC[4;38;5;149m.ESC[4;38;5;149mLoggingTestCase):
235 def test(self):
236 super(Foo, self).test()
237 self.fail('raised by Foo.test')
238
239 expected = ['startTest', 'setUp', 'test',
240 'addFailure', 'tearDown', 'stopTest']
241 Foo(events).run(result)
242 self.assertEqual(events, expected)
243
244 # "When a test fails with a default result stopTestRun is still called."
245 def test_run_call_order__failure_in_test_default_result(self):
246
247 class ESC[4;38;5;81mFoo(ESC[4;38;5;149mTestESC[4;38;5;149m.ESC[4;38;5;149mLoggingTestCase):
248 def defaultTestResult(self):
249 return LoggingResult(self.events)
250 def test(self):
251 super(Foo, self).test()
252 self.fail('raised by Foo.test')
253
254 expected = ['startTestRun', 'startTest', 'setUp', 'test',
255 'addFailure', 'tearDown', 'stopTest', 'stopTestRun']
256 events = []
257 Foo(events).run()
258 self.assertEqual(events, expected)
259
260 # "When a setUp() method is defined, the test runner will run that method
261 # prior to each test. Likewise, if a tearDown() method is defined, the
262 # test runner will invoke that method after each test. In the example,
263 # setUp() was used to create a fresh sequence for each test."
264 #
265 # Make sure the proper call order is maintained, even if tearDown() raises
266 # an exception.
267 def test_run_call_order__error_in_tearDown(self):
268 events = []
269 result = LoggingResult(events)
270
271 class ESC[4;38;5;81mFoo(ESC[4;38;5;149mTestESC[4;38;5;149m.ESC[4;38;5;149mLoggingTestCase):
272 def tearDown(self):
273 super(Foo, self).tearDown()
274 raise RuntimeError('raised by Foo.tearDown')
275
276 Foo(events).run(result)
277 expected = ['startTest', 'setUp', 'test', 'tearDown', 'addError',
278 'stopTest']
279 self.assertEqual(events, expected)
280
281 # "When tearDown errors with a default result stopTestRun is still called."
282 def test_run_call_order__error_in_tearDown_default_result(self):
283
284 class ESC[4;38;5;81mFoo(ESC[4;38;5;149mTestESC[4;38;5;149m.ESC[4;38;5;149mLoggingTestCase):
285 def defaultTestResult(self):
286 return LoggingResult(self.events)
287 def tearDown(self):
288 super(Foo, self).tearDown()
289 raise RuntimeError('raised by Foo.tearDown')
290
291 events = []
292 Foo(events).run()
293 expected = ['startTestRun', 'startTest', 'setUp', 'test', 'tearDown',
294 'addError', 'stopTest', 'stopTestRun']
295 self.assertEqual(events, expected)
296
297 # "TestCase.run() still works when the defaultTestResult is a TestResult
298 # that does not support startTestRun and stopTestRun.
299 def test_run_call_order_default_result(self):
300
301 class ESC[4;38;5;81mFoo(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
302 def defaultTestResult(self):
303 return ResultWithNoStartTestRunStopTestRun()
304 def test(self):
305 pass
306
307 with self.assertWarns(RuntimeWarning):
308 Foo('test').run()
309
310 def test_deprecation_of_return_val_from_test(self):
311 # Issue 41322 - deprecate return of value that is not None from a test
312 class ESC[4;38;5;81mNothing:
313 def __eq__(self, o):
314 return o is None
315 class ESC[4;38;5;81mFoo(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
316 def test1(self):
317 return 1
318 def test2(self):
319 yield 1
320 def test3(self):
321 return Nothing()
322
323 with self.assertWarns(DeprecationWarning) as w:
324 Foo('test1').run()
325 self.assertIn('It is deprecated to return a value that is not None', str(w.warning))
326 self.assertIn('test1', str(w.warning))
327 self.assertEqual(w.filename, __file__)
328
329 with self.assertWarns(DeprecationWarning) as w:
330 Foo('test2').run()
331 self.assertIn('It is deprecated to return a value that is not None', str(w.warning))
332 self.assertIn('test2', str(w.warning))
333 self.assertEqual(w.filename, __file__)
334
335 with self.assertWarns(DeprecationWarning) as w:
336 Foo('test3').run()
337 self.assertIn('It is deprecated to return a value that is not None', str(w.warning))
338 self.assertIn('test3', str(w.warning))
339 self.assertEqual(w.filename, __file__)
340
341 def _check_call_order__subtests(self, result, events, expected_events):
342 class ESC[4;38;5;81mFoo(ESC[4;38;5;149mTestESC[4;38;5;149m.ESC[4;38;5;149mLoggingTestCase):
343 def test(self):
344 super(Foo, self).test()
345 for i in [1, 2, 3]:
346 with self.subTest(i=i):
347 if i == 1:
348 self.fail('failure')
349 for j in [2, 3]:
350 with self.subTest(j=j):
351 if i * j == 6:
352 raise RuntimeError('raised by Foo.test')
353 1 / 0
354
355 # Order is the following:
356 # i=1 => subtest failure
357 # i=2, j=2 => subtest success
358 # i=2, j=3 => subtest error
359 # i=3, j=2 => subtest error
360 # i=3, j=3 => subtest success
361 # toplevel => error
362 Foo(events).run(result)
363 self.assertEqual(events, expected_events)
364
365 def test_run_call_order__subtests(self):
366 events = []
367 result = LoggingResult(events)
368 expected = ['startTest', 'setUp', 'test',
369 'addSubTestFailure', 'addSubTestSuccess',
370 'addSubTestFailure', 'addSubTestFailure',
371 'addSubTestSuccess', 'addError', 'tearDown', 'stopTest']
372 self._check_call_order__subtests(result, events, expected)
373
374 def test_run_call_order__subtests_legacy(self):
375 # With a legacy result object (without an addSubTest method),
376 # text execution stops after the first subtest failure.
377 events = []
378 result = LegacyLoggingResult(events)
379 expected = ['startTest', 'setUp', 'test',
380 'addFailure', 'tearDown', 'stopTest']
381 self._check_call_order__subtests(result, events, expected)
382
383 def _check_call_order__subtests_success(self, result, events, expected_events):
384 class ESC[4;38;5;81mFoo(ESC[4;38;5;149mTestESC[4;38;5;149m.ESC[4;38;5;149mLoggingTestCase):
385 def test(self):
386 super(Foo, self).test()
387 for i in [1, 2]:
388 with self.subTest(i=i):
389 for j in [2, 3]:
390 with self.subTest(j=j):
391 pass
392
393 Foo(events).run(result)
394 self.assertEqual(events, expected_events)
395
396 def test_run_call_order__subtests_success(self):
397 events = []
398 result = LoggingResult(events)
399 # The 6 subtest successes are individually recorded, in addition
400 # to the whole test success.
401 expected = (['startTest', 'setUp', 'test']
402 + 6 * ['addSubTestSuccess']
403 + ['tearDown', 'addSuccess', 'stopTest'])
404 self._check_call_order__subtests_success(result, events, expected)
405
406 def test_run_call_order__subtests_success_legacy(self):
407 # With a legacy result, only the whole test success is recorded.
408 events = []
409 result = LegacyLoggingResult(events)
410 expected = ['startTest', 'setUp', 'test', 'tearDown',
411 'addSuccess', 'stopTest']
412 self._check_call_order__subtests_success(result, events, expected)
413
414 def test_run_call_order__subtests_failfast(self):
415 events = []
416 result = LoggingResult(events)
417 result.failfast = True
418
419 class ESC[4;38;5;81mFoo(ESC[4;38;5;149mTestESC[4;38;5;149m.ESC[4;38;5;149mLoggingTestCase):
420 def test(self):
421 super(Foo, self).test()
422 with self.subTest(i=1):
423 self.fail('failure')
424 with self.subTest(i=2):
425 self.fail('failure')
426 self.fail('failure')
427
428 expected = ['startTest', 'setUp', 'test',
429 'addSubTestFailure', 'tearDown', 'stopTest']
430 Foo(events).run(result)
431 self.assertEqual(events, expected)
432
433 def test_subtests_failfast(self):
434 # Ensure proper test flow with subtests and failfast (issue #22894)
435 events = []
436
437 class ESC[4;38;5;81mFoo(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
438 def test_a(self):
439 with self.subTest():
440 events.append('a1')
441 events.append('a2')
442
443 def test_b(self):
444 with self.subTest():
445 events.append('b1')
446 with self.subTest():
447 self.fail('failure')
448 events.append('b2')
449
450 def test_c(self):
451 events.append('c')
452
453 result = unittest.TestResult()
454 result.failfast = True
455 suite = unittest.TestLoader().loadTestsFromTestCase(Foo)
456 suite.run(result)
457
458 expected = ['a1', 'a2', 'b1']
459 self.assertEqual(events, expected)
460
461 def test_subtests_debug(self):
462 # Test debug() with a test that uses subTest() (bpo-34900)
463 events = []
464
465 class ESC[4;38;5;81mFoo(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
466 def test_a(self):
467 events.append('test case')
468 with self.subTest():
469 events.append('subtest 1')
470
471 Foo('test_a').debug()
472
473 self.assertEqual(events, ['test case', 'subtest 1'])
474
475 # "This class attribute gives the exception raised by the test() method.
476 # If a test framework needs to use a specialized exception, possibly to
477 # carry additional information, it must subclass this exception in
478 # order to ``play fair'' with the framework. The initial value of this
479 # attribute is AssertionError"
480 def test_failureException__default(self):
481 class ESC[4;38;5;81mFoo(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
482 def test(self):
483 pass
484
485 self.assertIs(Foo('test').failureException, AssertionError)
486
487 # "This class attribute gives the exception raised by the test() method.
488 # If a test framework needs to use a specialized exception, possibly to
489 # carry additional information, it must subclass this exception in
490 # order to ``play fair'' with the framework."
491 #
492 # Make sure TestCase.run() respects the designated failureException
493 def test_failureException__subclassing__explicit_raise(self):
494 events = []
495 result = LoggingResult(events)
496
497 class ESC[4;38;5;81mFoo(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
498 def test(self):
499 raise RuntimeError()
500
501 failureException = RuntimeError
502
503 self.assertIs(Foo('test').failureException, RuntimeError)
504
505
506 Foo('test').run(result)
507 expected = ['startTest', 'addFailure', 'stopTest']
508 self.assertEqual(events, expected)
509
510 # "This class attribute gives the exception raised by the test() method.
511 # If a test framework needs to use a specialized exception, possibly to
512 # carry additional information, it must subclass this exception in
513 # order to ``play fair'' with the framework."
514 #
515 # Make sure TestCase.run() respects the designated failureException
516 def test_failureException__subclassing__implicit_raise(self):
517 events = []
518 result = LoggingResult(events)
519
520 class ESC[4;38;5;81mFoo(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
521 def test(self):
522 self.fail("foo")
523
524 failureException = RuntimeError
525
526 self.assertIs(Foo('test').failureException, RuntimeError)
527
528
529 Foo('test').run(result)
530 expected = ['startTest', 'addFailure', 'stopTest']
531 self.assertEqual(events, expected)
532
533 # "The default implementation does nothing."
534 def test_setUp(self):
535 class ESC[4;38;5;81mFoo(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
536 def runTest(self):
537 pass
538
539 # ... and nothing should happen
540 Foo().setUp()
541
542 # "The default implementation does nothing."
543 def test_tearDown(self):
544 class ESC[4;38;5;81mFoo(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
545 def runTest(self):
546 pass
547
548 # ... and nothing should happen
549 Foo().tearDown()
550
551 # "Return a string identifying the specific test case."
552 #
553 # Because of the vague nature of the docs, I'm not going to lock this
554 # test down too much. Really all that can be asserted is that the id()
555 # will be a string (either 8-byte or unicode -- again, because the docs
556 # just say "string")
557 def test_id(self):
558 class ESC[4;38;5;81mFoo(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
559 def runTest(self):
560 pass
561
562 self.assertIsInstance(Foo().id(), str)
563
564
565 # "If result is omitted or None, a temporary result object is created,
566 # used, and is made available to the caller. As TestCase owns the
567 # temporary result startTestRun and stopTestRun are called.
568
569 def test_run__uses_defaultTestResult(self):
570 events = []
571 defaultResult = LoggingResult(events)
572
573 class ESC[4;38;5;81mFoo(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
574 def test(self):
575 events.append('test')
576
577 def defaultTestResult(self):
578 return defaultResult
579
580 # Make run() find a result object on its own
581 result = Foo('test').run()
582
583 self.assertIs(result, defaultResult)
584 expected = ['startTestRun', 'startTest', 'test', 'addSuccess',
585 'stopTest', 'stopTestRun']
586 self.assertEqual(events, expected)
587
588
589 # "The result object is returned to run's caller"
590 def test_run__returns_given_result(self):
591
592 class ESC[4;38;5;81mFoo(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
593 def test(self):
594 pass
595
596 result = unittest.TestResult()
597
598 retval = Foo('test').run(result)
599 self.assertIs(retval, result)
600
601
602 # "The same effect [as method run] may be had by simply calling the
603 # TestCase instance."
604 def test_call__invoking_an_instance_delegates_to_run(self):
605 resultIn = unittest.TestResult()
606 resultOut = unittest.TestResult()
607
608 class ESC[4;38;5;81mFoo(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
609 def test(self):
610 pass
611
612 def run(self, result):
613 self.assertIs(result, resultIn)
614 return resultOut
615
616 retval = Foo('test')(resultIn)
617
618 self.assertIs(retval, resultOut)
619
620
621 def testShortDescriptionWithoutDocstring(self):
622 self.assertIsNone(self.shortDescription())
623
624 @unittest.skipIf(sys.flags.optimize >= 2,
625 "Docstrings are omitted with -O2 and above")
626 def testShortDescriptionWithOneLineDocstring(self):
627 """Tests shortDescription() for a method with a docstring."""
628 self.assertEqual(
629 self.shortDescription(),
630 'Tests shortDescription() for a method with a docstring.')
631
632 @unittest.skipIf(sys.flags.optimize >= 2,
633 "Docstrings are omitted with -O2 and above")
634 def testShortDescriptionWithMultiLineDocstring(self):
635 """Tests shortDescription() for a method with a longer docstring.
636
637 This method ensures that only the first line of a docstring is
638 returned used in the short description, no matter how long the
639 whole thing is.
640 """
641 self.assertEqual(
642 self.shortDescription(),
643 'Tests shortDescription() for a method with a longer '
644 'docstring.')
645
646 @unittest.skipIf(sys.flags.optimize >= 2,
647 "Docstrings are omitted with -O2 and above")
648 def testShortDescriptionWhitespaceTrimming(self):
649 """
650 Tests shortDescription() whitespace is trimmed, so that the first
651 line of nonwhite-space text becomes the docstring.
652 """
653 self.assertEqual(
654 self.shortDescription(),
655 'Tests shortDescription() whitespace is trimmed, so that the first')
656
657 def testAddTypeEqualityFunc(self):
658 class ESC[4;38;5;81mSadSnake(ESC[4;38;5;149mobject):
659 """Dummy class for test_addTypeEqualityFunc."""
660 s1, s2 = SadSnake(), SadSnake()
661 self.assertFalse(s1 == s2)
662 def AllSnakesCreatedEqual(a, b, msg=None):
663 return type(a) == type(b) == SadSnake
664 self.addTypeEqualityFunc(SadSnake, AllSnakesCreatedEqual)
665 self.assertEqual(s1, s2)
666 # No this doesn't clean up and remove the SadSnake equality func
667 # from this TestCase instance but since it's local nothing else
668 # will ever notice that.
669
670 def testAssertIs(self):
671 thing = object()
672 self.assertIs(thing, thing)
673 self.assertRaises(self.failureException, self.assertIs, thing, object())
674
675 def testAssertIsNot(self):
676 thing = object()
677 self.assertIsNot(thing, object())
678 self.assertRaises(self.failureException, self.assertIsNot, thing, thing)
679
680 def testAssertIsInstance(self):
681 thing = []
682 self.assertIsInstance(thing, list)
683 self.assertRaises(self.failureException, self.assertIsInstance,
684 thing, dict)
685
686 def testAssertNotIsInstance(self):
687 thing = []
688 self.assertNotIsInstance(thing, dict)
689 self.assertRaises(self.failureException, self.assertNotIsInstance,
690 thing, list)
691
692 def testAssertIn(self):
693 animals = {'monkey': 'banana', 'cow': 'grass', 'seal': 'fish'}
694
695 self.assertIn('a', 'abc')
696 self.assertIn(2, [1, 2, 3])
697 self.assertIn('monkey', animals)
698
699 self.assertNotIn('d', 'abc')
700 self.assertNotIn(0, [1, 2, 3])
701 self.assertNotIn('otter', animals)
702
703 self.assertRaises(self.failureException, self.assertIn, 'x', 'abc')
704 self.assertRaises(self.failureException, self.assertIn, 4, [1, 2, 3])
705 self.assertRaises(self.failureException, self.assertIn, 'elephant',
706 animals)
707
708 self.assertRaises(self.failureException, self.assertNotIn, 'c', 'abc')
709 self.assertRaises(self.failureException, self.assertNotIn, 1, [1, 2, 3])
710 self.assertRaises(self.failureException, self.assertNotIn, 'cow',
711 animals)
712
713 def testAssertEqual(self):
714 equal_pairs = [
715 ((), ()),
716 ({}, {}),
717 ([], []),
718 (set(), set()),
719 (frozenset(), frozenset())]
720 for a, b in equal_pairs:
721 # This mess of try excepts is to test the assertEqual behavior
722 # itself.
723 try:
724 self.assertEqual(a, b)
725 except self.failureException:
726 self.fail('assertEqual(%r, %r) failed' % (a, b))
727 try:
728 self.assertEqual(a, b, msg='foo')
729 except self.failureException:
730 self.fail('assertEqual(%r, %r) with msg= failed' % (a, b))
731 try:
732 self.assertEqual(a, b, 'foo')
733 except self.failureException:
734 self.fail('assertEqual(%r, %r) with third parameter failed' %
735 (a, b))
736
737 unequal_pairs = [
738 ((), []),
739 ({}, set()),
740 (set([4,1]), frozenset([4,2])),
741 (frozenset([4,5]), set([2,3])),
742 (set([3,4]), set([5,4]))]
743 for a, b in unequal_pairs:
744 self.assertRaises(self.failureException, self.assertEqual, a, b)
745 self.assertRaises(self.failureException, self.assertEqual, a, b,
746 'foo')
747 self.assertRaises(self.failureException, self.assertEqual, a, b,
748 msg='foo')
749
750 def testEquality(self):
751 self.assertListEqual([], [])
752 self.assertTupleEqual((), ())
753 self.assertSequenceEqual([], ())
754
755 a = [0, 'a', []]
756 b = []
757 self.assertRaises(unittest.TestCase.failureException,
758 self.assertListEqual, a, b)
759 self.assertRaises(unittest.TestCase.failureException,
760 self.assertListEqual, tuple(a), tuple(b))
761 self.assertRaises(unittest.TestCase.failureException,
762 self.assertSequenceEqual, a, tuple(b))
763
764 b.extend(a)
765 self.assertListEqual(a, b)
766 self.assertTupleEqual(tuple(a), tuple(b))
767 self.assertSequenceEqual(a, tuple(b))
768 self.assertSequenceEqual(tuple(a), b)
769
770 self.assertRaises(self.failureException, self.assertListEqual,
771 a, tuple(b))
772 self.assertRaises(self.failureException, self.assertTupleEqual,
773 tuple(a), b)
774 self.assertRaises(self.failureException, self.assertListEqual, None, b)
775 self.assertRaises(self.failureException, self.assertTupleEqual, None,
776 tuple(b))
777 self.assertRaises(self.failureException, self.assertSequenceEqual,
778 None, tuple(b))
779 self.assertRaises(self.failureException, self.assertListEqual, 1, 1)
780 self.assertRaises(self.failureException, self.assertTupleEqual, 1, 1)
781 self.assertRaises(self.failureException, self.assertSequenceEqual,
782 1, 1)
783
784 self.assertDictEqual({}, {})
785
786 c = { 'x': 1 }
787 d = {}
788 self.assertRaises(unittest.TestCase.failureException,
789 self.assertDictEqual, c, d)
790
791 d.update(c)
792 self.assertDictEqual(c, d)
793
794 d['x'] = 0
795 self.assertRaises(unittest.TestCase.failureException,
796 self.assertDictEqual, c, d, 'These are unequal')
797
798 self.assertRaises(self.failureException, self.assertDictEqual, None, d)
799 self.assertRaises(self.failureException, self.assertDictEqual, [], d)
800 self.assertRaises(self.failureException, self.assertDictEqual, 1, 1)
801
802 def testAssertSequenceEqualMaxDiff(self):
803 self.assertEqual(self.maxDiff, 80*8)
804 seq1 = 'a' + 'x' * 80**2
805 seq2 = 'b' + 'x' * 80**2
806 diff = '\n'.join(difflib.ndiff(pprint.pformat(seq1).splitlines(),
807 pprint.pformat(seq2).splitlines()))
808 # the +1 is the leading \n added by assertSequenceEqual
809 omitted = unittest.case.DIFF_OMITTED % (len(diff) + 1,)
810
811 self.maxDiff = len(diff)//2
812 try:
813
814 self.assertSequenceEqual(seq1, seq2)
815 except self.failureException as e:
816 msg = e.args[0]
817 else:
818 self.fail('assertSequenceEqual did not fail.')
819 self.assertLess(len(msg), len(diff))
820 self.assertIn(omitted, msg)
821
822 self.maxDiff = len(diff) * 2
823 try:
824 self.assertSequenceEqual(seq1, seq2)
825 except self.failureException as e:
826 msg = e.args[0]
827 else:
828 self.fail('assertSequenceEqual did not fail.')
829 self.assertGreater(len(msg), len(diff))
830 self.assertNotIn(omitted, msg)
831
832 self.maxDiff = None
833 try:
834 self.assertSequenceEqual(seq1, seq2)
835 except self.failureException as e:
836 msg = e.args[0]
837 else:
838 self.fail('assertSequenceEqual did not fail.')
839 self.assertGreater(len(msg), len(diff))
840 self.assertNotIn(omitted, msg)
841
842 def testTruncateMessage(self):
843 self.maxDiff = 1
844 message = self._truncateMessage('foo', 'bar')
845 omitted = unittest.case.DIFF_OMITTED % len('bar')
846 self.assertEqual(message, 'foo' + omitted)
847
848 self.maxDiff = None
849 message = self._truncateMessage('foo', 'bar')
850 self.assertEqual(message, 'foobar')
851
852 self.maxDiff = 4
853 message = self._truncateMessage('foo', 'bar')
854 self.assertEqual(message, 'foobar')
855
856 def testAssertDictEqualTruncates(self):
857 test = unittest.TestCase('assertEqual')
858 def truncate(msg, diff):
859 return 'foo'
860 test._truncateMessage = truncate
861 try:
862 test.assertDictEqual({}, {1: 0})
863 except self.failureException as e:
864 self.assertEqual(str(e), 'foo')
865 else:
866 self.fail('assertDictEqual did not fail')
867
868 def testAssertMultiLineEqualTruncates(self):
869 test = unittest.TestCase('assertEqual')
870 def truncate(msg, diff):
871 return 'foo'
872 test._truncateMessage = truncate
873 try:
874 test.assertMultiLineEqual('foo', 'bar')
875 except self.failureException as e:
876 self.assertEqual(str(e), 'foo')
877 else:
878 self.fail('assertMultiLineEqual did not fail')
879
880 def testAssertEqual_diffThreshold(self):
881 # check threshold value
882 self.assertEqual(self._diffThreshold, 2**16)
883 # disable madDiff to get diff markers
884 self.maxDiff = None
885
886 # set a lower threshold value and add a cleanup to restore it
887 old_threshold = self._diffThreshold
888 self._diffThreshold = 2**5
889 self.addCleanup(lambda: setattr(self, '_diffThreshold', old_threshold))
890
891 # under the threshold: diff marker (^) in error message
892 s = 'x' * (2**4)
893 with self.assertRaises(self.failureException) as cm:
894 self.assertEqual(s + 'a', s + 'b')
895 self.assertIn('^', str(cm.exception))
896 self.assertEqual(s + 'a', s + 'a')
897
898 # over the threshold: diff not used and marker (^) not in error message
899 s = 'x' * (2**6)
900 # if the path that uses difflib is taken, _truncateMessage will be
901 # called -- replace it with explodingTruncation to verify that this
902 # doesn't happen
903 def explodingTruncation(message, diff):
904 raise SystemError('this should not be raised')
905 old_truncate = self._truncateMessage
906 self._truncateMessage = explodingTruncation
907 self.addCleanup(lambda: setattr(self, '_truncateMessage', old_truncate))
908
909 s1, s2 = s + 'a', s + 'b'
910 with self.assertRaises(self.failureException) as cm:
911 self.assertEqual(s1, s2)
912 self.assertNotIn('^', str(cm.exception))
913 self.assertEqual(str(cm.exception), '%r != %r' % (s1, s2))
914 self.assertEqual(s + 'a', s + 'a')
915
916 def testAssertEqual_shorten(self):
917 # set a lower threshold value and add a cleanup to restore it
918 old_threshold = self._diffThreshold
919 self._diffThreshold = 0
920 self.addCleanup(lambda: setattr(self, '_diffThreshold', old_threshold))
921
922 s = 'x' * 100
923 s1, s2 = s + 'a', s + 'b'
924 with self.assertRaises(self.failureException) as cm:
925 self.assertEqual(s1, s2)
926 c = 'xxxx[35 chars]' + 'x' * 61
927 self.assertEqual(str(cm.exception), "'%sa' != '%sb'" % (c, c))
928 self.assertEqual(s + 'a', s + 'a')
929
930 p = 'y' * 50
931 s1, s2 = s + 'a' + p, s + 'b' + p
932 with self.assertRaises(self.failureException) as cm:
933 self.assertEqual(s1, s2)
934 c = 'xxxx[85 chars]xxxxxxxxxxx'
935 self.assertEqual(str(cm.exception), "'%sa%s' != '%sb%s'" % (c, p, c, p))
936
937 p = 'y' * 100
938 s1, s2 = s + 'a' + p, s + 'b' + p
939 with self.assertRaises(self.failureException) as cm:
940 self.assertEqual(s1, s2)
941 c = 'xxxx[91 chars]xxxxx'
942 d = 'y' * 40 + '[56 chars]yyyy'
943 self.assertEqual(str(cm.exception), "'%sa%s' != '%sb%s'" % (c, d, c, d))
944
945 def testAssertCountEqual(self):
946 a = object()
947 self.assertCountEqual([1, 2, 3], [3, 2, 1])
948 self.assertCountEqual(['foo', 'bar', 'baz'], ['bar', 'baz', 'foo'])
949 self.assertCountEqual([a, a, 2, 2, 3], (a, 2, 3, a, 2))
950 self.assertCountEqual([1, "2", "a", "a"], ["a", "2", True, "a"])
951 self.assertRaises(self.failureException, self.assertCountEqual,
952 [1, 2] + [3] * 100, [1] * 100 + [2, 3])
953 self.assertRaises(self.failureException, self.assertCountEqual,
954 [1, "2", "a", "a"], ["a", "2", True, 1])
955 self.assertRaises(self.failureException, self.assertCountEqual,
956 [10], [10, 11])
957 self.assertRaises(self.failureException, self.assertCountEqual,
958 [10, 11], [10])
959 self.assertRaises(self.failureException, self.assertCountEqual,
960 [10, 11, 10], [10, 11])
961
962 # Test that sequences of unhashable objects can be tested for sameness:
963 self.assertCountEqual([[1, 2], [3, 4], 0], [False, [3, 4], [1, 2]])
964 # Test that iterator of unhashable objects can be tested for sameness:
965 self.assertCountEqual(iter([1, 2, [], 3, 4]),
966 iter([1, 2, [], 3, 4]))
967
968 # hashable types, but not orderable
969 self.assertRaises(self.failureException, self.assertCountEqual,
970 [], [divmod, 'x', 1, 5j, 2j, frozenset()])
971 # comparing dicts
972 self.assertCountEqual([{'a': 1}, {'b': 2}], [{'b': 2}, {'a': 1}])
973 # comparing heterogeneous non-hashable sequences
974 self.assertCountEqual([1, 'x', divmod, []], [divmod, [], 'x', 1])
975 self.assertRaises(self.failureException, self.assertCountEqual,
976 [], [divmod, [], 'x', 1, 5j, 2j, set()])
977 self.assertRaises(self.failureException, self.assertCountEqual,
978 [[1]], [[2]])
979
980 # Same elements, but not same sequence length
981 self.assertRaises(self.failureException, self.assertCountEqual,
982 [1, 1, 2], [2, 1])
983 self.assertRaises(self.failureException, self.assertCountEqual,
984 [1, 1, "2", "a", "a"], ["2", "2", True, "a"])
985 self.assertRaises(self.failureException, self.assertCountEqual,
986 [1, {'b': 2}, None, True], [{'b': 2}, True, None])
987
988 # Same elements which don't reliably compare, in
989 # different order, see issue 10242
990 a = [{2,4}, {1,2}]
991 b = a[::-1]
992 self.assertCountEqual(a, b)
993
994 # test utility functions supporting assertCountEqual()
995
996 diffs = set(unittest.util._count_diff_all_purpose('aaabccd', 'abbbcce'))
997 expected = {(3,1,'a'), (1,3,'b'), (1,0,'d'), (0,1,'e')}
998 self.assertEqual(diffs, expected)
999
1000 diffs = unittest.util._count_diff_all_purpose([[]], [])
1001 self.assertEqual(diffs, [(1, 0, [])])
1002
1003 diffs = set(unittest.util._count_diff_hashable('aaabccd', 'abbbcce'))
1004 expected = {(3,1,'a'), (1,3,'b'), (1,0,'d'), (0,1,'e')}
1005 self.assertEqual(diffs, expected)
1006
1007 def testAssertSetEqual(self):
1008 set1 = set()
1009 set2 = set()
1010 self.assertSetEqual(set1, set2)
1011
1012 self.assertRaises(self.failureException, self.assertSetEqual, None, set2)
1013 self.assertRaises(self.failureException, self.assertSetEqual, [], set2)
1014 self.assertRaises(self.failureException, self.assertSetEqual, set1, None)
1015 self.assertRaises(self.failureException, self.assertSetEqual, set1, [])
1016
1017 set1 = set(['a'])
1018 set2 = set()
1019 self.assertRaises(self.failureException, self.assertSetEqual, set1, set2)
1020
1021 set1 = set(['a'])
1022 set2 = set(['a'])
1023 self.assertSetEqual(set1, set2)
1024
1025 set1 = set(['a'])
1026 set2 = set(['a', 'b'])
1027 self.assertRaises(self.failureException, self.assertSetEqual, set1, set2)
1028
1029 set1 = set(['a'])
1030 set2 = frozenset(['a', 'b'])
1031 self.assertRaises(self.failureException, self.assertSetEqual, set1, set2)
1032
1033 set1 = set(['a', 'b'])
1034 set2 = frozenset(['a', 'b'])
1035 self.assertSetEqual(set1, set2)
1036
1037 set1 = set()
1038 set2 = "foo"
1039 self.assertRaises(self.failureException, self.assertSetEqual, set1, set2)
1040 self.assertRaises(self.failureException, self.assertSetEqual, set2, set1)
1041
1042 # make sure any string formatting is tuple-safe
1043 set1 = set([(0, 1), (2, 3)])
1044 set2 = set([(4, 5)])
1045 self.assertRaises(self.failureException, self.assertSetEqual, set1, set2)
1046
1047 def testInequality(self):
1048 # Try ints
1049 self.assertGreater(2, 1)
1050 self.assertGreaterEqual(2, 1)
1051 self.assertGreaterEqual(1, 1)
1052 self.assertLess(1, 2)
1053 self.assertLessEqual(1, 2)
1054 self.assertLessEqual(1, 1)
1055 self.assertRaises(self.failureException, self.assertGreater, 1, 2)
1056 self.assertRaises(self.failureException, self.assertGreater, 1, 1)
1057 self.assertRaises(self.failureException, self.assertGreaterEqual, 1, 2)
1058 self.assertRaises(self.failureException, self.assertLess, 2, 1)
1059 self.assertRaises(self.failureException, self.assertLess, 1, 1)
1060 self.assertRaises(self.failureException, self.assertLessEqual, 2, 1)
1061
1062 # Try Floats
1063 self.assertGreater(1.1, 1.0)
1064 self.assertGreaterEqual(1.1, 1.0)
1065 self.assertGreaterEqual(1.0, 1.0)
1066 self.assertLess(1.0, 1.1)
1067 self.assertLessEqual(1.0, 1.1)
1068 self.assertLessEqual(1.0, 1.0)
1069 self.assertRaises(self.failureException, self.assertGreater, 1.0, 1.1)
1070 self.assertRaises(self.failureException, self.assertGreater, 1.0, 1.0)
1071 self.assertRaises(self.failureException, self.assertGreaterEqual, 1.0, 1.1)
1072 self.assertRaises(self.failureException, self.assertLess, 1.1, 1.0)
1073 self.assertRaises(self.failureException, self.assertLess, 1.0, 1.0)
1074 self.assertRaises(self.failureException, self.assertLessEqual, 1.1, 1.0)
1075
1076 # Try Strings
1077 self.assertGreater('bug', 'ant')
1078 self.assertGreaterEqual('bug', 'ant')
1079 self.assertGreaterEqual('ant', 'ant')
1080 self.assertLess('ant', 'bug')
1081 self.assertLessEqual('ant', 'bug')
1082 self.assertLessEqual('ant', 'ant')
1083 self.assertRaises(self.failureException, self.assertGreater, 'ant', 'bug')
1084 self.assertRaises(self.failureException, self.assertGreater, 'ant', 'ant')
1085 self.assertRaises(self.failureException, self.assertGreaterEqual, 'ant', 'bug')
1086 self.assertRaises(self.failureException, self.assertLess, 'bug', 'ant')
1087 self.assertRaises(self.failureException, self.assertLess, 'ant', 'ant')
1088 self.assertRaises(self.failureException, self.assertLessEqual, 'bug', 'ant')
1089
1090 # Try bytes
1091 self.assertGreater(b'bug', b'ant')
1092 self.assertGreaterEqual(b'bug', b'ant')
1093 self.assertGreaterEqual(b'ant', b'ant')
1094 self.assertLess(b'ant', b'bug')
1095 self.assertLessEqual(b'ant', b'bug')
1096 self.assertLessEqual(b'ant', b'ant')
1097 self.assertRaises(self.failureException, self.assertGreater, b'ant', b'bug')
1098 self.assertRaises(self.failureException, self.assertGreater, b'ant', b'ant')
1099 self.assertRaises(self.failureException, self.assertGreaterEqual, b'ant',
1100 b'bug')
1101 self.assertRaises(self.failureException, self.assertLess, b'bug', b'ant')
1102 self.assertRaises(self.failureException, self.assertLess, b'ant', b'ant')
1103 self.assertRaises(self.failureException, self.assertLessEqual, b'bug', b'ant')
1104
1105 def testAssertMultiLineEqual(self):
1106 sample_text = """\
1107 http://www.python.org/doc/2.3/lib/module-unittest.html
1108 test case
1109 A test case is the smallest unit of testing. [...]
1110 """
1111 revised_sample_text = """\
1112 http://www.python.org/doc/2.4.1/lib/module-unittest.html
1113 test case
1114 A test case is the smallest unit of testing. [...] You may provide your
1115 own implementation that does not subclass from TestCase, of course.
1116 """
1117 sample_text_error = """\
1118 - http://www.python.org/doc/2.3/lib/module-unittest.html
1119 ? ^
1120 + http://www.python.org/doc/2.4.1/lib/module-unittest.html
1121 ? ^^^
1122 test case
1123 - A test case is the smallest unit of testing. [...]
1124 + A test case is the smallest unit of testing. [...] You may provide your
1125 ? +++++++++++++++++++++
1126 + own implementation that does not subclass from TestCase, of course.
1127 """
1128 self.maxDiff = None
1129 try:
1130 self.assertMultiLineEqual(sample_text, revised_sample_text)
1131 except self.failureException as e:
1132 # need to remove the first line of the error message
1133 error = str(e).split('\n', 1)[1]
1134 self.assertEqual(sample_text_error, error)
1135
1136 def testAssertEqualSingleLine(self):
1137 sample_text = "laden swallows fly slowly"
1138 revised_sample_text = "unladen swallows fly quickly"
1139 sample_text_error = """\
1140 - laden swallows fly slowly
1141 ? ^^^^
1142 + unladen swallows fly quickly
1143 ? ++ ^^^^^
1144 """
1145 try:
1146 self.assertEqual(sample_text, revised_sample_text)
1147 except self.failureException as e:
1148 # need to remove the first line of the error message
1149 error = str(e).split('\n', 1)[1]
1150 self.assertEqual(sample_text_error, error)
1151
1152 def testAssertEqualwithEmptyString(self):
1153 '''Verify when there is an empty string involved, the diff output
1154 does not treat the empty string as a single empty line. It should
1155 instead be handled as a non-line.
1156 '''
1157 sample_text = ''
1158 revised_sample_text = 'unladen swallows fly quickly'
1159 sample_text_error = '''\
1160 + unladen swallows fly quickly
1161 '''
1162 try:
1163 self.assertEqual(sample_text, revised_sample_text)
1164 except self.failureException as e:
1165 # need to remove the first line of the error message
1166 error = str(e).split('\n', 1)[1]
1167 self.assertEqual(sample_text_error, error)
1168
1169 def testAssertEqualMultipleLinesMissingNewlineTerminator(self):
1170 '''Verifying format of diff output from assertEqual involving strings
1171 with multiple lines, but missing the terminating newline on both.
1172 '''
1173 sample_text = 'laden swallows\nfly sloely'
1174 revised_sample_text = 'laden swallows\nfly slowly'
1175 sample_text_error = '''\
1176 laden swallows
1177 - fly sloely
1178 ? ^
1179 + fly slowly
1180 ? ^
1181 '''
1182 try:
1183 self.assertEqual(sample_text, revised_sample_text)
1184 except self.failureException as e:
1185 # need to remove the first line of the error message
1186 error = str(e).split('\n', 1)[1]
1187 self.assertEqual(sample_text_error, error)
1188
1189 def testAssertEqualMultipleLinesMismatchedNewlinesTerminators(self):
1190 '''Verifying format of diff output from assertEqual involving strings
1191 with multiple lines and mismatched newlines. The output should
1192 include a - on it's own line to indicate the newline difference
1193 between the two strings
1194 '''
1195 sample_text = 'laden swallows\nfly sloely\n'
1196 revised_sample_text = 'laden swallows\nfly slowly'
1197 sample_text_error = '''\
1198 laden swallows
1199 - fly sloely
1200 ? ^
1201 + fly slowly
1202 ? ^
1203 -\x20
1204 '''
1205 try:
1206 self.assertEqual(sample_text, revised_sample_text)
1207 except self.failureException as e:
1208 # need to remove the first line of the error message
1209 error = str(e).split('\n', 1)[1]
1210 self.assertEqual(sample_text_error, error)
1211
1212 def testEqualityBytesWarning(self):
1213 if sys.flags.bytes_warning:
1214 def bytes_warning():
1215 return self.assertWarnsRegex(BytesWarning,
1216 'Comparison between bytes and string')
1217 else:
1218 def bytes_warning():
1219 return contextlib.ExitStack()
1220
1221 with bytes_warning(), self.assertRaises(self.failureException):
1222 self.assertEqual('a', b'a')
1223 with bytes_warning():
1224 self.assertNotEqual('a', b'a')
1225
1226 a = [0, 'a']
1227 b = [0, b'a']
1228 with bytes_warning(), self.assertRaises(self.failureException):
1229 self.assertListEqual(a, b)
1230 with bytes_warning(), self.assertRaises(self.failureException):
1231 self.assertTupleEqual(tuple(a), tuple(b))
1232 with bytes_warning(), self.assertRaises(self.failureException):
1233 self.assertSequenceEqual(a, tuple(b))
1234 with bytes_warning(), self.assertRaises(self.failureException):
1235 self.assertSequenceEqual(tuple(a), b)
1236 with bytes_warning(), self.assertRaises(self.failureException):
1237 self.assertSequenceEqual('a', b'a')
1238 with bytes_warning(), self.assertRaises(self.failureException):
1239 self.assertSetEqual(set(a), set(b))
1240
1241 with self.assertRaises(self.failureException):
1242 self.assertListEqual(a, tuple(b))
1243 with self.assertRaises(self.failureException):
1244 self.assertTupleEqual(tuple(a), b)
1245
1246 a = [0, b'a']
1247 b = [0]
1248 with self.assertRaises(self.failureException):
1249 self.assertListEqual(a, b)
1250 with self.assertRaises(self.failureException):
1251 self.assertTupleEqual(tuple(a), tuple(b))
1252 with self.assertRaises(self.failureException):
1253 self.assertSequenceEqual(a, tuple(b))
1254 with self.assertRaises(self.failureException):
1255 self.assertSequenceEqual(tuple(a), b)
1256 with self.assertRaises(self.failureException):
1257 self.assertSetEqual(set(a), set(b))
1258
1259 a = [0]
1260 b = [0, b'a']
1261 with self.assertRaises(self.failureException):
1262 self.assertListEqual(a, b)
1263 with self.assertRaises(self.failureException):
1264 self.assertTupleEqual(tuple(a), tuple(b))
1265 with self.assertRaises(self.failureException):
1266 self.assertSequenceEqual(a, tuple(b))
1267 with self.assertRaises(self.failureException):
1268 self.assertSequenceEqual(tuple(a), b)
1269 with self.assertRaises(self.failureException):
1270 self.assertSetEqual(set(a), set(b))
1271
1272 with bytes_warning(), self.assertRaises(self.failureException):
1273 self.assertDictEqual({'a': 0}, {b'a': 0})
1274 with self.assertRaises(self.failureException):
1275 self.assertDictEqual({}, {b'a': 0})
1276 with self.assertRaises(self.failureException):
1277 self.assertDictEqual({b'a': 0}, {})
1278
1279 with self.assertRaises(self.failureException):
1280 self.assertCountEqual([b'a', b'a'], [b'a', b'a', b'a'])
1281 with bytes_warning():
1282 self.assertCountEqual(['a', b'a'], ['a', b'a'])
1283 with bytes_warning(), self.assertRaises(self.failureException):
1284 self.assertCountEqual(['a', 'a'], [b'a', b'a'])
1285 with bytes_warning(), self.assertRaises(self.failureException):
1286 self.assertCountEqual(['a', 'a', []], [b'a', b'a', []])
1287
1288 def testAssertIsNone(self):
1289 self.assertIsNone(None)
1290 self.assertRaises(self.failureException, self.assertIsNone, False)
1291 self.assertIsNotNone('DjZoPloGears on Rails')
1292 self.assertRaises(self.failureException, self.assertIsNotNone, None)
1293
1294 def testAssertRegex(self):
1295 self.assertRegex('asdfabasdf', r'ab+')
1296 self.assertRaises(self.failureException, self.assertRegex,
1297 'saaas', r'aaaa')
1298
1299 def testAssertRaisesCallable(self):
1300 class ESC[4;38;5;81mExceptionMock(ESC[4;38;5;149mException):
1301 pass
1302 def Stub():
1303 raise ExceptionMock('We expect')
1304 self.assertRaises(ExceptionMock, Stub)
1305 # A tuple of exception classes is accepted
1306 self.assertRaises((ValueError, ExceptionMock), Stub)
1307 # *args and **kwargs also work
1308 self.assertRaises(ValueError, int, '19', base=8)
1309 # Failure when no exception is raised
1310 with self.assertRaises(self.failureException):
1311 self.assertRaises(ExceptionMock, lambda: 0)
1312 # Failure when the function is None
1313 with self.assertRaises(TypeError):
1314 self.assertRaises(ExceptionMock, None)
1315 # Failure when another exception is raised
1316 with self.assertRaises(ExceptionMock):
1317 self.assertRaises(ValueError, Stub)
1318
1319 def testAssertRaisesContext(self):
1320 class ESC[4;38;5;81mExceptionMock(ESC[4;38;5;149mException):
1321 pass
1322 def Stub():
1323 raise ExceptionMock('We expect')
1324 with self.assertRaises(ExceptionMock):
1325 Stub()
1326 # A tuple of exception classes is accepted
1327 with self.assertRaises((ValueError, ExceptionMock)) as cm:
1328 Stub()
1329 # The context manager exposes caught exception
1330 self.assertIsInstance(cm.exception, ExceptionMock)
1331 self.assertEqual(cm.exception.args[0], 'We expect')
1332 # *args and **kwargs also work
1333 with self.assertRaises(ValueError):
1334 int('19', base=8)
1335 # Failure when no exception is raised
1336 with self.assertRaises(self.failureException):
1337 with self.assertRaises(ExceptionMock):
1338 pass
1339 # Custom message
1340 with self.assertRaisesRegex(self.failureException, 'foobar'):
1341 with self.assertRaises(ExceptionMock, msg='foobar'):
1342 pass
1343 # Invalid keyword argument
1344 with self.assertRaisesRegex(TypeError, 'foobar'):
1345 with self.assertRaises(ExceptionMock, foobar=42):
1346 pass
1347 # Failure when another exception is raised
1348 with self.assertRaises(ExceptionMock):
1349 self.assertRaises(ValueError, Stub)
1350
1351 def testAssertRaisesNoExceptionType(self):
1352 with self.assertRaises(TypeError):
1353 self.assertRaises()
1354 with self.assertRaises(TypeError):
1355 self.assertRaises(1)
1356 with self.assertRaises(TypeError):
1357 self.assertRaises(object)
1358 with self.assertRaises(TypeError):
1359 self.assertRaises((ValueError, 1))
1360 with self.assertRaises(TypeError):
1361 self.assertRaises((ValueError, object))
1362
1363 def testAssertRaisesRefcount(self):
1364 # bpo-23890: assertRaises() must not keep objects alive longer
1365 # than expected
1366 def func() :
1367 try:
1368 raise ValueError
1369 except ValueError:
1370 raise ValueError
1371
1372 refcount = sys.getrefcount(func)
1373 self.assertRaises(ValueError, func)
1374 self.assertEqual(refcount, sys.getrefcount(func))
1375
1376 def testAssertRaisesRegex(self):
1377 class ESC[4;38;5;81mExceptionMock(ESC[4;38;5;149mException):
1378 pass
1379
1380 def Stub():
1381 raise ExceptionMock('We expect')
1382
1383 self.assertRaisesRegex(ExceptionMock, re.compile('expect$'), Stub)
1384 self.assertRaisesRegex(ExceptionMock, 'expect$', Stub)
1385 with self.assertRaises(TypeError):
1386 self.assertRaisesRegex(ExceptionMock, 'expect$', None)
1387
1388 def testAssertNotRaisesRegex(self):
1389 self.assertRaisesRegex(
1390 self.failureException, '^Exception not raised by <lambda>$',
1391 self.assertRaisesRegex, Exception, re.compile('x'),
1392 lambda: None)
1393 self.assertRaisesRegex(
1394 self.failureException, '^Exception not raised by <lambda>$',
1395 self.assertRaisesRegex, Exception, 'x',
1396 lambda: None)
1397 # Custom message
1398 with self.assertRaisesRegex(self.failureException, 'foobar'):
1399 with self.assertRaisesRegex(Exception, 'expect', msg='foobar'):
1400 pass
1401 # Invalid keyword argument
1402 with self.assertRaisesRegex(TypeError, 'foobar'):
1403 with self.assertRaisesRegex(Exception, 'expect', foobar=42):
1404 pass
1405
1406 def testAssertRaisesRegexInvalidRegex(self):
1407 # Issue 20145.
1408 class ESC[4;38;5;81mMyExc(ESC[4;38;5;149mException):
1409 pass
1410 self.assertRaises(TypeError, self.assertRaisesRegex, MyExc, lambda: True)
1411
1412 def testAssertWarnsRegexInvalidRegex(self):
1413 # Issue 20145.
1414 class ESC[4;38;5;81mMyWarn(ESC[4;38;5;149mWarning):
1415 pass
1416 self.assertRaises(TypeError, self.assertWarnsRegex, MyWarn, lambda: True)
1417
1418 def testAssertWarnsModifySysModules(self):
1419 # bpo-29620: handle modified sys.modules during iteration
1420 class ESC[4;38;5;81mFoo(ESC[4;38;5;149mtypesESC[4;38;5;149m.ESC[4;38;5;149mModuleType):
1421 @property
1422 def __warningregistry__(self):
1423 sys.modules['@bar@'] = 'bar'
1424
1425 sys.modules['@foo@'] = Foo('foo')
1426 try:
1427 self.assertWarns(UserWarning, warnings.warn, 'expected')
1428 finally:
1429 del sys.modules['@foo@']
1430 del sys.modules['@bar@']
1431
1432 def testAssertRaisesRegexMismatch(self):
1433 def Stub():
1434 raise Exception('Unexpected')
1435
1436 self.assertRaisesRegex(
1437 self.failureException,
1438 r'"\^Expected\$" does not match "Unexpected"',
1439 self.assertRaisesRegex, Exception, '^Expected$',
1440 Stub)
1441 self.assertRaisesRegex(
1442 self.failureException,
1443 r'"\^Expected\$" does not match "Unexpected"',
1444 self.assertRaisesRegex, Exception,
1445 re.compile('^Expected$'), Stub)
1446
1447 def testAssertRaisesExcValue(self):
1448 class ESC[4;38;5;81mExceptionMock(ESC[4;38;5;149mException):
1449 pass
1450
1451 def Stub(foo):
1452 raise ExceptionMock(foo)
1453 v = "particular value"
1454
1455 ctx = self.assertRaises(ExceptionMock)
1456 with ctx:
1457 Stub(v)
1458 e = ctx.exception
1459 self.assertIsInstance(e, ExceptionMock)
1460 self.assertEqual(e.args[0], v)
1461
1462 def testAssertRaisesRegexNoExceptionType(self):
1463 with self.assertRaises(TypeError):
1464 self.assertRaisesRegex()
1465 with self.assertRaises(TypeError):
1466 self.assertRaisesRegex(ValueError)
1467 with self.assertRaises(TypeError):
1468 self.assertRaisesRegex(1, 'expect')
1469 with self.assertRaises(TypeError):
1470 self.assertRaisesRegex(object, 'expect')
1471 with self.assertRaises(TypeError):
1472 self.assertRaisesRegex((ValueError, 1), 'expect')
1473 with self.assertRaises(TypeError):
1474 self.assertRaisesRegex((ValueError, object), 'expect')
1475
1476 def testAssertWarnsCallable(self):
1477 def _runtime_warn():
1478 warnings.warn("foo", RuntimeWarning)
1479 # Success when the right warning is triggered, even several times
1480 self.assertWarns(RuntimeWarning, _runtime_warn)
1481 self.assertWarns(RuntimeWarning, _runtime_warn)
1482 # A tuple of warning classes is accepted
1483 self.assertWarns((DeprecationWarning, RuntimeWarning), _runtime_warn)
1484 # *args and **kwargs also work
1485 self.assertWarns(RuntimeWarning,
1486 warnings.warn, "foo", category=RuntimeWarning)
1487 # Failure when no warning is triggered
1488 with self.assertRaises(self.failureException):
1489 self.assertWarns(RuntimeWarning, lambda: 0)
1490 # Failure when the function is None
1491 with self.assertRaises(TypeError):
1492 self.assertWarns(RuntimeWarning, None)
1493 # Failure when another warning is triggered
1494 with warnings.catch_warnings():
1495 # Force default filter (in case tests are run with -We)
1496 warnings.simplefilter("default", RuntimeWarning)
1497 with self.assertRaises(self.failureException):
1498 self.assertWarns(DeprecationWarning, _runtime_warn)
1499 # Filters for other warnings are not modified
1500 with warnings.catch_warnings():
1501 warnings.simplefilter("error", RuntimeWarning)
1502 with self.assertRaises(RuntimeWarning):
1503 self.assertWarns(DeprecationWarning, _runtime_warn)
1504
1505 def testAssertWarnsContext(self):
1506 # Believe it or not, it is preferable to duplicate all tests above,
1507 # to make sure the __warningregistry__ $@ is circumvented correctly.
1508 def _runtime_warn():
1509 warnings.warn("foo", RuntimeWarning)
1510 _runtime_warn_lineno = inspect.getsourcelines(_runtime_warn)[1]
1511 with self.assertWarns(RuntimeWarning) as cm:
1512 _runtime_warn()
1513 # A tuple of warning classes is accepted
1514 with self.assertWarns((DeprecationWarning, RuntimeWarning)) as cm:
1515 _runtime_warn()
1516 # The context manager exposes various useful attributes
1517 self.assertIsInstance(cm.warning, RuntimeWarning)
1518 self.assertEqual(cm.warning.args[0], "foo")
1519 self.assertIn("test_case.py", cm.filename)
1520 self.assertEqual(cm.lineno, _runtime_warn_lineno + 1)
1521 # Same with several warnings
1522 with self.assertWarns(RuntimeWarning):
1523 _runtime_warn()
1524 _runtime_warn()
1525 with self.assertWarns(RuntimeWarning):
1526 warnings.warn("foo", category=RuntimeWarning)
1527 # Failure when no warning is triggered
1528 with self.assertRaises(self.failureException):
1529 with self.assertWarns(RuntimeWarning):
1530 pass
1531 # Custom message
1532 with self.assertRaisesRegex(self.failureException, 'foobar'):
1533 with self.assertWarns(RuntimeWarning, msg='foobar'):
1534 pass
1535 # Invalid keyword argument
1536 with self.assertRaisesRegex(TypeError, 'foobar'):
1537 with self.assertWarns(RuntimeWarning, foobar=42):
1538 pass
1539 # Failure when another warning is triggered
1540 with warnings.catch_warnings():
1541 # Force default filter (in case tests are run with -We)
1542 warnings.simplefilter("default", RuntimeWarning)
1543 with self.assertRaises(self.failureException):
1544 with self.assertWarns(DeprecationWarning):
1545 _runtime_warn()
1546 # Filters for other warnings are not modified
1547 with warnings.catch_warnings():
1548 warnings.simplefilter("error", RuntimeWarning)
1549 with self.assertRaises(RuntimeWarning):
1550 with self.assertWarns(DeprecationWarning):
1551 _runtime_warn()
1552
1553 def testAssertWarnsNoExceptionType(self):
1554 with self.assertRaises(TypeError):
1555 self.assertWarns()
1556 with self.assertRaises(TypeError):
1557 self.assertWarns(1)
1558 with self.assertRaises(TypeError):
1559 self.assertWarns(object)
1560 with self.assertRaises(TypeError):
1561 self.assertWarns((UserWarning, 1))
1562 with self.assertRaises(TypeError):
1563 self.assertWarns((UserWarning, object))
1564 with self.assertRaises(TypeError):
1565 self.assertWarns((UserWarning, Exception))
1566
1567 def testAssertWarnsRegexCallable(self):
1568 def _runtime_warn(msg):
1569 warnings.warn(msg, RuntimeWarning)
1570 self.assertWarnsRegex(RuntimeWarning, "o+",
1571 _runtime_warn, "foox")
1572 # Failure when no warning is triggered
1573 with self.assertRaises(self.failureException):
1574 self.assertWarnsRegex(RuntimeWarning, "o+",
1575 lambda: 0)
1576 # Failure when the function is None
1577 with self.assertRaises(TypeError):
1578 self.assertWarnsRegex(RuntimeWarning, "o+", None)
1579 # Failure when another warning is triggered
1580 with warnings.catch_warnings():
1581 # Force default filter (in case tests are run with -We)
1582 warnings.simplefilter("default", RuntimeWarning)
1583 with self.assertRaises(self.failureException):
1584 self.assertWarnsRegex(DeprecationWarning, "o+",
1585 _runtime_warn, "foox")
1586 # Failure when message doesn't match
1587 with self.assertRaises(self.failureException):
1588 self.assertWarnsRegex(RuntimeWarning, "o+",
1589 _runtime_warn, "barz")
1590 # A little trickier: we ask RuntimeWarnings to be raised, and then
1591 # check for some of them. It is implementation-defined whether
1592 # non-matching RuntimeWarnings are simply re-raised, or produce a
1593 # failureException.
1594 with warnings.catch_warnings():
1595 warnings.simplefilter("error", RuntimeWarning)
1596 with self.assertRaises((RuntimeWarning, self.failureException)):
1597 self.assertWarnsRegex(RuntimeWarning, "o+",
1598 _runtime_warn, "barz")
1599
1600 def testAssertWarnsRegexContext(self):
1601 # Same as above, but with assertWarnsRegex as a context manager
1602 def _runtime_warn(msg):
1603 warnings.warn(msg, RuntimeWarning)
1604 _runtime_warn_lineno = inspect.getsourcelines(_runtime_warn)[1]
1605 with self.assertWarnsRegex(RuntimeWarning, "o+") as cm:
1606 _runtime_warn("foox")
1607 self.assertIsInstance(cm.warning, RuntimeWarning)
1608 self.assertEqual(cm.warning.args[0], "foox")
1609 self.assertIn("test_case.py", cm.filename)
1610 self.assertEqual(cm.lineno, _runtime_warn_lineno + 1)
1611 # Failure when no warning is triggered
1612 with self.assertRaises(self.failureException):
1613 with self.assertWarnsRegex(RuntimeWarning, "o+"):
1614 pass
1615 # Custom message
1616 with self.assertRaisesRegex(self.failureException, 'foobar'):
1617 with self.assertWarnsRegex(RuntimeWarning, 'o+', msg='foobar'):
1618 pass
1619 # Invalid keyword argument
1620 with self.assertRaisesRegex(TypeError, 'foobar'):
1621 with self.assertWarnsRegex(RuntimeWarning, 'o+', foobar=42):
1622 pass
1623 # Failure when another warning is triggered
1624 with warnings.catch_warnings():
1625 # Force default filter (in case tests are run with -We)
1626 warnings.simplefilter("default", RuntimeWarning)
1627 with self.assertRaises(self.failureException):
1628 with self.assertWarnsRegex(DeprecationWarning, "o+"):
1629 _runtime_warn("foox")
1630 # Failure when message doesn't match
1631 with self.assertRaises(self.failureException):
1632 with self.assertWarnsRegex(RuntimeWarning, "o+"):
1633 _runtime_warn("barz")
1634 # A little trickier: we ask RuntimeWarnings to be raised, and then
1635 # check for some of them. It is implementation-defined whether
1636 # non-matching RuntimeWarnings are simply re-raised, or produce a
1637 # failureException.
1638 with warnings.catch_warnings():
1639 warnings.simplefilter("error", RuntimeWarning)
1640 with self.assertRaises((RuntimeWarning, self.failureException)):
1641 with self.assertWarnsRegex(RuntimeWarning, "o+"):
1642 _runtime_warn("barz")
1643
1644 def testAssertWarnsRegexNoExceptionType(self):
1645 with self.assertRaises(TypeError):
1646 self.assertWarnsRegex()
1647 with self.assertRaises(TypeError):
1648 self.assertWarnsRegex(UserWarning)
1649 with self.assertRaises(TypeError):
1650 self.assertWarnsRegex(1, 'expect')
1651 with self.assertRaises(TypeError):
1652 self.assertWarnsRegex(object, 'expect')
1653 with self.assertRaises(TypeError):
1654 self.assertWarnsRegex((UserWarning, 1), 'expect')
1655 with self.assertRaises(TypeError):
1656 self.assertWarnsRegex((UserWarning, object), 'expect')
1657 with self.assertRaises(TypeError):
1658 self.assertWarnsRegex((UserWarning, Exception), 'expect')
1659
1660 @contextlib.contextmanager
1661 def assertNoStderr(self):
1662 with captured_stderr() as buf:
1663 yield
1664 self.assertEqual(buf.getvalue(), "")
1665
1666 def assertLogRecords(self, records, matches):
1667 self.assertEqual(len(records), len(matches))
1668 for rec, match in zip(records, matches):
1669 self.assertIsInstance(rec, logging.LogRecord)
1670 for k, v in match.items():
1671 self.assertEqual(getattr(rec, k), v)
1672
1673 def testAssertLogsDefaults(self):
1674 # defaults: root logger, level INFO
1675 with self.assertNoStderr():
1676 with self.assertLogs() as cm:
1677 log_foo.info("1")
1678 log_foobar.debug("2")
1679 self.assertEqual(cm.output, ["INFO:foo:1"])
1680 self.assertLogRecords(cm.records, [{'name': 'foo'}])
1681
1682 def testAssertLogsTwoMatchingMessages(self):
1683 # Same, but with two matching log messages
1684 with self.assertNoStderr():
1685 with self.assertLogs() as cm:
1686 log_foo.info("1")
1687 log_foobar.debug("2")
1688 log_quux.warning("3")
1689 self.assertEqual(cm.output, ["INFO:foo:1", "WARNING:quux:3"])
1690 self.assertLogRecords(cm.records,
1691 [{'name': 'foo'}, {'name': 'quux'}])
1692
1693 def checkAssertLogsPerLevel(self, level):
1694 # Check level filtering
1695 with self.assertNoStderr():
1696 with self.assertLogs(level=level) as cm:
1697 log_foo.warning("1")
1698 log_foobar.error("2")
1699 log_quux.critical("3")
1700 self.assertEqual(cm.output, ["ERROR:foo.bar:2", "CRITICAL:quux:3"])
1701 self.assertLogRecords(cm.records,
1702 [{'name': 'foo.bar'}, {'name': 'quux'}])
1703
1704 def testAssertLogsPerLevel(self):
1705 self.checkAssertLogsPerLevel(logging.ERROR)
1706 self.checkAssertLogsPerLevel('ERROR')
1707
1708 def checkAssertLogsPerLogger(self, logger):
1709 # Check per-logger filtering
1710 with self.assertNoStderr():
1711 with self.assertLogs(level='DEBUG') as outer_cm:
1712 with self.assertLogs(logger, level='DEBUG') as cm:
1713 log_foo.info("1")
1714 log_foobar.debug("2")
1715 log_quux.warning("3")
1716 self.assertEqual(cm.output, ["INFO:foo:1", "DEBUG:foo.bar:2"])
1717 self.assertLogRecords(cm.records,
1718 [{'name': 'foo'}, {'name': 'foo.bar'}])
1719 # The outer catchall caught the quux log
1720 self.assertEqual(outer_cm.output, ["WARNING:quux:3"])
1721
1722 def testAssertLogsPerLogger(self):
1723 self.checkAssertLogsPerLogger(logging.getLogger('foo'))
1724 self.checkAssertLogsPerLogger('foo')
1725
1726 def testAssertLogsFailureNoLogs(self):
1727 # Failure due to no logs
1728 with self.assertNoStderr():
1729 with self.assertRaises(self.failureException):
1730 with self.assertLogs():
1731 pass
1732
1733 def testAssertLogsFailureLevelTooHigh(self):
1734 # Failure due to level too high
1735 with self.assertNoStderr():
1736 with self.assertRaises(self.failureException):
1737 with self.assertLogs(level='WARNING'):
1738 log_foo.info("1")
1739
1740 def testAssertLogsFailureLevelTooHigh_FilterInRootLogger(self):
1741 # Failure due to level too high - message propagated to root
1742 with self.assertNoStderr():
1743 oldLevel = log_foo.level
1744 log_foo.setLevel(logging.INFO)
1745 try:
1746 with self.assertRaises(self.failureException):
1747 with self.assertLogs(level='WARNING'):
1748 log_foo.info("1")
1749 finally:
1750 log_foo.setLevel(oldLevel)
1751
1752 def testAssertLogsFailureMismatchingLogger(self):
1753 # Failure due to mismatching logger (and the logged message is
1754 # passed through)
1755 with self.assertLogs('quux', level='ERROR'):
1756 with self.assertRaises(self.failureException):
1757 with self.assertLogs('foo'):
1758 log_quux.error("1")
1759
1760 def testAssertLogsUnexpectedException(self):
1761 # Check unexpected exception will go through.
1762 with self.assertRaises(ZeroDivisionError):
1763 with self.assertLogs():
1764 raise ZeroDivisionError("Unexpected")
1765
1766 def testAssertNoLogsDefault(self):
1767 with self.assertRaises(self.failureException) as cm:
1768 with self.assertNoLogs():
1769 log_foo.info("1")
1770 log_foobar.debug("2")
1771 self.assertEqual(
1772 str(cm.exception),
1773 "Unexpected logs found: ['INFO:foo:1']",
1774 )
1775
1776 def testAssertNoLogsFailureFoundLogs(self):
1777 with self.assertRaises(self.failureException) as cm:
1778 with self.assertNoLogs():
1779 log_quux.error("1")
1780 log_foo.error("foo")
1781
1782 self.assertEqual(
1783 str(cm.exception),
1784 "Unexpected logs found: ['ERROR:quux:1', 'ERROR:foo:foo']",
1785 )
1786
1787 def testAssertNoLogsPerLogger(self):
1788 with self.assertNoStderr():
1789 with self.assertLogs(log_quux):
1790 with self.assertNoLogs(logger=log_foo):
1791 log_quux.error("1")
1792
1793 def testAssertNoLogsFailurePerLogger(self):
1794 # Failure due to unexpected logs for the given logger or its
1795 # children.
1796 with self.assertRaises(self.failureException) as cm:
1797 with self.assertLogs(log_quux):
1798 with self.assertNoLogs(logger=log_foo):
1799 log_quux.error("1")
1800 log_foobar.info("2")
1801 self.assertEqual(
1802 str(cm.exception),
1803 "Unexpected logs found: ['INFO:foo.bar:2']",
1804 )
1805
1806 def testAssertNoLogsPerLevel(self):
1807 # Check per-level filtering
1808 with self.assertNoStderr():
1809 with self.assertNoLogs(level="ERROR"):
1810 log_foo.info("foo")
1811 log_quux.debug("1")
1812
1813 def testAssertNoLogsFailurePerLevel(self):
1814 # Failure due to unexpected logs at the specified level.
1815 with self.assertRaises(self.failureException) as cm:
1816 with self.assertNoLogs(level="DEBUG"):
1817 log_foo.debug("foo")
1818 log_quux.debug("1")
1819 self.assertEqual(
1820 str(cm.exception),
1821 "Unexpected logs found: ['DEBUG:foo:foo', 'DEBUG:quux:1']",
1822 )
1823
1824 def testAssertNoLogsUnexpectedException(self):
1825 # Check unexpected exception will go through.
1826 with self.assertRaises(ZeroDivisionError):
1827 with self.assertNoLogs():
1828 raise ZeroDivisionError("Unexpected")
1829
1830 def testAssertNoLogsYieldsNone(self):
1831 with self.assertNoLogs() as value:
1832 pass
1833 self.assertIsNone(value)
1834
1835 def testDeprecatedFailMethods(self):
1836 """Test that the deprecated fail* methods get removed in 3.12"""
1837 deprecated_names = [
1838 'failIfEqual', 'failUnlessEqual', 'failUnlessAlmostEqual',
1839 'failIfAlmostEqual', 'failUnless', 'failUnlessRaises', 'failIf',
1840 'assertNotEquals', 'assertEquals', 'assertAlmostEquals',
1841 'assertNotAlmostEquals', 'assert_', 'assertDictContainsSubset',
1842 'assertRaisesRegexp', 'assertRegexpMatches'
1843 ]
1844 for deprecated_name in deprecated_names:
1845 with self.assertRaises(AttributeError):
1846 getattr(self, deprecated_name)
1847
1848 def testDeepcopy(self):
1849 # Issue: 5660
1850 class ESC[4;38;5;81mTestableTest(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
1851 def testNothing(self):
1852 pass
1853
1854 test = TestableTest('testNothing')
1855
1856 # This shouldn't blow up
1857 deepcopy(test)
1858
1859 def testPickle(self):
1860 # Issue 10326
1861
1862 # Can't use TestCase classes defined in Test class as
1863 # pickle does not work with inner classes
1864 test = unittest.TestCase('run')
1865 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1866
1867 # blew up prior to fix
1868 pickled_test = pickle.dumps(test, protocol=protocol)
1869 unpickled_test = pickle.loads(pickled_test)
1870 self.assertEqual(test, unpickled_test)
1871
1872 # exercise the TestCase instance in a way that will invoke
1873 # the type equality lookup mechanism
1874 unpickled_test.assertEqual(set(), set())
1875
1876 def testKeyboardInterrupt(self):
1877 def _raise(self=None):
1878 raise KeyboardInterrupt
1879 def nothing(self):
1880 pass
1881
1882 class ESC[4;38;5;81mTest1(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
1883 test_something = _raise
1884
1885 class ESC[4;38;5;81mTest2(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
1886 setUp = _raise
1887 test_something = nothing
1888
1889 class ESC[4;38;5;81mTest3(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
1890 test_something = nothing
1891 tearDown = _raise
1892
1893 class ESC[4;38;5;81mTest4(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
1894 def test_something(self):
1895 self.addCleanup(_raise)
1896
1897 for klass in (Test1, Test2, Test3, Test4):
1898 with self.assertRaises(KeyboardInterrupt):
1899 klass('test_something').run()
1900
1901 def testSkippingEverywhere(self):
1902 def _skip(self=None):
1903 raise unittest.SkipTest('some reason')
1904 def nothing(self):
1905 pass
1906
1907 class ESC[4;38;5;81mTest1(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
1908 test_something = _skip
1909
1910 class ESC[4;38;5;81mTest2(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
1911 setUp = _skip
1912 test_something = nothing
1913
1914 class ESC[4;38;5;81mTest3(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
1915 test_something = nothing
1916 tearDown = _skip
1917
1918 class ESC[4;38;5;81mTest4(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
1919 def test_something(self):
1920 self.addCleanup(_skip)
1921
1922 for klass in (Test1, Test2, Test3, Test4):
1923 result = unittest.TestResult()
1924 klass('test_something').run(result)
1925 self.assertEqual(len(result.skipped), 1)
1926 self.assertEqual(result.testsRun, 1)
1927
1928 def testSystemExit(self):
1929 def _raise(self=None):
1930 raise SystemExit
1931 def nothing(self):
1932 pass
1933
1934 class ESC[4;38;5;81mTest1(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
1935 test_something = _raise
1936
1937 class ESC[4;38;5;81mTest2(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
1938 setUp = _raise
1939 test_something = nothing
1940
1941 class ESC[4;38;5;81mTest3(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
1942 test_something = nothing
1943 tearDown = _raise
1944
1945 class ESC[4;38;5;81mTest4(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
1946 def test_something(self):
1947 self.addCleanup(_raise)
1948
1949 for klass in (Test1, Test2, Test3, Test4):
1950 result = unittest.TestResult()
1951 klass('test_something').run(result)
1952 self.assertEqual(len(result.errors), 1)
1953 self.assertEqual(result.testsRun, 1)
1954
1955 @support.cpython_only
1956 def testNoCycles(self):
1957 case = unittest.TestCase()
1958 wr = weakref.ref(case)
1959 with support.disable_gc():
1960 del case
1961 self.assertFalse(wr())
1962
1963 def test_no_exception_leak(self):
1964 # Issue #19880: TestCase.run() should not keep a reference
1965 # to the exception
1966 class ESC[4;38;5;81mMyException(ESC[4;38;5;149mException):
1967 ninstance = 0
1968
1969 def __init__(self):
1970 MyException.ninstance += 1
1971 Exception.__init__(self)
1972
1973 def __del__(self):
1974 MyException.ninstance -= 1
1975
1976 class ESC[4;38;5;81mTestCase(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
1977 def test1(self):
1978 raise MyException()
1979
1980 @unittest.expectedFailure
1981 def test2(self):
1982 raise MyException()
1983
1984 for method_name in ('test1', 'test2'):
1985 testcase = TestCase(method_name)
1986 testcase.run()
1987 gc_collect() # For PyPy or other GCs.
1988 self.assertEqual(MyException.ninstance, 0)
1989
1990
1991 if __name__ == "__main__":
1992 unittest.main()