bpo-13236: Flush the output stream more often in unittest (GH-29864) · python/cpython@f42a06b (original) (raw)
`@@ -33,6 +33,22 @@ def bad_cleanup2():
`
33
33
`raise ValueError('bad cleanup2')
`
34
34
``
35
35
``
``
36
`+
class BufferedWriter:
`
``
37
`+
def init(self):
`
``
38
`+
self.result = ''
`
``
39
`+
self.buffer = ''
`
``
40
+
``
41
`+
def write(self, arg):
`
``
42
`+
self.buffer += arg
`
``
43
+
``
44
`+
def flush(self):
`
``
45
`+
self.result += self.buffer
`
``
46
`+
self.buffer = ''
`
``
47
+
``
48
`+
def getvalue(self):
`
``
49
`+
return self.result
`
``
50
+
``
51
+
36
52
`class Test_TestResult(unittest.TestCase):
`
37
53
`# Note: there are not separate tests for TestResult.wasSuccessful(),
`
38
54
`# TestResult.errors, TestResult.failures, TestResult.testsRun or
`
`@@ -335,10 +351,13 @@ def testFailFast(self):
`
335
351
`self.assertTrue(result.shouldStop)
`
336
352
``
337
353
`def testFailFastSetByRunner(self):
`
338
``
`-
runner = unittest.TextTestRunner(stream=io.StringIO(), failfast=True)
`
``
354
`+
stream = BufferedWriter()
`
``
355
`+
runner = unittest.TextTestRunner(stream=stream, failfast=True)
`
339
356
`def test(result):
`
340
357
`self.assertTrue(result.failfast)
`
341
358
`result = runner.run(test)
`
``
359
`+
stream.flush()
`
``
360
`+
self.assertTrue(stream.getvalue().endswith('\n\nOK\n'))
`
342
361
``
343
362
``
344
363
`class Test_TextTestResult(unittest.TestCase):
`
`@@ -462,6 +481,12 @@ def testFail(self):
`
462
481
`self.fail('fail')
`
463
482
`def testError(self):
`
464
483
`raise Exception('error')
`
``
484
`+
@unittest.expectedFailure
`
``
485
`+
def testExpectedFailure(self):
`
``
486
`+
self.fail('fail')
`
``
487
`+
@unittest.expectedFailure
`
``
488
`+
def testUnexpectedSuccess(self):
`
``
489
`+
pass
`
465
490
`def testSubTestSuccess(self):
`
466
491
`with self.subTest('one', a=1):
`
467
492
`pass
`
`@@ -483,7 +508,7 @@ def tearDown(self):
`
483
508
`raise self.tearDownError
`
484
509
``
485
510
`def _run_test(self, test_name, verbosity, tearDownError=None):
`
486
``
`-
stream = io.StringIO()
`
``
511
`+
stream = BufferedWriter()
`
487
512
`stream = unittest.runner._WritelnDecorator(stream)
`
488
513
`result = unittest.TextTestResult(stream, True, verbosity)
`
489
514
`test = self.Test(test_name)
`
`@@ -496,6 +521,8 @@ def testDotsOutput(self):
`
496
521
`self.assertEqual(self._run_test('testSkip', 1), 's')
`
497
522
`self.assertEqual(self._run_test('testFail', 1), 'F')
`
498
523
`self.assertEqual(self._run_test('testError', 1), 'E')
`
``
524
`+
self.assertEqual(self._run_test('testExpectedFailure', 1), 'x')
`
``
525
`+
self.assertEqual(self._run_test('testUnexpectedSuccess', 1), 'u')
`
499
526
``
500
527
`def testLongOutput(self):
`
501
528
`classname = f'{name}.{self.Test.qualname}'
`
`@@ -507,6 +534,10 @@ def testLongOutput(self):
`
507
534
`f'testFail ({classname}) ... FAIL\n')
`
508
535
`self.assertEqual(self._run_test('testError', 2),
`
509
536
`f'testError ({classname}) ... ERROR\n')
`
``
537
`+
self.assertEqual(self._run_test('testExpectedFailure', 2),
`
``
538
`+
f'testExpectedFailure ({classname}) ... expected failure\n')
`
``
539
`+
self.assertEqual(self._run_test('testUnexpectedSuccess', 2),
`
``
540
`+
f'testUnexpectedSuccess ({classname}) ... unexpected success\n')
`
510
541
``
511
542
`def testDotsOutputSubTestSuccess(self):
`
512
543
`self.assertEqual(self._run_test('testSubTestSuccess', 1), '.')
`