sanitycheck: support xunit report

Generate a test report using junit/xunit format with all details and
logs that can be published on the web to show results from a sanitycheck
run.

Output is stored in scripts/sanity_chk/ alongside the CSV file.

Change-Id: I5ea6f409c1f86f408eeae870b90a953e71046da9
Signed-off-by: Anas Nashif <anas.nashif@intel.com>
This commit is contained in:
Anas Nashif 2017-04-13 14:44:48 -04:00
commit b3311edff6

View file

@ -172,6 +172,7 @@ import csv
import glob
import concurrent
import concurrent.futures
import xml.etree.ElementTree as ET
if "ZEPHYR_BASE" not in os.environ:
sys.stderr.write("$ZEPHYR_BASE environment variable undefined.\n")
@ -185,6 +186,8 @@ import expr_parser
VERBOSE = 0
LAST_SANITY = os.path.join(ZEPHYR_BASE, "scripts", "sanity_chk",
"last_sanity.csv")
LAST_SANITY_XUNIT = os.path.join(ZEPHYR_BASE, "scripts", "sanity_chk",
"last_sanity.xml")
RELEASE_DATA = os.path.join(ZEPHYR_BASE, "scripts", "sanity_chk",
"sanity_last_release.csv")
CPU_COUNTS = multiprocessing.cpu_count()
@ -1555,6 +1558,63 @@ class TestSuite:
lower_better))
return results
def testcase_xunit_report(self, filename, args):
if self.goals == None:
raise SanityRuntimeException("execute() hasn't been run!")
fails = 0
passes = 0
errors = 0
for name, goal in self.goals.items():
if goal.failed:
if goal.reason in ['build_error', 'qemu_crash']:
errors += 1
else:
fails += 1
else:
passes += 1
run = "Sanitycheck"
eleTestsuite = None
append = args.only_failed
if os.path.exists(filename) or append:
tree = ET.parse(filename)
eleTestsuites = tree.getroot()
eleTestsuite = tree.findall('testsuite')[0];
else:
eleTestsuites = ET.Element('testsuites')
eleTestsuite = ET.SubElement(eleTestsuites, 'testsuite', name=run,
tests="%d" %(errors + passes + fails), failures="%d" %fails, errors="%d" %errors, skip="0")
qemu_time = "0"
for name, goal in self.goals.items():
i = self.instances[name]
if append:
for tc in eleTestsuite.findall('testcase'):
if tc.get('name') == "%s:%s" %(i.platform.name, i.test.name):
eleTestsuite.remove(tc)
if not goal.failed and goal.qemu:
qemu_time = "%s" %(goal.metrics["qemu_time"])
eleTestcase = ET.SubElement(eleTestsuite, 'testcase', name="%s:%s" %(i.platform.name, i.test.name), time=qemu_time)
if goal.failed:
failure = ET.SubElement(eleTestcase, 'failure', type="failure", message=goal.reason)
p = ("%s/%s/%s" %(args.outdir, i.platform.name, i.test.name))
bl = os.path.join(p, "build.log")
if os.path.exists(bl):
with open(bl, "r") as f:
log = f.read()
failure.text = (str(log))
result = ET.tostring(eleTestsuites)
f = open(filename, 'wb')
f.write(result)
f.close()
def testcase_report(self, filename):
if self.goals == None:
raise SanityRuntimeException("execute() hasn't been run!")
@ -1924,6 +1984,7 @@ def main():
if args.testcase_report:
ts.testcase_report(args.testcase_report)
if not args.no_update:
ts.testcase_xunit_report(LAST_SANITY_XUNIT, args)
ts.testcase_report(LAST_SANITY)
if args.release:
ts.testcase_report(RELEASE_DATA)