blob: 540ef5697473aeadee9b62baf12d6bedc72fdeda [file] [log] [blame]
"""Simple xunit results file creator utility."""
# Copyright (c) 2020-2022, ARM Limited.
# SPDX-License-Identifier: Apache-2.0
import xml.etree.ElementTree as ET
from xml.dom import minidom
class xunit_results:
"""Xunit results writer."""
def __init__(self):
"""Initialize results."""
self.name = "testsuites"
self.suites = []
def create_suite(self, name):
"""Create xunit suite for results."""
s = xunit_suite(name)
self.suites.append(s)
return s
def write_results(self, filename):
"""Write the results to the appropriate suites."""
suites = ET.Element(self.name)
tree = ET.ElementTree(suites)
for s in self.suites:
testsuite = ET.SubElement(
suites, "testsuite", {"name": s.name, "errors": "0"}
)
tests = 0
failures = 0
skip = 0
for t in s.tests:
test = ET.SubElement(
testsuite,
"testcase",
{"name": t.name, "classname": t.classname, "time": t.time},
)
tests += 1
if t.skip:
skip += 1
ET.SubElement(test, "skipped", {"type": "Skipped test"})
if t.fail:
failures += 1
fail = ET.SubElement(test, "failure", {"type": "Test failed"})
fail.text = t.fail
if t.sysout:
sysout = ET.SubElement(test, "system-out")
sysout.text = t.sysout
if t.syserr:
syserr = ET.SubElement(test, "system-err")
syserr.text = t.syserr
testsuite.attrib["tests"] = str(tests)
testsuite.attrib["failures"] = str(failures)
testsuite.attrib["skip"] = str(skip)
xmlstr = minidom.parseString(ET.tostring(tree.getroot())).toprettyxml(
indent=" "
)
with open(filename, "w") as f:
f.write(xmlstr)
class xunit_suite:
"""Xunit suite for test results."""
def __init__(self, name):
"""Initialize suite."""
self.name = name
self.tests = []
# classname should be of the form suite.class/subclass/subclass2/...
# You can have an unlimited number of subclasses in this manner
class xunit_test:
"""Xunit test result."""
def __init__(self, name, classname=None):
"""Initialize test."""
self.name = name
if classname:
self.classname = classname
else:
self.classname = name
self.time = "0.000"
self.fail = None
self.skip = False
self.sysout = None
self.syserr = None
def failed(self, text):
"""Set test failed information."""
self.fail = text
def skipped(self):
"""Set test as skipped."""
self.skip = True
if __name__ == "__main__":
# Simple test
r = xunit_results()
s = r.create_suite("selftest")
for i in range(0, 10):
t = xunit_test("atest" + str(i), "selftest")
if i == 3:
t.failed("Unknown failure foo")
if i == 7:
t.skipped()
s.tests.append(t)
r.write_results("foo.xml")