blob: 64798a1098e14682091923d8e9f52c8c3ae2f8da [file] [log] [blame]
Michael Foord2560e5c2010-03-27 12:34:21 +00001import io
2import sys
Benjamin Petersonb48af542010-04-11 20:43:16 +00003import textwrap
Michael Foord2560e5c2010-03-27 12:34:21 +00004
5from test import support
6
Michael Foordd23ea062010-05-02 21:00:22 +00007import traceback
Michael Foord2560e5c2010-03-27 12:34:21 +00008import unittest
9
10
11class Test_TestResult(unittest.TestCase):
12 # Note: there are not separate tests for TestResult.wasSuccessful(),
13 # TestResult.errors, TestResult.failures, TestResult.testsRun or
14 # TestResult.shouldStop because these only have meaning in terms of
15 # other TestResult methods.
16 #
17 # Accordingly, tests for the aforenamed attributes are incorporated
18 # in with the tests for the defining methods.
19 ################################################################
20
21 def test_init(self):
22 result = unittest.TestResult()
23
24 self.assertTrue(result.wasSuccessful())
25 self.assertEqual(len(result.errors), 0)
26 self.assertEqual(len(result.failures), 0)
27 self.assertEqual(result.testsRun, 0)
28 self.assertEqual(result.shouldStop, False)
Benjamin Petersonb48af542010-04-11 20:43:16 +000029 self.assertIsNone(result._stdout_buffer)
30 self.assertIsNone(result._stderr_buffer)
Michael Foord2560e5c2010-03-27 12:34:21 +000031
32 # "This method can be called to signal that the set of tests being
33 # run should be aborted by setting the TestResult's shouldStop
34 # attribute to True."
35 def test_stop(self):
36 result = unittest.TestResult()
37
38 result.stop()
39
40 self.assertEqual(result.shouldStop, True)
41
42 # "Called when the test case test is about to be run. The default
43 # implementation simply increments the instance's testsRun counter."
44 def test_startTest(self):
45 class Foo(unittest.TestCase):
46 def test_1(self):
47 pass
48
49 test = Foo('test_1')
50
51 result = unittest.TestResult()
52
53 result.startTest(test)
54
55 self.assertTrue(result.wasSuccessful())
56 self.assertEqual(len(result.errors), 0)
57 self.assertEqual(len(result.failures), 0)
58 self.assertEqual(result.testsRun, 1)
59 self.assertEqual(result.shouldStop, False)
60
61 result.stopTest(test)
62
63 # "Called after the test case test has been executed, regardless of
64 # the outcome. The default implementation does nothing."
65 def test_stopTest(self):
66 class Foo(unittest.TestCase):
67 def test_1(self):
68 pass
69
70 test = Foo('test_1')
71
72 result = unittest.TestResult()
73
74 result.startTest(test)
75
76 self.assertTrue(result.wasSuccessful())
77 self.assertEqual(len(result.errors), 0)
78 self.assertEqual(len(result.failures), 0)
79 self.assertEqual(result.testsRun, 1)
80 self.assertEqual(result.shouldStop, False)
81
82 result.stopTest(test)
83
84 # Same tests as above; make sure nothing has changed
85 self.assertTrue(result.wasSuccessful())
86 self.assertEqual(len(result.errors), 0)
87 self.assertEqual(len(result.failures), 0)
88 self.assertEqual(result.testsRun, 1)
89 self.assertEqual(result.shouldStop, False)
90
91 # "Called before and after tests are run. The default implementation does nothing."
92 def test_startTestRun_stopTestRun(self):
93 result = unittest.TestResult()
94 result.startTestRun()
95 result.stopTestRun()
96
97 # "addSuccess(test)"
98 # ...
99 # "Called when the test case test succeeds"
100 # ...
101 # "wasSuccessful() - Returns True if all tests run so far have passed,
102 # otherwise returns False"
103 # ...
104 # "testsRun - The total number of tests run so far."
105 # ...
106 # "errors - A list containing 2-tuples of TestCase instances and
107 # formatted tracebacks. Each tuple represents a test which raised an
108 # unexpected exception. Contains formatted
109 # tracebacks instead of sys.exc_info() results."
110 # ...
111 # "failures - A list containing 2-tuples of TestCase instances and
112 # formatted tracebacks. Each tuple represents a test where a failure was
113 # explicitly signalled using the TestCase.fail*() or TestCase.assert*()
114 # methods. Contains formatted tracebacks instead
115 # of sys.exc_info() results."
116 def test_addSuccess(self):
117 class Foo(unittest.TestCase):
118 def test_1(self):
119 pass
120
121 test = Foo('test_1')
122
123 result = unittest.TestResult()
124
125 result.startTest(test)
126 result.addSuccess(test)
127 result.stopTest(test)
128
129 self.assertTrue(result.wasSuccessful())
130 self.assertEqual(len(result.errors), 0)
131 self.assertEqual(len(result.failures), 0)
132 self.assertEqual(result.testsRun, 1)
133 self.assertEqual(result.shouldStop, False)
134
135 # "addFailure(test, err)"
136 # ...
137 # "Called when the test case test signals a failure. err is a tuple of
138 # the form returned by sys.exc_info(): (type, value, traceback)"
139 # ...
140 # "wasSuccessful() - Returns True if all tests run so far have passed,
141 # otherwise returns False"
142 # ...
143 # "testsRun - The total number of tests run so far."
144 # ...
145 # "errors - A list containing 2-tuples of TestCase instances and
146 # formatted tracebacks. Each tuple represents a test which raised an
147 # unexpected exception. Contains formatted
148 # tracebacks instead of sys.exc_info() results."
149 # ...
150 # "failures - A list containing 2-tuples of TestCase instances and
151 # formatted tracebacks. Each tuple represents a test where a failure was
152 # explicitly signalled using the TestCase.fail*() or TestCase.assert*()
153 # methods. Contains formatted tracebacks instead
154 # of sys.exc_info() results."
155 def test_addFailure(self):
156 class Foo(unittest.TestCase):
157 def test_1(self):
158 pass
159
160 test = Foo('test_1')
161 try:
162 test.fail("foo")
163 except:
164 exc_info_tuple = sys.exc_info()
165
166 result = unittest.TestResult()
167
168 result.startTest(test)
169 result.addFailure(test, exc_info_tuple)
170 result.stopTest(test)
171
172 self.assertFalse(result.wasSuccessful())
173 self.assertEqual(len(result.errors), 0)
174 self.assertEqual(len(result.failures), 1)
175 self.assertEqual(result.testsRun, 1)
176 self.assertEqual(result.shouldStop, False)
177
178 test_case, formatted_exc = result.failures[0]
179 self.assertTrue(test_case is test)
180 self.assertIsInstance(formatted_exc, str)
181
182 # "addError(test, err)"
183 # ...
184 # "Called when the test case test raises an unexpected exception err
185 # is a tuple of the form returned by sys.exc_info():
186 # (type, value, traceback)"
187 # ...
188 # "wasSuccessful() - Returns True if all tests run so far have passed,
189 # otherwise returns False"
190 # ...
191 # "testsRun - The total number of tests run so far."
192 # ...
193 # "errors - A list containing 2-tuples of TestCase instances and
194 # formatted tracebacks. Each tuple represents a test which raised an
195 # unexpected exception. Contains formatted
196 # tracebacks instead of sys.exc_info() results."
197 # ...
198 # "failures - A list containing 2-tuples of TestCase instances and
199 # formatted tracebacks. Each tuple represents a test where a failure was
200 # explicitly signalled using the TestCase.fail*() or TestCase.assert*()
201 # methods. Contains formatted tracebacks instead
202 # of sys.exc_info() results."
203 def test_addError(self):
204 class Foo(unittest.TestCase):
205 def test_1(self):
206 pass
207
208 test = Foo('test_1')
209 try:
210 raise TypeError()
211 except:
212 exc_info_tuple = sys.exc_info()
213
214 result = unittest.TestResult()
215
216 result.startTest(test)
217 result.addError(test, exc_info_tuple)
218 result.stopTest(test)
219
220 self.assertFalse(result.wasSuccessful())
221 self.assertEqual(len(result.errors), 1)
222 self.assertEqual(len(result.failures), 0)
223 self.assertEqual(result.testsRun, 1)
224 self.assertEqual(result.shouldStop, False)
225
226 test_case, formatted_exc = result.errors[0]
227 self.assertTrue(test_case is test)
228 self.assertIsInstance(formatted_exc, str)
229
230 def testGetDescriptionWithoutDocstring(self):
231 result = unittest.TextTestResult(None, True, 1)
232 self.assertEqual(
233 result.getDescription(self),
234 'testGetDescriptionWithoutDocstring (' + __name__ +
235 '.Test_TestResult)')
236
237 @unittest.skipIf(sys.flags.optimize >= 2,
238 "Docstrings are omitted with -O2 and above")
239 def testGetDescriptionWithOneLineDocstring(self):
240 """Tests getDescription() for a method with a docstring."""
241 result = unittest.TextTestResult(None, True, 1)
242 self.assertEqual(
243 result.getDescription(self),
244 ('testGetDescriptionWithOneLineDocstring '
245 '(' + __name__ + '.Test_TestResult)\n'
246 'Tests getDescription() for a method with a docstring.'))
247
248 @unittest.skipIf(sys.flags.optimize >= 2,
249 "Docstrings are omitted with -O2 and above")
250 def testGetDescriptionWithMultiLineDocstring(self):
251 """Tests getDescription() for a method with a longer docstring.
252 The second line of the docstring.
253 """
254 result = unittest.TextTestResult(None, True, 1)
255 self.assertEqual(
256 result.getDescription(self),
257 ('testGetDescriptionWithMultiLineDocstring '
258 '(' + __name__ + '.Test_TestResult)\n'
259 'Tests getDescription() for a method with a longer '
260 'docstring.'))
261
262 def testStackFrameTrimming(self):
263 class Frame(object):
264 class tb_frame(object):
265 f_globals = {}
266 result = unittest.TestResult()
267 self.assertFalse(result._is_relevant_tb_level(Frame))
268
269 Frame.tb_frame.f_globals['__unittest'] = True
270 self.assertTrue(result._is_relevant_tb_level(Frame))
271
272 def testFailFast(self):
273 result = unittest.TestResult()
274 result._exc_info_to_string = lambda *_: ''
275 result.failfast = True
276 result.addError(None, None)
277 self.assertTrue(result.shouldStop)
278
279 result = unittest.TestResult()
280 result._exc_info_to_string = lambda *_: ''
281 result.failfast = True
282 result.addFailure(None, None)
283 self.assertTrue(result.shouldStop)
284
285 result = unittest.TestResult()
286 result._exc_info_to_string = lambda *_: ''
287 result.failfast = True
288 result.addUnexpectedSuccess(None)
289 self.assertTrue(result.shouldStop)
290
291 def testFailFastSetByRunner(self):
292 runner = unittest.TextTestRunner(stream=io.StringIO(), failfast=True)
293 def test(result):
294 self.assertTrue(result.failfast)
295 result = runner.run(test)
296
297
298classDict = dict(unittest.TestResult.__dict__)
299for m in ('addSkip', 'addExpectedFailure', 'addUnexpectedSuccess',
300 '__init__'):
301 del classDict[m]
302
303def __init__(self, stream=None, descriptions=None, verbosity=None):
304 self.failures = []
305 self.errors = []
306 self.testsRun = 0
307 self.shouldStop = False
Benjamin Petersonb48af542010-04-11 20:43:16 +0000308 self.buffer = False
309
Michael Foord2560e5c2010-03-27 12:34:21 +0000310classDict['__init__'] = __init__
311OldResult = type('OldResult', (object,), classDict)
312
313class Test_OldTestResult(unittest.TestCase):
314
315 def assertOldResultWarning(self, test, failures):
Florent Xiclunafd1b0932010-03-28 00:25:02 +0000316 with support.check_warnings(("TestResult has no add.+ method,",
317 RuntimeWarning)):
Michael Foord2560e5c2010-03-27 12:34:21 +0000318 result = OldResult()
319 test.run(result)
320 self.assertEqual(len(result.failures), failures)
Michael Foord2560e5c2010-03-27 12:34:21 +0000321
322 def testOldTestResult(self):
323 class Test(unittest.TestCase):
324 def testSkip(self):
325 self.skipTest('foobar')
326 @unittest.expectedFailure
327 def testExpectedFail(self):
328 raise TypeError
329 @unittest.expectedFailure
330 def testUnexpectedSuccess(self):
331 pass
332
333 for test_name, should_pass in (('testSkip', True),
334 ('testExpectedFail', True),
335 ('testUnexpectedSuccess', False)):
336 test = Test(test_name)
337 self.assertOldResultWarning(test, int(not should_pass))
338
339 def testOldTestTesultSetup(self):
340 class Test(unittest.TestCase):
341 def setUp(self):
342 self.skipTest('no reason')
343 def testFoo(self):
344 pass
345 self.assertOldResultWarning(Test('testFoo'), 0)
346
347 def testOldTestResultClass(self):
348 @unittest.skip('no reason')
349 class Test(unittest.TestCase):
350 def testFoo(self):
351 pass
352 self.assertOldResultWarning(Test('testFoo'), 0)
353
354 def testOldResultWithRunner(self):
355 class Test(unittest.TestCase):
356 def testFoo(self):
357 pass
358 runner = unittest.TextTestRunner(resultclass=OldResult,
359 stream=io.StringIO())
360 # This will raise an exception if TextTestRunner can't handle old
361 # test result objects
362 runner.run(Test('testFoo'))
Benjamin Petersonb48af542010-04-11 20:43:16 +0000363
364
Michael Foordd23ea062010-05-02 21:00:22 +0000365class MockTraceback(object):
366 @staticmethod
367 def format_exception(*_):
368 return ['A traceback']
369
370def restore_traceback():
371 unittest.result.traceback = traceback
372
373
Benjamin Petersonb48af542010-04-11 20:43:16 +0000374class TestOutputBuffering(unittest.TestCase):
375
376 def setUp(self):
377 self._real_out = sys.stdout
378 self._real_err = sys.stderr
379
380 def tearDown(self):
381 sys.stdout = self._real_out
382 sys.stderr = self._real_err
383
384 def testBufferOutputOff(self):
385 real_out = self._real_out
386 real_err = self._real_err
387
388 result = unittest.TestResult()
389 self.assertFalse(result.buffer)
390
391 self.assertIs(real_out, sys.stdout)
392 self.assertIs(real_err, sys.stderr)
393
394 result.startTest(self)
395
396 self.assertIs(real_out, sys.stdout)
397 self.assertIs(real_err, sys.stderr)
398
399 def testBufferOutputStartTestAddSuccess(self):
400 real_out = self._real_out
401 real_err = self._real_err
402
403 result = unittest.TestResult()
404 self.assertFalse(result.buffer)
405
406 result.buffer = True
407
408 self.assertIs(real_out, sys.stdout)
409 self.assertIs(real_err, sys.stderr)
410
411 result.startTest(self)
412
413 self.assertIsNot(real_out, sys.stdout)
414 self.assertIsNot(real_err, sys.stderr)
415 self.assertIsInstance(sys.stdout, io.StringIO)
416 self.assertIsInstance(sys.stderr, io.StringIO)
417 self.assertIsNot(sys.stdout, sys.stderr)
418
419 out_stream = sys.stdout
420 err_stream = sys.stderr
421
422 result._original_stdout = io.StringIO()
423 result._original_stderr = io.StringIO()
424
425 print('foo')
426 print('bar', file=sys.stderr)
427
428 self.assertEqual(out_stream.getvalue(), 'foo\n')
429 self.assertEqual(err_stream.getvalue(), 'bar\n')
430
431 self.assertEqual(result._original_stdout.getvalue(), '')
432 self.assertEqual(result._original_stderr.getvalue(), '')
433
434 result.addSuccess(self)
435 result.stopTest(self)
436
437 self.assertIs(sys.stdout, result._original_stdout)
438 self.assertIs(sys.stderr, result._original_stderr)
439
440 self.assertEqual(result._original_stdout.getvalue(), '')
441 self.assertEqual(result._original_stderr.getvalue(), '')
442
443 self.assertEqual(out_stream.getvalue(), '')
444 self.assertEqual(err_stream.getvalue(), '')
445
446
447 def getStartedResult(self):
448 result = unittest.TestResult()
449 result.buffer = True
450 result.startTest(self)
451 return result
452
453 def testBufferOutputAddErrorOrFailure(self):
Michael Foordd23ea062010-05-02 21:00:22 +0000454 unittest.result.traceback = MockTraceback
455 self.addCleanup(restore_traceback)
456
Benjamin Petersonb48af542010-04-11 20:43:16 +0000457 for message_attr, add_attr, include_error in [
458 ('errors', 'addError', True),
459 ('failures', 'addFailure', False),
460 ('errors', 'addError', True),
461 ('failures', 'addFailure', False)
462 ]:
463 result = self.getStartedResult()
464 buffered_out = sys.stdout
465 buffered_err = sys.stderr
466 result._original_stdout = io.StringIO()
467 result._original_stderr = io.StringIO()
468
469 print('foo', file=sys.stdout)
470 if include_error:
471 print('bar', file=sys.stderr)
472
473
474 addFunction = getattr(result, add_attr)
475 addFunction(self, (None, None, None))
476 result.stopTest(self)
477
478 result_list = getattr(result, message_attr)
479 self.assertEqual(len(result_list), 1)
480
481 test, message = result_list[0]
482 expectedOutMessage = textwrap.dedent("""
483 Stdout:
484 foo
485 """)
486 expectedErrMessage = ''
487 if include_error:
488 expectedErrMessage = textwrap.dedent("""
489 Stderr:
490 bar
491 """)
Michael Foordd23ea062010-05-02 21:00:22 +0000492
493 expectedFullMessage = 'A traceback%s%s' % (expectedOutMessage, expectedErrMessage)
Benjamin Petersonb48af542010-04-11 20:43:16 +0000494
495 self.assertIs(test, self)
496 self.assertEqual(result._original_stdout.getvalue(), expectedOutMessage)
497 self.assertEqual(result._original_stderr.getvalue(), expectedErrMessage)
498 self.assertMultiLineEqual(message, expectedFullMessage)
499
500if __name__ == '__main__':
501 unittest.main()