Skip to content

Commit 0227748

Browse files
authored
bpo-34945: Buffer output in test suite only when creating junit file (GH-10204)
After commit d0f49d2, the output of the test suite is always buffered as the test output needs to be included in the JUnit file in same cases (as when a test fails). This has the consequence that printing or using debuggers (like pdb) in the test suite does not result in a good user experience anymore. This commit modifies the test suite runner so it only captures the test output when the JUnit file is requested to fix the regression so prints and debuggers are usable again.
1 parent 541497e commit 0227748

File tree

2 files changed

+16
-14
lines changed

2 files changed

+16
-14
lines changed

Lib/test/support/__init__.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1921,10 +1921,9 @@ def _filter_suite(suite, pred):
19211921

19221922
def _run_suite(suite):
19231923
"""Run tests from a unittest.TestSuite-derived class."""
1924-
runner = get_test_runner(sys.stdout, verbosity=verbose)
1925-
1926-
# TODO: Remove this before merging (here for easy comparison with old impl)
1927-
#runner = unittest.TextTestRunner(sys.stdout, verbosity=2, failfast=failfast)
1924+
runner = get_test_runner(sys.stdout,
1925+
verbosity=verbose,
1926+
capture_output=(junit_xml_list is not None))
19281927

19291928
result = runner.run(suite)
19301929

Lib/test/support/testresult.py

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -60,10 +60,12 @@ def _add_result(self, test, capture=False, **args):
6060
e.set('time', f'{time.perf_counter() - self.__start_time:0.6f}')
6161

6262
if capture:
63-
stdout = self._stdout_buffer.getvalue().rstrip()
64-
ET.SubElement(e, 'system-out').text = stdout
65-
stderr = self._stderr_buffer.getvalue().rstrip()
66-
ET.SubElement(e, 'system-err').text = stderr
63+
if self._stdout_buffer is not None:
64+
stdout = self._stdout_buffer.getvalue().rstrip()
65+
ET.SubElement(e, 'system-out').text = stdout
66+
if self._stderr_buffer is not None:
67+
stderr = self._stderr_buffer.getvalue().rstrip()
68+
ET.SubElement(e, 'system-err').text = stderr
6769

6870
for k, v in args.items():
6971
if not k or not v:
@@ -152,23 +154,24 @@ def get_xml_element(self):
152154
return e
153155

154156
class QuietRegressionTestRunner:
155-
def __init__(self, stream):
157+
def __init__(self, stream, buffer=False):
156158
self.result = RegressionTestResult(stream, None, 0)
159+
self.result.buffer = buffer
157160

158161
def run(self, test):
159162
test(self.result)
160163
return self.result
161164

162-
def get_test_runner_class(verbosity):
165+
def get_test_runner_class(verbosity, buffer=False):
163166
if verbosity:
164167
return functools.partial(unittest.TextTestRunner,
165168
resultclass=RegressionTestResult,
166-
buffer=True,
169+
buffer=buffer,
167170
verbosity=verbosity)
168-
return QuietRegressionTestRunner
171+
return functools.partial(QuietRegressionTestRunner, buffer=buffer)
169172

170-
def get_test_runner(stream, verbosity):
171-
return get_test_runner_class(verbosity)(stream)
173+
def get_test_runner(stream, verbosity, capture_output=False):
174+
return get_test_runner_class(verbosity, capture_output)(stream)
172175

173176
if __name__ == '__main__':
174177
class TestTests(unittest.TestCase):

0 commit comments

Comments
 (0)