"""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")