diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2021-12-10 23:36:15 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-12-10 23:36:15 (GMT) |
commit | 83fa1291fd0a25216a4a9e990f423682fda67cbe (patch) | |
tree | 2cc4978dae716ae64671fd1d2dad93a8f347243f | |
parent | 8f3728edcbc205913772f8dc04cccd8bdc476ff4 (diff) | |
download | cpython-83fa1291fd0a25216a4a9e990f423682fda67cbe.zip cpython-83fa1291fd0a25216a4a9e990f423682fda67cbe.tar.gz cpython-83fa1291fd0a25216a4a9e990f423682fda67cbe.tar.bz2 |
[3.10] bpo-13236: Flush the output stream more often in unittest (GH-29864) (GH-29929)
It can prevent some losses when output to buffered stream..
(cherry picked from commit f42a06ba279c916fb67289e47f9bc60dc5dee4ee)
Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
-rw-r--r-- | Lib/unittest/runner.py | 9 | ||||
-rw-r--r-- | Lib/unittest/test/test_program.py | 16 | ||||
-rw-r--r-- | Lib/unittest/test/test_result.py | 21 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Library/2021-11-30-13-52-02.bpo-13236.FmJIkO.rst | 2 |
4 files changed, 44 insertions, 4 deletions
diff --git a/Lib/unittest/runner.py b/Lib/unittest/runner.py index 45e7e4c..caf1590 100644 --- a/Lib/unittest/runner.py +++ b/Lib/unittest/runner.py @@ -59,6 +59,7 @@ class TextTestResult(result.TestResult): super(TextTestResult, self).addSuccess(test) if self.showAll: self.stream.writeln("ok") + self.stream.flush() elif self.dots: self.stream.write('.') self.stream.flush() @@ -67,6 +68,7 @@ class TextTestResult(result.TestResult): super(TextTestResult, self).addError(test, err) if self.showAll: self.stream.writeln("ERROR") + self.stream.flush() elif self.dots: self.stream.write('E') self.stream.flush() @@ -75,6 +77,7 @@ class TextTestResult(result.TestResult): super(TextTestResult, self).addFailure(test, err) if self.showAll: self.stream.writeln("FAIL") + self.stream.flush() elif self.dots: self.stream.write('F') self.stream.flush() @@ -83,6 +86,7 @@ class TextTestResult(result.TestResult): super(TextTestResult, self).addSkip(test, reason) if self.showAll: self.stream.writeln("skipped {0!r}".format(reason)) + self.stream.flush() elif self.dots: self.stream.write("s") self.stream.flush() @@ -91,6 +95,7 @@ class TextTestResult(result.TestResult): super(TextTestResult, self).addExpectedFailure(test, err) if self.showAll: self.stream.writeln("expected failure") + self.stream.flush() elif self.dots: self.stream.write("x") self.stream.flush() @@ -99,6 +104,7 @@ class TextTestResult(result.TestResult): super(TextTestResult, self).addUnexpectedSuccess(test) if self.showAll: self.stream.writeln("unexpected success") + self.stream.flush() elif self.dots: self.stream.write("u") self.stream.flush() @@ -106,6 +112,7 @@ class TextTestResult(result.TestResult): def printErrors(self): if self.dots or self.showAll: self.stream.writeln() + self.stream.flush() self.printErrorList('ERROR', self.errors) self.printErrorList('FAIL', self.failures) @@ -115,6 +122,7 @@ class TextTestResult(result.TestResult): self.stream.writeln("%s: %s" % (flavour,self.getDescription(test))) self.stream.writeln(self.separator2) self.stream.writeln("%s" % err) + self.stream.flush() class TextTestRunner(object): @@ -218,4 +226,5 @@ class TextTestRunner(object): self.stream.writeln(" (%s)" % (", ".join(infos),)) else: self.stream.write("\n") + self.stream.flush() return result diff --git a/Lib/unittest/test/test_program.py b/Lib/unittest/test/test_program.py index eef82ff..939af81 100644 --- a/Lib/unittest/test/test_program.py +++ b/Lib/unittest/test/test_program.py @@ -6,6 +6,7 @@ import subprocess from test import support import unittest import unittest.test +from .test_result import BufferedWriter class Test_TestProgram(unittest.TestCase): @@ -104,30 +105,39 @@ class Test_TestProgram(unittest.TestCase): program.testNames) def test_NonExit(self): + stream = BufferedWriter() program = unittest.main(exit=False, argv=["foobar"], - testRunner=unittest.TextTestRunner(stream=io.StringIO()), + testRunner=unittest.TextTestRunner(stream=stream), testLoader=self.FooBarLoader()) self.assertTrue(hasattr(program, 'result')) + self.assertIn('\nFAIL: testFail ', stream.getvalue()) + self.assertTrue(stream.getvalue().endswith('\n\nFAILED (failures=1)\n')) def test_Exit(self): + stream = BufferedWriter() self.assertRaises( SystemExit, unittest.main, argv=["foobar"], - testRunner=unittest.TextTestRunner(stream=io.StringIO()), + testRunner=unittest.TextTestRunner(stream=stream), exit=True, testLoader=self.FooBarLoader()) + self.assertIn('\nFAIL: testFail ', stream.getvalue()) + self.assertTrue(stream.getvalue().endswith('\n\nFAILED (failures=1)\n')) def test_ExitAsDefault(self): + stream = BufferedWriter() self.assertRaises( SystemExit, unittest.main, argv=["foobar"], - testRunner=unittest.TextTestRunner(stream=io.StringIO()), + testRunner=unittest.TextTestRunner(stream=stream), testLoader=self.FooBarLoader()) + self.assertIn('\nFAIL: testFail ', stream.getvalue()) + self.assertTrue(stream.getvalue().endswith('\n\nFAILED (failures=1)\n')) class InitialisableProgram(unittest.TestProgram): diff --git a/Lib/unittest/test/test_result.py b/Lib/unittest/test/test_result.py index d6efc7e..5416735 100644 --- a/Lib/unittest/test/test_result.py +++ b/Lib/unittest/test/test_result.py @@ -33,6 +33,22 @@ def bad_cleanup2(): raise ValueError('bad cleanup2') +class BufferedWriter: + def __init__(self): + self.result = '' + self.buffer = '' + + def write(self, arg): + self.buffer += arg + + def flush(self): + self.result += self.buffer + self.buffer = '' + + def getvalue(self): + return self.result + + class Test_TestResult(unittest.TestCase): # Note: there are not separate tests for TestResult.wasSuccessful(), # TestResult.errors, TestResult.failures, TestResult.testsRun or @@ -444,10 +460,13 @@ class Test_TestResult(unittest.TestCase): self.assertTrue(result.shouldStop) def testFailFastSetByRunner(self): - runner = unittest.TextTestRunner(stream=io.StringIO(), failfast=True) + stream = BufferedWriter() + runner = unittest.TextTestRunner(stream=stream, failfast=True) def test(result): self.assertTrue(result.failfast) result = runner.run(test) + stream.flush() + self.assertTrue(stream.getvalue().endswith('\n\nOK\n')) classDict = dict(unittest.TestResult.__dict__) diff --git a/Misc/NEWS.d/next/Library/2021-11-30-13-52-02.bpo-13236.FmJIkO.rst b/Misc/NEWS.d/next/Library/2021-11-30-13-52-02.bpo-13236.FmJIkO.rst new file mode 100644 index 0000000..bfea8d4 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-11-30-13-52-02.bpo-13236.FmJIkO.rst @@ -0,0 +1,2 @@ +:class:`unittest.TextTestResult` and :class:`unittest.TextTestRunner` flush +now the output stream more often. |