aboutsummaryrefslogtreecommitdiff
path: root/test/scripts/xunit/xunit.py
diff options
context:
space:
mode:
Diffstat (limited to 'test/scripts/xunit/xunit.py')
-rw-r--r--test/scripts/xunit/xunit.py109
1 files changed, 109 insertions, 0 deletions
diff --git a/test/scripts/xunit/xunit.py b/test/scripts/xunit/xunit.py
new file mode 100644
index 0000000..2de0d5c
--- /dev/null
+++ b/test/scripts/xunit/xunit.py
@@ -0,0 +1,109 @@
+# Copyright (c) 2020-2021, ARM Limited.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import xml.etree.ElementTree as ET
+from xml.dom import minidom
+
+
+class xunit_results:
+ def __init__(self):
+ self.name = "testsuites"
+ self.suites = []
+
+ def create_suite(self, name):
+ s = xunit_suite(name)
+ self.suites.append(s)
+ return s
+
+ def write_results(self, filename):
+ 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:
+ def __init__(self, name):
+ self.name = name
+ self.tests = []
+
+
+# classname should be of the form suite.class/subclass/subclass2/... It appears
+# you can have an unlimited number of subclasses in this manner
+
+
+class xunit_test:
+ def __init__(self, name, classname=None):
+ 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):
+ self.fail = text
+
+ def skipped(self):
+ self.skip = True
+
+
+if __name__ == "__main__":
+ 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")