summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2021-12-10 23:36:15 (GMT)
committerGitHub <noreply@github.com>2021-12-10 23:36:15 (GMT)
commit83fa1291fd0a25216a4a9e990f423682fda67cbe (patch)
tree2cc4978dae716ae64671fd1d2dad93a8f347243f
parent8f3728edcbc205913772f8dc04cccd8bdc476ff4 (diff)
downloadcpython-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.py9
-rw-r--r--Lib/unittest/test/test_program.py16
-rw-r--r--Lib/unittest/test/test_result.py21
-rw-r--r--Misc/NEWS.d/next/Library/2021-11-30-13-52-02.bpo-13236.FmJIkO.rst2
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.