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), '.')

`