1 | import difflib
|
---|
2 | import pprint
|
---|
3 | import pickle
|
---|
4 | import re
|
---|
5 | import sys
|
---|
6 |
|
---|
7 | from copy import deepcopy
|
---|
8 | from test import test_support
|
---|
9 |
|
---|
10 | import unittest
|
---|
11 |
|
---|
12 | from .support import (
|
---|
13 | TestEquality, TestHashing, LoggingResult, ResultWithNoStartTestRunStopTestRun
|
---|
14 | )
|
---|
15 |
|
---|
16 |
|
---|
17 | class Test(object):
|
---|
18 | "Keep these TestCase classes out of the main namespace"
|
---|
19 |
|
---|
20 | class Foo(unittest.TestCase):
|
---|
21 | def runTest(self): pass
|
---|
22 | def test1(self): pass
|
---|
23 |
|
---|
24 | class Bar(Foo):
|
---|
25 | def test2(self): pass
|
---|
26 |
|
---|
27 | class LoggingTestCase(unittest.TestCase):
|
---|
28 | """A test case which logs its calls."""
|
---|
29 |
|
---|
30 | def __init__(self, events):
|
---|
31 | super(Test.LoggingTestCase, self).__init__('test')
|
---|
32 | self.events = events
|
---|
33 |
|
---|
34 | def setUp(self):
|
---|
35 | self.events.append('setUp')
|
---|
36 |
|
---|
37 | def test(self):
|
---|
38 | self.events.append('test')
|
---|
39 |
|
---|
40 | def tearDown(self):
|
---|
41 | self.events.append('tearDown')
|
---|
42 |
|
---|
43 |
|
---|
44 | class Test_TestCase(unittest.TestCase, TestEquality, TestHashing):
|
---|
45 |
|
---|
46 | ### Set up attributes used by inherited tests
|
---|
47 | ################################################################
|
---|
48 |
|
---|
49 | # Used by TestHashing.test_hash and TestEquality.test_eq
|
---|
50 | eq_pairs = [(Test.Foo('test1'), Test.Foo('test1'))]
|
---|
51 |
|
---|
52 | # Used by TestEquality.test_ne
|
---|
53 | ne_pairs = [(Test.Foo('test1'), Test.Foo('runTest'))
|
---|
54 | ,(Test.Foo('test1'), Test.Bar('test1'))
|
---|
55 | ,(Test.Foo('test1'), Test.Bar('test2'))]
|
---|
56 |
|
---|
57 | ################################################################
|
---|
58 | ### /Set up attributes used by inherited tests
|
---|
59 |
|
---|
60 |
|
---|
61 | # "class TestCase([methodName])"
|
---|
62 | # ...
|
---|
63 | # "Each instance of TestCase will run a single test method: the
|
---|
64 | # method named methodName."
|
---|
65 | # ...
|
---|
66 | # "methodName defaults to "runTest"."
|
---|
67 | #
|
---|
68 | # Make sure it really is optional, and that it defaults to the proper
|
---|
69 | # thing.
|
---|
70 | def test_init__no_test_name(self):
|
---|
71 | class Test(unittest.TestCase):
|
---|
72 | def runTest(self): raise TypeError()
|
---|
73 | def test(self): pass
|
---|
74 |
|
---|
75 | self.assertEqual(Test().id()[-13:], '.Test.runTest')
|
---|
76 |
|
---|
77 | # "class TestCase([methodName])"
|
---|
78 | # ...
|
---|
79 | # "Each instance of TestCase will run a single test method: the
|
---|
80 | # method named methodName."
|
---|
81 | def test_init__test_name__valid(self):
|
---|
82 | class Test(unittest.TestCase):
|
---|
83 | def runTest(self): raise TypeError()
|
---|
84 | def test(self): pass
|
---|
85 |
|
---|
86 | self.assertEqual(Test('test').id()[-10:], '.Test.test')
|
---|
87 |
|
---|
88 | # "class TestCase([methodName])"
|
---|
89 | # ...
|
---|
90 | # "Each instance of TestCase will run a single test method: the
|
---|
91 | # method named methodName."
|
---|
92 | def test_init__test_name__invalid(self):
|
---|
93 | class Test(unittest.TestCase):
|
---|
94 | def runTest(self): raise TypeError()
|
---|
95 | def test(self): pass
|
---|
96 |
|
---|
97 | try:
|
---|
98 | Test('testfoo')
|
---|
99 | except ValueError:
|
---|
100 | pass
|
---|
101 | else:
|
---|
102 | self.fail("Failed to raise ValueError")
|
---|
103 |
|
---|
104 | # "Return the number of tests represented by the this test object. For
|
---|
105 | # TestCase instances, this will always be 1"
|
---|
106 | def test_countTestCases(self):
|
---|
107 | class Foo(unittest.TestCase):
|
---|
108 | def test(self): pass
|
---|
109 |
|
---|
110 | self.assertEqual(Foo('test').countTestCases(), 1)
|
---|
111 |
|
---|
112 | # "Return the default type of test result object to be used to run this
|
---|
113 | # test. For TestCase instances, this will always be
|
---|
114 | # unittest.TestResult; subclasses of TestCase should
|
---|
115 | # override this as necessary."
|
---|
116 | def test_defaultTestResult(self):
|
---|
117 | class Foo(unittest.TestCase):
|
---|
118 | def runTest(self):
|
---|
119 | pass
|
---|
120 |
|
---|
121 | result = Foo().defaultTestResult()
|
---|
122 | self.assertEqual(type(result), unittest.TestResult)
|
---|
123 |
|
---|
124 | # "When a setUp() method is defined, the test runner will run that method
|
---|
125 | # prior to each test. Likewise, if a tearDown() method is defined, the
|
---|
126 | # test runner will invoke that method after each test. In the example,
|
---|
127 | # setUp() was used to create a fresh sequence for each test."
|
---|
128 | #
|
---|
129 | # Make sure the proper call order is maintained, even if setUp() raises
|
---|
130 | # an exception.
|
---|
131 | def test_run_call_order__error_in_setUp(self):
|
---|
132 | events = []
|
---|
133 | result = LoggingResult(events)
|
---|
134 |
|
---|
135 | class Foo(Test.LoggingTestCase):
|
---|
136 | def setUp(self):
|
---|
137 | super(Foo, self).setUp()
|
---|
138 | raise RuntimeError('raised by Foo.setUp')
|
---|
139 |
|
---|
140 | Foo(events).run(result)
|
---|
141 | expected = ['startTest', 'setUp', 'addError', 'stopTest']
|
---|
142 | self.assertEqual(events, expected)
|
---|
143 |
|
---|
144 | # "With a temporary result stopTestRun is called when setUp errors.
|
---|
145 | def test_run_call_order__error_in_setUp_default_result(self):
|
---|
146 | events = []
|
---|
147 |
|
---|
148 | class Foo(Test.LoggingTestCase):
|
---|
149 | def defaultTestResult(self):
|
---|
150 | return LoggingResult(self.events)
|
---|
151 |
|
---|
152 | def setUp(self):
|
---|
153 | super(Foo, self).setUp()
|
---|
154 | raise RuntimeError('raised by Foo.setUp')
|
---|
155 |
|
---|
156 | Foo(events).run()
|
---|
157 | expected = ['startTestRun', 'startTest', 'setUp', 'addError',
|
---|
158 | 'stopTest', 'stopTestRun']
|
---|
159 | self.assertEqual(events, expected)
|
---|
160 |
|
---|
161 | # "When a setUp() method is defined, the test runner will run that method
|
---|
162 | # prior to each test. Likewise, if a tearDown() method is defined, the
|
---|
163 | # test runner will invoke that method after each test. In the example,
|
---|
164 | # setUp() was used to create a fresh sequence for each test."
|
---|
165 | #
|
---|
166 | # Make sure the proper call order is maintained, even if the test raises
|
---|
167 | # an error (as opposed to a failure).
|
---|
168 | def test_run_call_order__error_in_test(self):
|
---|
169 | events = []
|
---|
170 | result = LoggingResult(events)
|
---|
171 |
|
---|
172 | class Foo(Test.LoggingTestCase):
|
---|
173 | def test(self):
|
---|
174 | super(Foo, self).test()
|
---|
175 | raise RuntimeError('raised by Foo.test')
|
---|
176 |
|
---|
177 | expected = ['startTest', 'setUp', 'test', 'addError', 'tearDown',
|
---|
178 | 'stopTest']
|
---|
179 | Foo(events).run(result)
|
---|
180 | self.assertEqual(events, expected)
|
---|
181 |
|
---|
182 | # "With a default result, an error in the test still results in stopTestRun
|
---|
183 | # being called."
|
---|
184 | def test_run_call_order__error_in_test_default_result(self):
|
---|
185 | events = []
|
---|
186 |
|
---|
187 | class Foo(Test.LoggingTestCase):
|
---|
188 | def defaultTestResult(self):
|
---|
189 | return LoggingResult(self.events)
|
---|
190 |
|
---|
191 | def test(self):
|
---|
192 | super(Foo, self).test()
|
---|
193 | raise RuntimeError('raised by Foo.test')
|
---|
194 |
|
---|
195 | expected = ['startTestRun', 'startTest', 'setUp', 'test', 'addError',
|
---|
196 | 'tearDown', 'stopTest', 'stopTestRun']
|
---|
197 | Foo(events).run()
|
---|
198 | self.assertEqual(events, expected)
|
---|
199 |
|
---|
200 | # "When a setUp() method is defined, the test runner will run that method
|
---|
201 | # prior to each test. Likewise, if a tearDown() method is defined, the
|
---|
202 | # test runner will invoke that method after each test. In the example,
|
---|
203 | # setUp() was used to create a fresh sequence for each test."
|
---|
204 | #
|
---|
205 | # Make sure the proper call order is maintained, even if the test signals
|
---|
206 | # a failure (as opposed to an error).
|
---|
207 | def test_run_call_order__failure_in_test(self):
|
---|
208 | events = []
|
---|
209 | result = LoggingResult(events)
|
---|
210 |
|
---|
211 | class Foo(Test.LoggingTestCase):
|
---|
212 | def test(self):
|
---|
213 | super(Foo, self).test()
|
---|
214 | self.fail('raised by Foo.test')
|
---|
215 |
|
---|
216 | expected = ['startTest', 'setUp', 'test', 'addFailure', 'tearDown',
|
---|
217 | 'stopTest']
|
---|
218 | Foo(events).run(result)
|
---|
219 | self.assertEqual(events, expected)
|
---|
220 |
|
---|
221 | # "When a test fails with a default result stopTestRun is still called."
|
---|
222 | def test_run_call_order__failure_in_test_default_result(self):
|
---|
223 |
|
---|
224 | class Foo(Test.LoggingTestCase):
|
---|
225 | def defaultTestResult(self):
|
---|
226 | return LoggingResult(self.events)
|
---|
227 | def test(self):
|
---|
228 | super(Foo, self).test()
|
---|
229 | self.fail('raised by Foo.test')
|
---|
230 |
|
---|
231 | expected = ['startTestRun', 'startTest', 'setUp', 'test', 'addFailure',
|
---|
232 | 'tearDown', 'stopTest', 'stopTestRun']
|
---|
233 | events = []
|
---|
234 | Foo(events).run()
|
---|
235 | self.assertEqual(events, expected)
|
---|
236 |
|
---|
237 | # "When a setUp() method is defined, the test runner will run that method
|
---|
238 | # prior to each test. Likewise, if a tearDown() method is defined, the
|
---|
239 | # test runner will invoke that method after each test. In the example,
|
---|
240 | # setUp() was used to create a fresh sequence for each test."
|
---|
241 | #
|
---|
242 | # Make sure the proper call order is maintained, even if tearDown() raises
|
---|
243 | # an exception.
|
---|
244 | def test_run_call_order__error_in_tearDown(self):
|
---|
245 | events = []
|
---|
246 | result = LoggingResult(events)
|
---|
247 |
|
---|
248 | class Foo(Test.LoggingTestCase):
|
---|
249 | def tearDown(self):
|
---|
250 | super(Foo, self).tearDown()
|
---|
251 | raise RuntimeError('raised by Foo.tearDown')
|
---|
252 |
|
---|
253 | Foo(events).run(result)
|
---|
254 | expected = ['startTest', 'setUp', 'test', 'tearDown', 'addError',
|
---|
255 | 'stopTest']
|
---|
256 | self.assertEqual(events, expected)
|
---|
257 |
|
---|
258 | # "When tearDown errors with a default result stopTestRun is still called."
|
---|
259 | def test_run_call_order__error_in_tearDown_default_result(self):
|
---|
260 |
|
---|
261 | class Foo(Test.LoggingTestCase):
|
---|
262 | def defaultTestResult(self):
|
---|
263 | return LoggingResult(self.events)
|
---|
264 | def tearDown(self):
|
---|
265 | super(Foo, self).tearDown()
|
---|
266 | raise RuntimeError('raised by Foo.tearDown')
|
---|
267 |
|
---|
268 | events = []
|
---|
269 | Foo(events).run()
|
---|
270 | expected = ['startTestRun', 'startTest', 'setUp', 'test', 'tearDown',
|
---|
271 | 'addError', 'stopTest', 'stopTestRun']
|
---|
272 | self.assertEqual(events, expected)
|
---|
273 |
|
---|
274 | # "TestCase.run() still works when the defaultTestResult is a TestResult
|
---|
275 | # that does not support startTestRun and stopTestRun.
|
---|
276 | def test_run_call_order_default_result(self):
|
---|
277 |
|
---|
278 | class Foo(unittest.TestCase):
|
---|
279 | def defaultTestResult(self):
|
---|
280 | return ResultWithNoStartTestRunStopTestRun()
|
---|
281 | def test(self):
|
---|
282 | pass
|
---|
283 |
|
---|
284 | Foo('test').run()
|
---|
285 |
|
---|
286 | # "This class attribute gives the exception raised by the test() method.
|
---|
287 | # If a test framework needs to use a specialized exception, possibly to
|
---|
288 | # carry additional information, it must subclass this exception in
|
---|
289 | # order to ``play fair'' with the framework. The initial value of this
|
---|
290 | # attribute is AssertionError"
|
---|
291 | def test_failureException__default(self):
|
---|
292 | class Foo(unittest.TestCase):
|
---|
293 | def test(self):
|
---|
294 | pass
|
---|
295 |
|
---|
296 | self.assertTrue(Foo('test').failureException is AssertionError)
|
---|
297 |
|
---|
298 | # "This class attribute gives the exception raised by the test() method.
|
---|
299 | # If a test framework needs to use a specialized exception, possibly to
|
---|
300 | # carry additional information, it must subclass this exception in
|
---|
301 | # order to ``play fair'' with the framework."
|
---|
302 | #
|
---|
303 | # Make sure TestCase.run() respects the designated failureException
|
---|
304 | def test_failureException__subclassing__explicit_raise(self):
|
---|
305 | events = []
|
---|
306 | result = LoggingResult(events)
|
---|
307 |
|
---|
308 | class Foo(unittest.TestCase):
|
---|
309 | def test(self):
|
---|
310 | raise RuntimeError()
|
---|
311 |
|
---|
312 | failureException = RuntimeError
|
---|
313 |
|
---|
314 | self.assertTrue(Foo('test').failureException is RuntimeError)
|
---|
315 |
|
---|
316 |
|
---|
317 | Foo('test').run(result)
|
---|
318 | expected = ['startTest', 'addFailure', 'stopTest']
|
---|
319 | self.assertEqual(events, expected)
|
---|
320 |
|
---|
321 | # "This class attribute gives the exception raised by the test() method.
|
---|
322 | # If a test framework needs to use a specialized exception, possibly to
|
---|
323 | # carry additional information, it must subclass this exception in
|
---|
324 | # order to ``play fair'' with the framework."
|
---|
325 | #
|
---|
326 | # Make sure TestCase.run() respects the designated failureException
|
---|
327 | def test_failureException__subclassing__implicit_raise(self):
|
---|
328 | events = []
|
---|
329 | result = LoggingResult(events)
|
---|
330 |
|
---|
331 | class Foo(unittest.TestCase):
|
---|
332 | def test(self):
|
---|
333 | self.fail("foo")
|
---|
334 |
|
---|
335 | failureException = RuntimeError
|
---|
336 |
|
---|
337 | self.assertTrue(Foo('test').failureException is RuntimeError)
|
---|
338 |
|
---|
339 |
|
---|
340 | Foo('test').run(result)
|
---|
341 | expected = ['startTest', 'addFailure', 'stopTest']
|
---|
342 | self.assertEqual(events, expected)
|
---|
343 |
|
---|
344 | # "The default implementation does nothing."
|
---|
345 | def test_setUp(self):
|
---|
346 | class Foo(unittest.TestCase):
|
---|
347 | def runTest(self):
|
---|
348 | pass
|
---|
349 |
|
---|
350 | # ... and nothing should happen
|
---|
351 | Foo().setUp()
|
---|
352 |
|
---|
353 | # "The default implementation does nothing."
|
---|
354 | def test_tearDown(self):
|
---|
355 | class Foo(unittest.TestCase):
|
---|
356 | def runTest(self):
|
---|
357 | pass
|
---|
358 |
|
---|
359 | # ... and nothing should happen
|
---|
360 | Foo().tearDown()
|
---|
361 |
|
---|
362 | # "Return a string identifying the specific test case."
|
---|
363 | #
|
---|
364 | # Because of the vague nature of the docs, I'm not going to lock this
|
---|
365 | # test down too much. Really all that can be asserted is that the id()
|
---|
366 | # will be a string (either 8-byte or unicode -- again, because the docs
|
---|
367 | # just say "string")
|
---|
368 | def test_id(self):
|
---|
369 | class Foo(unittest.TestCase):
|
---|
370 | def runTest(self):
|
---|
371 | pass
|
---|
372 |
|
---|
373 | self.assertIsInstance(Foo().id(), basestring)
|
---|
374 |
|
---|
375 | # "If result is omitted or None, a temporary result object is created
|
---|
376 | # and used, but is not made available to the caller. As TestCase owns the
|
---|
377 | # temporary result startTestRun and stopTestRun are called.
|
---|
378 |
|
---|
379 | def test_run__uses_defaultTestResult(self):
|
---|
380 | events = []
|
---|
381 |
|
---|
382 | class Foo(unittest.TestCase):
|
---|
383 | def test(self):
|
---|
384 | events.append('test')
|
---|
385 |
|
---|
386 | def defaultTestResult(self):
|
---|
387 | return LoggingResult(events)
|
---|
388 |
|
---|
389 | # Make run() find a result object on its own
|
---|
390 | Foo('test').run()
|
---|
391 |
|
---|
392 | expected = ['startTestRun', 'startTest', 'test', 'addSuccess',
|
---|
393 | 'stopTest', 'stopTestRun']
|
---|
394 | self.assertEqual(events, expected)
|
---|
395 |
|
---|
396 | def testShortDescriptionWithoutDocstring(self):
|
---|
397 | self.assertIsNone(self.shortDescription())
|
---|
398 |
|
---|
399 | @unittest.skipIf(sys.flags.optimize >= 2,
|
---|
400 | "Docstrings are omitted with -O2 and above")
|
---|
401 | def testShortDescriptionWithOneLineDocstring(self):
|
---|
402 | """Tests shortDescription() for a method with a docstring."""
|
---|
403 | self.assertEqual(
|
---|
404 | self.shortDescription(),
|
---|
405 | 'Tests shortDescription() for a method with a docstring.')
|
---|
406 |
|
---|
407 | @unittest.skipIf(sys.flags.optimize >= 2,
|
---|
408 | "Docstrings are omitted with -O2 and above")
|
---|
409 | def testShortDescriptionWithMultiLineDocstring(self):
|
---|
410 | """Tests shortDescription() for a method with a longer docstring.
|
---|
411 |
|
---|
412 | This method ensures that only the first line of a docstring is
|
---|
413 | returned used in the short description, no matter how long the
|
---|
414 | whole thing is.
|
---|
415 | """
|
---|
416 | self.assertEqual(
|
---|
417 | self.shortDescription(),
|
---|
418 | 'Tests shortDescription() for a method with a longer '
|
---|
419 | 'docstring.')
|
---|
420 |
|
---|
421 | def testAddTypeEqualityFunc(self):
|
---|
422 | class SadSnake(object):
|
---|
423 | """Dummy class for test_addTypeEqualityFunc."""
|
---|
424 | s1, s2 = SadSnake(), SadSnake()
|
---|
425 | self.assertNotEqual(s1, s2)
|
---|
426 | def AllSnakesCreatedEqual(a, b, msg=None):
|
---|
427 | return type(a) is type(b) is SadSnake
|
---|
428 | self.addTypeEqualityFunc(SadSnake, AllSnakesCreatedEqual)
|
---|
429 | self.assertEqual(s1, s2)
|
---|
430 | # No this doesn't clean up and remove the SadSnake equality func
|
---|
431 | # from this TestCase instance but since its a local nothing else
|
---|
432 | # will ever notice that.
|
---|
433 |
|
---|
434 | def testAssertIs(self):
|
---|
435 | thing = object()
|
---|
436 | self.assertIs(thing, thing)
|
---|
437 | self.assertRaises(self.failureException, self.assertIs, thing, object())
|
---|
438 |
|
---|
439 | def testAssertIsNot(self):
|
---|
440 | thing = object()
|
---|
441 | self.assertIsNot(thing, object())
|
---|
442 | self.assertRaises(self.failureException, self.assertIsNot, thing, thing)
|
---|
443 |
|
---|
444 | def testAssertIsInstance(self):
|
---|
445 | thing = []
|
---|
446 | self.assertIsInstance(thing, list)
|
---|
447 | self.assertRaises(self.failureException, self.assertIsInstance,
|
---|
448 | thing, dict)
|
---|
449 |
|
---|
450 | def testAssertNotIsInstance(self):
|
---|
451 | thing = []
|
---|
452 | self.assertNotIsInstance(thing, dict)
|
---|
453 | self.assertRaises(self.failureException, self.assertNotIsInstance,
|
---|
454 | thing, list)
|
---|
455 |
|
---|
456 | def testAssertIn(self):
|
---|
457 | animals = {'monkey': 'banana', 'cow': 'grass', 'seal': 'fish'}
|
---|
458 |
|
---|
459 | self.assertIn('a', 'abc')
|
---|
460 | self.assertIn(2, [1, 2, 3])
|
---|
461 | self.assertIn('monkey', animals)
|
---|
462 |
|
---|
463 | self.assertNotIn('d', 'abc')
|
---|
464 | self.assertNotIn(0, [1, 2, 3])
|
---|
465 | self.assertNotIn('otter', animals)
|
---|
466 |
|
---|
467 | self.assertRaises(self.failureException, self.assertIn, 'x', 'abc')
|
---|
468 | self.assertRaises(self.failureException, self.assertIn, 4, [1, 2, 3])
|
---|
469 | self.assertRaises(self.failureException, self.assertIn, 'elephant',
|
---|
470 | animals)
|
---|
471 |
|
---|
472 | self.assertRaises(self.failureException, self.assertNotIn, 'c', 'abc')
|
---|
473 | self.assertRaises(self.failureException, self.assertNotIn, 1, [1, 2, 3])
|
---|
474 | self.assertRaises(self.failureException, self.assertNotIn, 'cow',
|
---|
475 | animals)
|
---|
476 |
|
---|
477 | def testAssertDictContainsSubset(self):
|
---|
478 | self.assertDictContainsSubset({}, {})
|
---|
479 | self.assertDictContainsSubset({}, {'a': 1})
|
---|
480 | self.assertDictContainsSubset({'a': 1}, {'a': 1})
|
---|
481 | self.assertDictContainsSubset({'a': 1}, {'a': 1, 'b': 2})
|
---|
482 | self.assertDictContainsSubset({'a': 1, 'b': 2}, {'a': 1, 'b': 2})
|
---|
483 |
|
---|
484 | with self.assertRaises(self.failureException):
|
---|
485 | self.assertDictContainsSubset({1: "one"}, {})
|
---|
486 |
|
---|
487 | with self.assertRaises(self.failureException):
|
---|
488 | self.assertDictContainsSubset({'a': 2}, {'a': 1})
|
---|
489 |
|
---|
490 | with self.assertRaises(self.failureException):
|
---|
491 | self.assertDictContainsSubset({'c': 1}, {'a': 1})
|
---|
492 |
|
---|
493 | with self.assertRaises(self.failureException):
|
---|
494 | self.assertDictContainsSubset({'a': 1, 'c': 1}, {'a': 1})
|
---|
495 |
|
---|
496 | with self.assertRaises(self.failureException):
|
---|
497 | self.assertDictContainsSubset({'a': 1, 'c': 1}, {'a': 1})
|
---|
498 |
|
---|
499 | with test_support.check_warnings(("", UnicodeWarning)):
|
---|
500 | one = ''.join(chr(i) for i in range(255))
|
---|
501 | # this used to cause a UnicodeDecodeError constructing the failure msg
|
---|
502 | with self.assertRaises(self.failureException):
|
---|
503 | self.assertDictContainsSubset({'foo': one}, {'foo': u'\uFFFD'})
|
---|
504 |
|
---|
505 | def testAssertEqual(self):
|
---|
506 | equal_pairs = [
|
---|
507 | ((), ()),
|
---|
508 | ({}, {}),
|
---|
509 | ([], []),
|
---|
510 | (set(), set()),
|
---|
511 | (frozenset(), frozenset())]
|
---|
512 | for a, b in equal_pairs:
|
---|
513 | # This mess of try excepts is to test the assertEqual behavior
|
---|
514 | # itself.
|
---|
515 | try:
|
---|
516 | self.assertEqual(a, b)
|
---|
517 | except self.failureException:
|
---|
518 | self.fail('assertEqual(%r, %r) failed' % (a, b))
|
---|
519 | try:
|
---|
520 | self.assertEqual(a, b, msg='foo')
|
---|
521 | except self.failureException:
|
---|
522 | self.fail('assertEqual(%r, %r) with msg= failed' % (a, b))
|
---|
523 | try:
|
---|
524 | self.assertEqual(a, b, 'foo')
|
---|
525 | except self.failureException:
|
---|
526 | self.fail('assertEqual(%r, %r) with third parameter failed' %
|
---|
527 | (a, b))
|
---|
528 |
|
---|
529 | unequal_pairs = [
|
---|
530 | ((), []),
|
---|
531 | ({}, set()),
|
---|
532 | (set([4,1]), frozenset([4,2])),
|
---|
533 | (frozenset([4,5]), set([2,3])),
|
---|
534 | (set([3,4]), set([5,4]))]
|
---|
535 | for a, b in unequal_pairs:
|
---|
536 | self.assertRaises(self.failureException, self.assertEqual, a, b)
|
---|
537 | self.assertRaises(self.failureException, self.assertEqual, a, b,
|
---|
538 | 'foo')
|
---|
539 | self.assertRaises(self.failureException, self.assertEqual, a, b,
|
---|
540 | msg='foo')
|
---|
541 |
|
---|
542 | def testEquality(self):
|
---|
543 | self.assertListEqual([], [])
|
---|
544 | self.assertTupleEqual((), ())
|
---|
545 | self.assertSequenceEqual([], ())
|
---|
546 |
|
---|
547 | a = [0, 'a', []]
|
---|
548 | b = []
|
---|
549 | self.assertRaises(unittest.TestCase.failureException,
|
---|
550 | self.assertListEqual, a, b)
|
---|
551 | self.assertRaises(unittest.TestCase.failureException,
|
---|
552 | self.assertListEqual, tuple(a), tuple(b))
|
---|
553 | self.assertRaises(unittest.TestCase.failureException,
|
---|
554 | self.assertSequenceEqual, a, tuple(b))
|
---|
555 |
|
---|
556 | b.extend(a)
|
---|
557 | self.assertListEqual(a, b)
|
---|
558 | self.assertTupleEqual(tuple(a), tuple(b))
|
---|
559 | self.assertSequenceEqual(a, tuple(b))
|
---|
560 | self.assertSequenceEqual(tuple(a), b)
|
---|
561 |
|
---|
562 | self.assertRaises(self.failureException, self.assertListEqual,
|
---|
563 | a, tuple(b))
|
---|
564 | self.assertRaises(self.failureException, self.assertTupleEqual,
|
---|
565 | tuple(a), b)
|
---|
566 | self.assertRaises(self.failureException, self.assertListEqual, None, b)
|
---|
567 | self.assertRaises(self.failureException, self.assertTupleEqual, None,
|
---|
568 | tuple(b))
|
---|
569 | self.assertRaises(self.failureException, self.assertSequenceEqual,
|
---|
570 | None, tuple(b))
|
---|
571 | self.assertRaises(self.failureException, self.assertListEqual, 1, 1)
|
---|
572 | self.assertRaises(self.failureException, self.assertTupleEqual, 1, 1)
|
---|
573 | self.assertRaises(self.failureException, self.assertSequenceEqual,
|
---|
574 | 1, 1)
|
---|
575 |
|
---|
576 | self.assertDictEqual({}, {})
|
---|
577 |
|
---|
578 | c = { 'x': 1 }
|
---|
579 | d = {}
|
---|
580 | self.assertRaises(unittest.TestCase.failureException,
|
---|
581 | self.assertDictEqual, c, d)
|
---|
582 |
|
---|
583 | d.update(c)
|
---|
584 | self.assertDictEqual(c, d)
|
---|
585 |
|
---|
586 | d['x'] = 0
|
---|
587 | self.assertRaises(unittest.TestCase.failureException,
|
---|
588 | self.assertDictEqual, c, d, 'These are unequal')
|
---|
589 |
|
---|
590 | self.assertRaises(self.failureException, self.assertDictEqual, None, d)
|
---|
591 | self.assertRaises(self.failureException, self.assertDictEqual, [], d)
|
---|
592 | self.assertRaises(self.failureException, self.assertDictEqual, 1, 1)
|
---|
593 |
|
---|
594 | def testAssertSequenceEqualMaxDiff(self):
|
---|
595 | self.assertEqual(self.maxDiff, 80*8)
|
---|
596 | seq1 = 'a' + 'x' * 80**2
|
---|
597 | seq2 = 'b' + 'x' * 80**2
|
---|
598 | diff = '\n'.join(difflib.ndiff(pprint.pformat(seq1).splitlines(),
|
---|
599 | pprint.pformat(seq2).splitlines()))
|
---|
600 | # the +1 is the leading \n added by assertSequenceEqual
|
---|
601 | omitted = unittest.case.DIFF_OMITTED % (len(diff) + 1,)
|
---|
602 |
|
---|
603 | self.maxDiff = len(diff)//2
|
---|
604 | try:
|
---|
605 | self.assertSequenceEqual(seq1, seq2)
|
---|
606 | except self.failureException as e:
|
---|
607 | msg = e.args[0]
|
---|
608 | else:
|
---|
609 | self.fail('assertSequenceEqual did not fail.')
|
---|
610 | self.assertTrue(len(msg) < len(diff))
|
---|
611 | self.assertIn(omitted, msg)
|
---|
612 |
|
---|
613 | self.maxDiff = len(diff) * 2
|
---|
614 | try:
|
---|
615 | self.assertSequenceEqual(seq1, seq2)
|
---|
616 | except self.failureException as e:
|
---|
617 | msg = e.args[0]
|
---|
618 | else:
|
---|
619 | self.fail('assertSequenceEqual did not fail.')
|
---|
620 | self.assertTrue(len(msg) > len(diff))
|
---|
621 | self.assertNotIn(omitted, msg)
|
---|
622 |
|
---|
623 | self.maxDiff = None
|
---|
624 | try:
|
---|
625 | self.assertSequenceEqual(seq1, seq2)
|
---|
626 | except self.failureException as e:
|
---|
627 | msg = e.args[0]
|
---|
628 | else:
|
---|
629 | self.fail('assertSequenceEqual did not fail.')
|
---|
630 | self.assertTrue(len(msg) > len(diff))
|
---|
631 | self.assertNotIn(omitted, msg)
|
---|
632 |
|
---|
633 | def testTruncateMessage(self):
|
---|
634 | self.maxDiff = 1
|
---|
635 | message = self._truncateMessage('foo', 'bar')
|
---|
636 | omitted = unittest.case.DIFF_OMITTED % len('bar')
|
---|
637 | self.assertEqual(message, 'foo' + omitted)
|
---|
638 |
|
---|
639 | self.maxDiff = None
|
---|
640 | message = self._truncateMessage('foo', 'bar')
|
---|
641 | self.assertEqual(message, 'foobar')
|
---|
642 |
|
---|
643 | self.maxDiff = 4
|
---|
644 | message = self._truncateMessage('foo', 'bar')
|
---|
645 | self.assertEqual(message, 'foobar')
|
---|
646 |
|
---|
647 | def testAssertDictEqualTruncates(self):
|
---|
648 | test = unittest.TestCase('assertEqual')
|
---|
649 | def truncate(msg, diff):
|
---|
650 | return 'foo'
|
---|
651 | test._truncateMessage = truncate
|
---|
652 | try:
|
---|
653 | test.assertDictEqual({}, {1: 0})
|
---|
654 | except self.failureException as e:
|
---|
655 | self.assertEqual(str(e), 'foo')
|
---|
656 | else:
|
---|
657 | self.fail('assertDictEqual did not fail')
|
---|
658 |
|
---|
659 | def testAssertMultiLineEqualTruncates(self):
|
---|
660 | test = unittest.TestCase('assertEqual')
|
---|
661 | def truncate(msg, diff):
|
---|
662 | return 'foo'
|
---|
663 | test._truncateMessage = truncate
|
---|
664 | try:
|
---|
665 | test.assertMultiLineEqual('foo', 'bar')
|
---|
666 | except self.failureException as e:
|
---|
667 | self.assertEqual(str(e), 'foo')
|
---|
668 | else:
|
---|
669 | self.fail('assertMultiLineEqual did not fail')
|
---|
670 |
|
---|
671 | def testAssertEqual_diffThreshold(self):
|
---|
672 | # check threshold value
|
---|
673 | self.assertEqual(self._diffThreshold, 2**16)
|
---|
674 | # disable madDiff to get diff markers
|
---|
675 | self.maxDiff = None
|
---|
676 |
|
---|
677 | # set a lower threshold value and add a cleanup to restore it
|
---|
678 | old_threshold = self._diffThreshold
|
---|
679 | self._diffThreshold = 2**8
|
---|
680 | self.addCleanup(lambda: setattr(self, '_diffThreshold', old_threshold))
|
---|
681 |
|
---|
682 | # under the threshold: diff marker (^) in error message
|
---|
683 | s = u'x' * (2**7)
|
---|
684 | with self.assertRaises(self.failureException) as cm:
|
---|
685 | self.assertEqual(s + 'a', s + 'b')
|
---|
686 | self.assertIn('^', str(cm.exception))
|
---|
687 | self.assertEqual(s + 'a', s + 'a')
|
---|
688 |
|
---|
689 | # over the threshold: diff not used and marker (^) not in error message
|
---|
690 | s = u'x' * (2**9)
|
---|
691 | # if the path that uses difflib is taken, _truncateMessage will be
|
---|
692 | # called -- replace it with explodingTruncation to verify that this
|
---|
693 | # doesn't happen
|
---|
694 | def explodingTruncation(message, diff):
|
---|
695 | raise SystemError('this should not be raised')
|
---|
696 | old_truncate = self._truncateMessage
|
---|
697 | self._truncateMessage = explodingTruncation
|
---|
698 | self.addCleanup(lambda: setattr(self, '_truncateMessage', old_truncate))
|
---|
699 |
|
---|
700 | s1, s2 = s + 'a', s + 'b'
|
---|
701 | with self.assertRaises(self.failureException) as cm:
|
---|
702 | self.assertEqual(s1, s2)
|
---|
703 | self.assertNotIn('^', str(cm.exception))
|
---|
704 | self.assertEqual(str(cm.exception), '%r != %r' % (s1, s2))
|
---|
705 | self.assertEqual(s + 'a', s + 'a')
|
---|
706 |
|
---|
707 | def testAssertItemsEqual(self):
|
---|
708 | a = object()
|
---|
709 | self.assertItemsEqual([1, 2, 3], [3, 2, 1])
|
---|
710 | self.assertItemsEqual(['foo', 'bar', 'baz'], ['bar', 'baz', 'foo'])
|
---|
711 | self.assertItemsEqual([a, a, 2, 2, 3], (a, 2, 3, a, 2))
|
---|
712 | self.assertItemsEqual([1, "2", "a", "a"], ["a", "2", True, "a"])
|
---|
713 | self.assertRaises(self.failureException, self.assertItemsEqual,
|
---|
714 | [1, 2] + [3] * 100, [1] * 100 + [2, 3])
|
---|
715 | self.assertRaises(self.failureException, self.assertItemsEqual,
|
---|
716 | [1, "2", "a", "a"], ["a", "2", True, 1])
|
---|
717 | self.assertRaises(self.failureException, self.assertItemsEqual,
|
---|
718 | [10], [10, 11])
|
---|
719 | self.assertRaises(self.failureException, self.assertItemsEqual,
|
---|
720 | [10, 11], [10])
|
---|
721 | self.assertRaises(self.failureException, self.assertItemsEqual,
|
---|
722 | [10, 11, 10], [10, 11])
|
---|
723 |
|
---|
724 | # Test that sequences of unhashable objects can be tested for sameness:
|
---|
725 | self.assertItemsEqual([[1, 2], [3, 4], 0], [False, [3, 4], [1, 2]])
|
---|
726 | # Test that iterator of unhashable objects can be tested for sameness:
|
---|
727 | self.assertItemsEqual(iter([1, 2, [], 3, 4]),
|
---|
728 | iter([1, 2, [], 3, 4]))
|
---|
729 |
|
---|
730 | # hashable types, but not orderable
|
---|
731 | self.assertRaises(self.failureException, self.assertItemsEqual,
|
---|
732 | [], [divmod, 'x', 1, 5j, 2j, frozenset()])
|
---|
733 | # comparing dicts
|
---|
734 | self.assertItemsEqual([{'a': 1}, {'b': 2}], [{'b': 2}, {'a': 1}])
|
---|
735 | # comparing heterogenous non-hashable sequences
|
---|
736 | self.assertItemsEqual([1, 'x', divmod, []], [divmod, [], 'x', 1])
|
---|
737 | self.assertRaises(self.failureException, self.assertItemsEqual,
|
---|
738 | [], [divmod, [], 'x', 1, 5j, 2j, set()])
|
---|
739 | self.assertRaises(self.failureException, self.assertItemsEqual,
|
---|
740 | [[1]], [[2]])
|
---|
741 |
|
---|
742 | # Same elements, but not same sequence length
|
---|
743 | self.assertRaises(self.failureException, self.assertItemsEqual,
|
---|
744 | [1, 1, 2], [2, 1])
|
---|
745 | self.assertRaises(self.failureException, self.assertItemsEqual,
|
---|
746 | [1, 1, "2", "a", "a"], ["2", "2", True, "a"])
|
---|
747 | self.assertRaises(self.failureException, self.assertItemsEqual,
|
---|
748 | [1, {'b': 2}, None, True], [{'b': 2}, True, None])
|
---|
749 |
|
---|
750 | # Same elements which don't reliably compare, in
|
---|
751 | # different order, see issue 10242
|
---|
752 | a = [{2,4}, {1,2}]
|
---|
753 | b = a[::-1]
|
---|
754 | self.assertItemsEqual(a, b)
|
---|
755 |
|
---|
756 | # test utility functions supporting assertItemsEqual()
|
---|
757 |
|
---|
758 | diffs = set(unittest.util._count_diff_all_purpose('aaabccd', 'abbbcce'))
|
---|
759 | expected = {(3,1,'a'), (1,3,'b'), (1,0,'d'), (0,1,'e')}
|
---|
760 | self.assertEqual(diffs, expected)
|
---|
761 |
|
---|
762 | diffs = unittest.util._count_diff_all_purpose([[]], [])
|
---|
763 | self.assertEqual(diffs, [(1, 0, [])])
|
---|
764 |
|
---|
765 | diffs = set(unittest.util._count_diff_hashable('aaabccd', 'abbbcce'))
|
---|
766 | expected = {(3,1,'a'), (1,3,'b'), (1,0,'d'), (0,1,'e')}
|
---|
767 | self.assertEqual(diffs, expected)
|
---|
768 |
|
---|
769 | def testAssertSetEqual(self):
|
---|
770 | set1 = set()
|
---|
771 | set2 = set()
|
---|
772 | self.assertSetEqual(set1, set2)
|
---|
773 |
|
---|
774 | self.assertRaises(self.failureException, self.assertSetEqual, None, set2)
|
---|
775 | self.assertRaises(self.failureException, self.assertSetEqual, [], set2)
|
---|
776 | self.assertRaises(self.failureException, self.assertSetEqual, set1, None)
|
---|
777 | self.assertRaises(self.failureException, self.assertSetEqual, set1, [])
|
---|
778 |
|
---|
779 | set1 = set(['a'])
|
---|
780 | set2 = set()
|
---|
781 | self.assertRaises(self.failureException, self.assertSetEqual, set1, set2)
|
---|
782 |
|
---|
783 | set1 = set(['a'])
|
---|
784 | set2 = set(['a'])
|
---|
785 | self.assertSetEqual(set1, set2)
|
---|
786 |
|
---|
787 | set1 = set(['a'])
|
---|
788 | set2 = set(['a', 'b'])
|
---|
789 | self.assertRaises(self.failureException, self.assertSetEqual, set1, set2)
|
---|
790 |
|
---|
791 | set1 = set(['a'])
|
---|
792 | set2 = frozenset(['a', 'b'])
|
---|
793 | self.assertRaises(self.failureException, self.assertSetEqual, set1, set2)
|
---|
794 |
|
---|
795 | set1 = set(['a', 'b'])
|
---|
796 | set2 = frozenset(['a', 'b'])
|
---|
797 | self.assertSetEqual(set1, set2)
|
---|
798 |
|
---|
799 | set1 = set()
|
---|
800 | set2 = "foo"
|
---|
801 | self.assertRaises(self.failureException, self.assertSetEqual, set1, set2)
|
---|
802 | self.assertRaises(self.failureException, self.assertSetEqual, set2, set1)
|
---|
803 |
|
---|
804 | # make sure any string formatting is tuple-safe
|
---|
805 | set1 = set([(0, 1), (2, 3)])
|
---|
806 | set2 = set([(4, 5)])
|
---|
807 | self.assertRaises(self.failureException, self.assertSetEqual, set1, set2)
|
---|
808 |
|
---|
809 | def testInequality(self):
|
---|
810 | # Try ints
|
---|
811 | self.assertGreater(2, 1)
|
---|
812 | self.assertGreaterEqual(2, 1)
|
---|
813 | self.assertGreaterEqual(1, 1)
|
---|
814 | self.assertLess(1, 2)
|
---|
815 | self.assertLessEqual(1, 2)
|
---|
816 | self.assertLessEqual(1, 1)
|
---|
817 | self.assertRaises(self.failureException, self.assertGreater, 1, 2)
|
---|
818 | self.assertRaises(self.failureException, self.assertGreater, 1, 1)
|
---|
819 | self.assertRaises(self.failureException, self.assertGreaterEqual, 1, 2)
|
---|
820 | self.assertRaises(self.failureException, self.assertLess, 2, 1)
|
---|
821 | self.assertRaises(self.failureException, self.assertLess, 1, 1)
|
---|
822 | self.assertRaises(self.failureException, self.assertLessEqual, 2, 1)
|
---|
823 |
|
---|
824 | # Try Floats
|
---|
825 | self.assertGreater(1.1, 1.0)
|
---|
826 | self.assertGreaterEqual(1.1, 1.0)
|
---|
827 | self.assertGreaterEqual(1.0, 1.0)
|
---|
828 | self.assertLess(1.0, 1.1)
|
---|
829 | self.assertLessEqual(1.0, 1.1)
|
---|
830 | self.assertLessEqual(1.0, 1.0)
|
---|
831 | self.assertRaises(self.failureException, self.assertGreater, 1.0, 1.1)
|
---|
832 | self.assertRaises(self.failureException, self.assertGreater, 1.0, 1.0)
|
---|
833 | self.assertRaises(self.failureException, self.assertGreaterEqual, 1.0, 1.1)
|
---|
834 | self.assertRaises(self.failureException, self.assertLess, 1.1, 1.0)
|
---|
835 | self.assertRaises(self.failureException, self.assertLess, 1.0, 1.0)
|
---|
836 | self.assertRaises(self.failureException, self.assertLessEqual, 1.1, 1.0)
|
---|
837 |
|
---|
838 | # Try Strings
|
---|
839 | self.assertGreater('bug', 'ant')
|
---|
840 | self.assertGreaterEqual('bug', 'ant')
|
---|
841 | self.assertGreaterEqual('ant', 'ant')
|
---|
842 | self.assertLess('ant', 'bug')
|
---|
843 | self.assertLessEqual('ant', 'bug')
|
---|
844 | self.assertLessEqual('ant', 'ant')
|
---|
845 | self.assertRaises(self.failureException, self.assertGreater, 'ant', 'bug')
|
---|
846 | self.assertRaises(self.failureException, self.assertGreater, 'ant', 'ant')
|
---|
847 | self.assertRaises(self.failureException, self.assertGreaterEqual, 'ant', 'bug')
|
---|
848 | self.assertRaises(self.failureException, self.assertLess, 'bug', 'ant')
|
---|
849 | self.assertRaises(self.failureException, self.assertLess, 'ant', 'ant')
|
---|
850 | self.assertRaises(self.failureException, self.assertLessEqual, 'bug', 'ant')
|
---|
851 |
|
---|
852 | # Try Unicode
|
---|
853 | self.assertGreater(u'bug', u'ant')
|
---|
854 | self.assertGreaterEqual(u'bug', u'ant')
|
---|
855 | self.assertGreaterEqual(u'ant', u'ant')
|
---|
856 | self.assertLess(u'ant', u'bug')
|
---|
857 | self.assertLessEqual(u'ant', u'bug')
|
---|
858 | self.assertLessEqual(u'ant', u'ant')
|
---|
859 | self.assertRaises(self.failureException, self.assertGreater, u'ant', u'bug')
|
---|
860 | self.assertRaises(self.failureException, self.assertGreater, u'ant', u'ant')
|
---|
861 | self.assertRaises(self.failureException, self.assertGreaterEqual, u'ant',
|
---|
862 | u'bug')
|
---|
863 | self.assertRaises(self.failureException, self.assertLess, u'bug', u'ant')
|
---|
864 | self.assertRaises(self.failureException, self.assertLess, u'ant', u'ant')
|
---|
865 | self.assertRaises(self.failureException, self.assertLessEqual, u'bug', u'ant')
|
---|
866 |
|
---|
867 | # Try Mixed String/Unicode
|
---|
868 | self.assertGreater('bug', u'ant')
|
---|
869 | self.assertGreater(u'bug', 'ant')
|
---|
870 | self.assertGreaterEqual('bug', u'ant')
|
---|
871 | self.assertGreaterEqual(u'bug', 'ant')
|
---|
872 | self.assertGreaterEqual('ant', u'ant')
|
---|
873 | self.assertGreaterEqual(u'ant', 'ant')
|
---|
874 | self.assertLess('ant', u'bug')
|
---|
875 | self.assertLess(u'ant', 'bug')
|
---|
876 | self.assertLessEqual('ant', u'bug')
|
---|
877 | self.assertLessEqual(u'ant', 'bug')
|
---|
878 | self.assertLessEqual('ant', u'ant')
|
---|
879 | self.assertLessEqual(u'ant', 'ant')
|
---|
880 | self.assertRaises(self.failureException, self.assertGreater, 'ant', u'bug')
|
---|
881 | self.assertRaises(self.failureException, self.assertGreater, u'ant', 'bug')
|
---|
882 | self.assertRaises(self.failureException, self.assertGreater, 'ant', u'ant')
|
---|
883 | self.assertRaises(self.failureException, self.assertGreater, u'ant', 'ant')
|
---|
884 | self.assertRaises(self.failureException, self.assertGreaterEqual, 'ant',
|
---|
885 | u'bug')
|
---|
886 | self.assertRaises(self.failureException, self.assertGreaterEqual, u'ant',
|
---|
887 | 'bug')
|
---|
888 | self.assertRaises(self.failureException, self.assertLess, 'bug', u'ant')
|
---|
889 | self.assertRaises(self.failureException, self.assertLess, u'bug', 'ant')
|
---|
890 | self.assertRaises(self.failureException, self.assertLess, 'ant', u'ant')
|
---|
891 | self.assertRaises(self.failureException, self.assertLess, u'ant', 'ant')
|
---|
892 | self.assertRaises(self.failureException, self.assertLessEqual, 'bug', u'ant')
|
---|
893 | self.assertRaises(self.failureException, self.assertLessEqual, u'bug', 'ant')
|
---|
894 |
|
---|
895 | def testAssertMultiLineEqual(self):
|
---|
896 | sample_text = b"""\
|
---|
897 | http://www.python.org/doc/2.3/lib/module-unittest.html
|
---|
898 | test case
|
---|
899 | A test case is the smallest unit of testing. [...]
|
---|
900 | """
|
---|
901 | revised_sample_text = b"""\
|
---|
902 | http://www.python.org/doc/2.4.1/lib/module-unittest.html
|
---|
903 | test case
|
---|
904 | A test case is the smallest unit of testing. [...] You may provide your
|
---|
905 | own implementation that does not subclass from TestCase, of course.
|
---|
906 | """
|
---|
907 | sample_text_error = b"""\
|
---|
908 | - http://www.python.org/doc/2.3/lib/module-unittest.html
|
---|
909 | ? ^
|
---|
910 | + http://www.python.org/doc/2.4.1/lib/module-unittest.html
|
---|
911 | ? ^^^
|
---|
912 | test case
|
---|
913 | - A test case is the smallest unit of testing. [...]
|
---|
914 | + A test case is the smallest unit of testing. [...] You may provide your
|
---|
915 | ? +++++++++++++++++++++
|
---|
916 | + own implementation that does not subclass from TestCase, of course.
|
---|
917 | """
|
---|
918 | self.maxDiff = None
|
---|
919 | for type_changer in (lambda x: x, lambda x: x.decode('utf8')):
|
---|
920 | try:
|
---|
921 | self.assertMultiLineEqual(type_changer(sample_text),
|
---|
922 | type_changer(revised_sample_text))
|
---|
923 | except self.failureException, e:
|
---|
924 | # need to remove the first line of the error message
|
---|
925 | error = str(e).encode('utf8').split('\n', 1)[1]
|
---|
926 |
|
---|
927 | # assertMultiLineEqual is hooked up as the default for
|
---|
928 | # unicode strings - so we can't use it for this check
|
---|
929 | self.assertTrue(sample_text_error == error)
|
---|
930 |
|
---|
931 | def testAsertEqualSingleLine(self):
|
---|
932 | sample_text = u"laden swallows fly slowly"
|
---|
933 | revised_sample_text = u"unladen swallows fly quickly"
|
---|
934 | sample_text_error = """\
|
---|
935 | - laden swallows fly slowly
|
---|
936 | ? ^^^^
|
---|
937 | + unladen swallows fly quickly
|
---|
938 | ? ++ ^^^^^
|
---|
939 | """
|
---|
940 | try:
|
---|
941 | self.assertEqual(sample_text, revised_sample_text)
|
---|
942 | except self.failureException as e:
|
---|
943 | error = str(e).split('\n', 1)[1]
|
---|
944 | self.assertTrue(sample_text_error == error)
|
---|
945 |
|
---|
946 | def testAssertIsNone(self):
|
---|
947 | self.assertIsNone(None)
|
---|
948 | self.assertRaises(self.failureException, self.assertIsNone, False)
|
---|
949 | self.assertIsNotNone('DjZoPloGears on Rails')
|
---|
950 | self.assertRaises(self.failureException, self.assertIsNotNone, None)
|
---|
951 |
|
---|
952 | def testAssertRegexpMatches(self):
|
---|
953 | self.assertRegexpMatches('asdfabasdf', r'ab+')
|
---|
954 | self.assertRaises(self.failureException, self.assertRegexpMatches,
|
---|
955 | 'saaas', r'aaaa')
|
---|
956 |
|
---|
957 | def testAssertRaisesRegexp(self):
|
---|
958 | class ExceptionMock(Exception):
|
---|
959 | pass
|
---|
960 |
|
---|
961 | def Stub():
|
---|
962 | raise ExceptionMock('We expect')
|
---|
963 |
|
---|
964 | self.assertRaisesRegexp(ExceptionMock, re.compile('expect$'), Stub)
|
---|
965 | self.assertRaisesRegexp(ExceptionMock, 'expect$', Stub)
|
---|
966 | self.assertRaisesRegexp(ExceptionMock, u'expect$', Stub)
|
---|
967 |
|
---|
968 | def testAssertNotRaisesRegexp(self):
|
---|
969 | self.assertRaisesRegexp(
|
---|
970 | self.failureException, '^Exception not raised$',
|
---|
971 | self.assertRaisesRegexp, Exception, re.compile('x'),
|
---|
972 | lambda: None)
|
---|
973 | self.assertRaisesRegexp(
|
---|
974 | self.failureException, '^Exception not raised$',
|
---|
975 | self.assertRaisesRegexp, Exception, 'x',
|
---|
976 | lambda: None)
|
---|
977 | self.assertRaisesRegexp(
|
---|
978 | self.failureException, '^Exception not raised$',
|
---|
979 | self.assertRaisesRegexp, Exception, u'x',
|
---|
980 | lambda: None)
|
---|
981 |
|
---|
982 | def testAssertRaisesRegexpMismatch(self):
|
---|
983 | def Stub():
|
---|
984 | raise Exception('Unexpected')
|
---|
985 |
|
---|
986 | self.assertRaisesRegexp(
|
---|
987 | self.failureException,
|
---|
988 | r'"\^Expected\$" does not match "Unexpected"',
|
---|
989 | self.assertRaisesRegexp, Exception, '^Expected$',
|
---|
990 | Stub)
|
---|
991 | self.assertRaisesRegexp(
|
---|
992 | self.failureException,
|
---|
993 | r'"\^Expected\$" does not match "Unexpected"',
|
---|
994 | self.assertRaisesRegexp, Exception, u'^Expected$',
|
---|
995 | Stub)
|
---|
996 | self.assertRaisesRegexp(
|
---|
997 | self.failureException,
|
---|
998 | r'"\^Expected\$" does not match "Unexpected"',
|
---|
999 | self.assertRaisesRegexp, Exception,
|
---|
1000 | re.compile('^Expected$'), Stub)
|
---|
1001 |
|
---|
1002 | def testAssertRaisesExcValue(self):
|
---|
1003 | class ExceptionMock(Exception):
|
---|
1004 | pass
|
---|
1005 |
|
---|
1006 | def Stub(foo):
|
---|
1007 | raise ExceptionMock(foo)
|
---|
1008 | v = "particular value"
|
---|
1009 |
|
---|
1010 | ctx = self.assertRaises(ExceptionMock)
|
---|
1011 | with ctx:
|
---|
1012 | Stub(v)
|
---|
1013 | e = ctx.exception
|
---|
1014 | self.assertIsInstance(e, ExceptionMock)
|
---|
1015 | self.assertEqual(e.args[0], v)
|
---|
1016 |
|
---|
1017 | def testSynonymAssertMethodNames(self):
|
---|
1018 | """Test undocumented method name synonyms.
|
---|
1019 |
|
---|
1020 | Please do not use these methods names in your own code.
|
---|
1021 |
|
---|
1022 | This test confirms their continued existence and functionality
|
---|
1023 | in order to avoid breaking existing code.
|
---|
1024 | """
|
---|
1025 | self.assertNotEquals(3, 5)
|
---|
1026 | self.assertEquals(3, 3)
|
---|
1027 | self.assertAlmostEquals(2.0, 2.0)
|
---|
1028 | self.assertNotAlmostEquals(3.0, 5.0)
|
---|
1029 | self.assert_(True)
|
---|
1030 |
|
---|
1031 | def testPendingDeprecationMethodNames(self):
|
---|
1032 | """Test fail* methods pending deprecation, they will warn in 3.2.
|
---|
1033 |
|
---|
1034 | Do not use these methods. They will go away in 3.3.
|
---|
1035 | """
|
---|
1036 | with test_support.check_warnings():
|
---|
1037 | self.failIfEqual(3, 5)
|
---|
1038 | self.failUnlessEqual(3, 3)
|
---|
1039 | self.failUnlessAlmostEqual(2.0, 2.0)
|
---|
1040 | self.failIfAlmostEqual(3.0, 5.0)
|
---|
1041 | self.failUnless(True)
|
---|
1042 | self.failUnlessRaises(TypeError, lambda _: 3.14 + u'spam')
|
---|
1043 | self.failIf(False)
|
---|
1044 |
|
---|
1045 | def testDeepcopy(self):
|
---|
1046 | # Issue: 5660
|
---|
1047 | class TestableTest(unittest.TestCase):
|
---|
1048 | def testNothing(self):
|
---|
1049 | pass
|
---|
1050 |
|
---|
1051 | test = TestableTest('testNothing')
|
---|
1052 |
|
---|
1053 | # This shouldn't blow up
|
---|
1054 | deepcopy(test)
|
---|
1055 |
|
---|
1056 | def testKeyboardInterrupt(self):
|
---|
1057 | def _raise(self=None):
|
---|
1058 | raise KeyboardInterrupt
|
---|
1059 | def nothing(self):
|
---|
1060 | pass
|
---|
1061 |
|
---|
1062 | class Test1(unittest.TestCase):
|
---|
1063 | test_something = _raise
|
---|
1064 |
|
---|
1065 | class Test2(unittest.TestCase):
|
---|
1066 | setUp = _raise
|
---|
1067 | test_something = nothing
|
---|
1068 |
|
---|
1069 | class Test3(unittest.TestCase):
|
---|
1070 | test_something = nothing
|
---|
1071 | tearDown = _raise
|
---|
1072 |
|
---|
1073 | class Test4(unittest.TestCase):
|
---|
1074 | def test_something(self):
|
---|
1075 | self.addCleanup(_raise)
|
---|
1076 |
|
---|
1077 | for klass in (Test1, Test2, Test3, Test4):
|
---|
1078 | with self.assertRaises(KeyboardInterrupt):
|
---|
1079 | klass('test_something').run()
|
---|
1080 |
|
---|
1081 | def testSystemExit(self):
|
---|
1082 | def _raise(self=None):
|
---|
1083 | raise SystemExit
|
---|
1084 | def nothing(self):
|
---|
1085 | pass
|
---|
1086 |
|
---|
1087 | class Test1(unittest.TestCase):
|
---|
1088 | test_something = _raise
|
---|
1089 |
|
---|
1090 | class Test2(unittest.TestCase):
|
---|
1091 | setUp = _raise
|
---|
1092 | test_something = nothing
|
---|
1093 |
|
---|
1094 | class Test3(unittest.TestCase):
|
---|
1095 | test_something = nothing
|
---|
1096 | tearDown = _raise
|
---|
1097 |
|
---|
1098 | class Test4(unittest.TestCase):
|
---|
1099 | def test_something(self):
|
---|
1100 | self.addCleanup(_raise)
|
---|
1101 |
|
---|
1102 | for klass in (Test1, Test2, Test3, Test4):
|
---|
1103 | result = unittest.TestResult()
|
---|
1104 | klass('test_something').run(result)
|
---|
1105 | self.assertEqual(len(result.errors), 1)
|
---|
1106 | self.assertEqual(result.testsRun, 1)
|
---|
1107 |
|
---|
1108 | def testPickle(self):
|
---|
1109 | # Issue 10326
|
---|
1110 |
|
---|
1111 | # Can't use TestCase classes defined in Test class as
|
---|
1112 | # pickle does not work with inner classes
|
---|
1113 | test = unittest.TestCase('run')
|
---|
1114 | for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
|
---|
1115 |
|
---|
1116 | # blew up prior to fix
|
---|
1117 | pickled_test = pickle.dumps(test, protocol=protocol)
|
---|
1118 |
|
---|
1119 | unpickled_test = pickle.loads(pickled_test)
|
---|
1120 | self.assertEqual(test, unpickled_test)
|
---|
1121 |
|
---|
1122 |
|
---|
1123 | if __name__ == '__main__':
|
---|
1124 | unittest.main()
|
---|