76 lines
2.1 KiB
Python
76 lines
2.1 KiB
Python
|
#!/usr/bin/python3
|
||
|
|
||
|
import argparse
|
||
|
import sys
|
||
|
import xml
|
||
|
from pathlib import Path
|
||
|
|
||
|
from beautifultable import BeautifulTable
|
||
|
from junitparser import Attr, Failure, JUnitXml, TestSuite
|
||
|
|
||
|
|
||
|
def parse_args(cmdln_args):
|
||
|
parser = argparse.ArgumentParser(description="Parse and print UI test JUnit results")
|
||
|
parser.add_argument(
|
||
|
"--results", type=Path,
|
||
|
help="Directory containing task artifact results", required=True
|
||
|
)
|
||
|
return parser.parse_args(args=cmdln_args)
|
||
|
|
||
|
|
||
|
class test_suite(TestSuite):
|
||
|
flakes = Attr()
|
||
|
|
||
|
|
||
|
def parse_print_failure_results(results):
|
||
|
table = BeautifulTable(maxwidth=256)
|
||
|
table.columns.header = (['UI Test', 'Outcome', 'Details'])
|
||
|
table.columns.alignment = BeautifulTable.ALIGN_LEFT
|
||
|
table.set_style(BeautifulTable.STYLE_GRID)
|
||
|
|
||
|
for suite in results:
|
||
|
cur_suite = test_suite.fromelem(suite)
|
||
|
if cur_suite.flakes != '0':
|
||
|
for case in suite:
|
||
|
for entry in case.result:
|
||
|
if case.result:
|
||
|
table.rows.append(
|
||
|
["%s#%s" % (case.classname, case.name), "Flaky", entry.text.replace('\t', ' ')])
|
||
|
break
|
||
|
else:
|
||
|
for case in suite:
|
||
|
for entry in case.result:
|
||
|
if isinstance(entry, Failure):
|
||
|
table.rows.append(
|
||
|
["%s#%s" % (case.classname, case.name), "Failure", entry.text.replace('\t', ' ')])
|
||
|
break
|
||
|
print(table)
|
||
|
|
||
|
|
||
|
def load_results_file(filename):
|
||
|
ret = None
|
||
|
try:
|
||
|
f = open(filename, 'r')
|
||
|
try:
|
||
|
ret = JUnitXml.fromfile(f)
|
||
|
except xml.etree.ElementTree.ParseError as e:
|
||
|
print(f'Error parsing {filename} file: {e}')
|
||
|
finally:
|
||
|
f.close()
|
||
|
except IOError as e:
|
||
|
print(e)
|
||
|
|
||
|
return ret
|
||
|
|
||
|
|
||
|
def main():
|
||
|
args = parse_args(sys.argv[1:])
|
||
|
|
||
|
junitxml = load_results_file(args.results.joinpath('FullJUnitReport.xml'))
|
||
|
if junitxml:
|
||
|
parse_print_failure_results(junitxml)
|
||
|
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
main()
|