bpo-41718: Disable support.testresult XML output by default (GH-24982)

RegressionTestResult.USE_XML must now be set to True to get the JUnit
XML output.

Reduce the number of imports when --junit-xml=FILE option is not
used: 153 => 144 (-9).
This commit is contained in:
Victor Stinner 2021-03-23 01:11:31 +01:00 committed by GitHub
parent 0473fb2229
commit 30793e81bd
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 22 additions and 7 deletions

View file

@ -93,6 +93,10 @@ def setup_tests(ns):
support.SHORT_TIMEOUT = min(support.SHORT_TIMEOUT, ns.timeout) support.SHORT_TIMEOUT = min(support.SHORT_TIMEOUT, ns.timeout)
support.LONG_TIMEOUT = min(support.LONG_TIMEOUT, ns.timeout) support.LONG_TIMEOUT = min(support.LONG_TIMEOUT, ns.timeout)
if ns.xmlpath:
from test.support.testresult import RegressionTestResult
RegressionTestResult.USE_XML = True
def replace_stdout(): def replace_stdout():
"""Set stdout encoder error handler to backslashreplace (as stderr error """Set stdout encoder error handler to backslashreplace (as stderr error

View file

@ -9,21 +9,22 @@ import time
import traceback import traceback
import unittest import unittest
import xml.etree.ElementTree as ET
from datetime import datetime from datetime import datetime
class RegressionTestResult(unittest.TextTestResult): class RegressionTestResult(unittest.TextTestResult):
separator1 = '=' * 70 + '\n' separator1 = '=' * 70 + '\n'
separator2 = '-' * 70 + '\n' separator2 = '-' * 70 + '\n'
USE_XML = False
def __init__(self, stream, descriptions, verbosity): def __init__(self, stream, descriptions, verbosity):
super().__init__(stream=stream, descriptions=descriptions, verbosity=0) super().__init__(stream=stream, descriptions=descriptions, verbosity=0)
self.buffer = True self.buffer = True
self.__suite = ET.Element('testsuite') if self.USE_XML:
self.__suite.set('start', datetime.utcnow().isoformat(' ')) from xml.etree import ElementTree as ET
self.__ET = ET
self.__e = None self.__suite = ET.Element('testsuite')
self.__suite.set('start', datetime.utcnow().isoformat(' '))
self.__e = None
self.__start_time = None self.__start_time = None
self.__results = [] self.__results = []
self.__verbose = bool(verbosity) self.__verbose = bool(verbosity)
@ -42,17 +43,22 @@ class RegressionTestResult(unittest.TextTestResult):
def startTest(self, test): def startTest(self, test):
super().startTest(test) super().startTest(test)
self.__e = e = ET.SubElement(self.__suite, 'testcase') if self.USE_XML:
self.__e = e = self.__ET.SubElement(self.__suite, 'testcase')
self.__start_time = time.perf_counter() self.__start_time = time.perf_counter()
if self.__verbose: if self.__verbose:
self.stream.write(f'{self.getDescription(test)} ... ') self.stream.write(f'{self.getDescription(test)} ... ')
self.stream.flush() self.stream.flush()
def _add_result(self, test, capture=False, **args): def _add_result(self, test, capture=False, **args):
if not self.USE_XML:
return
e = self.__e e = self.__e
self.__e = None self.__e = None
if e is None: if e is None:
return return
ET = self.__ET
e.set('name', args.pop('name', self.__getId(test))) e.set('name', args.pop('name', self.__getId(test)))
e.set('status', args.pop('status', 'run')) e.set('status', args.pop('status', 'run'))
e.set('result', args.pop('result', 'completed')) e.set('result', args.pop('result', 'completed'))
@ -147,6 +153,8 @@ class RegressionTestResult(unittest.TextTestResult):
self.stream.write('%s\n' % err) self.stream.write('%s\n' % err)
def get_xml_element(self): def get_xml_element(self):
if not self.USE_XML:
raise ValueError("USE_XML is false")
e = self.__suite e = self.__suite
e.set('tests', str(self.testsRun)) e.set('tests', str(self.testsRun))
e.set('errors', str(len(self.errors))) e.set('errors', str(len(self.errors)))
@ -174,6 +182,9 @@ def get_test_runner(stream, verbosity, capture_output=False):
return get_test_runner_class(verbosity, capture_output)(stream) return get_test_runner_class(verbosity, capture_output)(stream)
if __name__ == '__main__': if __name__ == '__main__':
import xml.etree.ElementTree as ET
RegressionTestResult.USE_XML = True
class TestTests(unittest.TestCase): class TestTests(unittest.TestCase):
def test_pass(self): def test_pass(self):
pass pass