mirror of
https://github.com/python/cpython.git
synced 2025-07-24 11:44:31 +00:00
bpo-34582: Adds JUnit XML output for regression tests (GH-9210)
This commit is contained in:
parent
cb5778f00c
commit
d0f49d2f50
12 changed files with 329 additions and 33 deletions
|
@ -100,8 +100,11 @@ class Regrtest:
|
|||
self.next_single_test = None
|
||||
self.next_single_filename = None
|
||||
|
||||
# used by --junit-xml
|
||||
self.testsuite_xml = None
|
||||
|
||||
def accumulate_result(self, test, result):
|
||||
ok, test_time = result
|
||||
ok, test_time, xml_data = result
|
||||
if ok not in (CHILD_ERROR, INTERRUPTED):
|
||||
self.test_times.append((test_time, test))
|
||||
if ok == PASSED:
|
||||
|
@ -118,6 +121,15 @@ class Regrtest:
|
|||
elif ok != INTERRUPTED:
|
||||
raise ValueError("invalid test result: %r" % ok)
|
||||
|
||||
if xml_data:
|
||||
import xml.etree.ElementTree as ET
|
||||
for e in xml_data:
|
||||
try:
|
||||
self.testsuite_xml.append(ET.fromstring(e))
|
||||
except ET.ParseError:
|
||||
print(xml_data, file=sys.__stderr__)
|
||||
raise
|
||||
|
||||
def display_progress(self, test_index, test):
|
||||
if self.ns.quiet:
|
||||
return
|
||||
|
@ -164,6 +176,9 @@ class Regrtest:
|
|||
file=sys.stderr)
|
||||
ns.findleaks = False
|
||||
|
||||
if ns.xmlpath:
|
||||
support.junit_xml_list = self.testsuite_xml = []
|
||||
|
||||
# Strip .py extensions.
|
||||
removepy(ns.args)
|
||||
|
||||
|
@ -384,7 +399,7 @@ class Regrtest:
|
|||
result = runtest(self.ns, test)
|
||||
except KeyboardInterrupt:
|
||||
self.interrupted = True
|
||||
self.accumulate_result(test, (INTERRUPTED, None))
|
||||
self.accumulate_result(test, (INTERRUPTED, None, None))
|
||||
break
|
||||
else:
|
||||
self.accumulate_result(test, result)
|
||||
|
@ -508,6 +523,31 @@ class Regrtest:
|
|||
if self.ns.runleaks:
|
||||
os.system("leaks %d" % os.getpid())
|
||||
|
||||
def save_xml_result(self):
|
||||
if not self.ns.xmlpath and not self.testsuite_xml:
|
||||
return
|
||||
|
||||
import xml.etree.ElementTree as ET
|
||||
root = ET.Element("testsuites")
|
||||
|
||||
# Manually count the totals for the overall summary
|
||||
totals = {'tests': 0, 'errors': 0, 'failures': 0}
|
||||
for suite in self.testsuite_xml:
|
||||
root.append(suite)
|
||||
for k in totals:
|
||||
try:
|
||||
totals[k] += int(suite.get(k, 0))
|
||||
except ValueError:
|
||||
pass
|
||||
|
||||
for k, v in totals.items():
|
||||
root.set(k, str(v))
|
||||
|
||||
xmlpath = os.path.join(support.SAVEDCWD, self.ns.xmlpath)
|
||||
with open(xmlpath, 'wb') as f:
|
||||
for s in ET.tostringlist(root):
|
||||
f.write(s)
|
||||
|
||||
def main(self, tests=None, **kwargs):
|
||||
global TEMPDIR
|
||||
|
||||
|
@ -570,6 +610,9 @@ class Regrtest:
|
|||
self.rerun_failed_tests()
|
||||
|
||||
self.finalize()
|
||||
|
||||
self.save_xml_result()
|
||||
|
||||
if self.bad:
|
||||
sys.exit(2)
|
||||
if self.interrupted:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue