Loading scripts/parse_xml_report.py +44 −24 Original line number Diff line number Diff line Loading @@ -6,6 +6,47 @@ from xml.etree import ElementTree from collections import Counter class TestcaseParser(dict): def __init__(self, testcases: list): super().__init__() for tc in testcases: self.parse_testcase(tc) def parse_testcase(self, testcase): """ Get all properties + name for a testcase """ filename = testcase.get( "file", testcase.get("classname").replace(".", "/") + ".py" ) fulltestname = filename + "::" + testcase.get("name") result = get_result_from_testcase(testcase) # for ERRORS, two testcases are recorded, one with FAIL and one with ERROR # if we already have this testcase, do a sanity check and set result to ERROR if fulltestname in self: results = [self[fulltestname]["result"], result] assert any(r == "ERROR" for r in results) self[fulltestname]["result"] = "ERROR" return ret = {} ret["testcase"] = fulltestname ret["result"] = result properties = { p.get("name"): p.get("value") for p in testcase.findall(".//property") } ret.update(properties) self[fulltestname] = ret def to_df(self) -> pd.DataFrame: testcases = list(self.values()) df = pd.DataFrame(testcases) return df def xml_to_dataframe(xml_report: str) -> pd.DataFrame: tree = ElementTree.parse(xml_report) root = tree.getroot() Loading @@ -13,8 +54,8 @@ def xml_to_dataframe(xml_report: str) -> pd.DataFrame: testcases = root[0].findall("testcase") testcases = [tc for tc in testcases if tc.find("skipped") is None] parsed_testcases = [parse_testcase(tc) for tc in testcases] testcase_df = pd.DataFrame(parsed_testcases) testcase_parser = TestcaseParser(testcases) testcase_df = testcase_parser.to_df() return testcase_df Loading @@ -30,30 +71,9 @@ def get_result_from_testcase(testcase: ElementTree.Element) -> str: return testresult def parse_testcase(testcase) -> dict: """ Get all properties + name for a testcase """ ret = {} filename = testcase.get("file", testcase.get("classname").replace(".", "/") + ".py") fulltestname = filename + "::" + testcase.get("name") ret["testcase"] = fulltestname result = get_result_from_testcase(testcase) ret["result"] = result properties = { p.get("name"): p.get("value") for p in testcase.findall(".//property") } ret.update(properties) return ret def main(xml_report, csv_file): df = xml_to_dataframe(xml_report) df.to_csv(csv_file) df.to_csv(csv_file, index=False) n_testcases = len(df) count = Counter(df["result"]) Loading Loading
scripts/parse_xml_report.py +44 −24 Original line number Diff line number Diff line Loading @@ -6,6 +6,47 @@ from xml.etree import ElementTree from collections import Counter class TestcaseParser(dict): def __init__(self, testcases: list): super().__init__() for tc in testcases: self.parse_testcase(tc) def parse_testcase(self, testcase): """ Get all properties + name for a testcase """ filename = testcase.get( "file", testcase.get("classname").replace(".", "/") + ".py" ) fulltestname = filename + "::" + testcase.get("name") result = get_result_from_testcase(testcase) # for ERRORS, two testcases are recorded, one with FAIL and one with ERROR # if we already have this testcase, do a sanity check and set result to ERROR if fulltestname in self: results = [self[fulltestname]["result"], result] assert any(r == "ERROR" for r in results) self[fulltestname]["result"] = "ERROR" return ret = {} ret["testcase"] = fulltestname ret["result"] = result properties = { p.get("name"): p.get("value") for p in testcase.findall(".//property") } ret.update(properties) self[fulltestname] = ret def to_df(self) -> pd.DataFrame: testcases = list(self.values()) df = pd.DataFrame(testcases) return df def xml_to_dataframe(xml_report: str) -> pd.DataFrame: tree = ElementTree.parse(xml_report) root = tree.getroot() Loading @@ -13,8 +54,8 @@ def xml_to_dataframe(xml_report: str) -> pd.DataFrame: testcases = root[0].findall("testcase") testcases = [tc for tc in testcases if tc.find("skipped") is None] parsed_testcases = [parse_testcase(tc) for tc in testcases] testcase_df = pd.DataFrame(parsed_testcases) testcase_parser = TestcaseParser(testcases) testcase_df = testcase_parser.to_df() return testcase_df Loading @@ -30,30 +71,9 @@ def get_result_from_testcase(testcase: ElementTree.Element) -> str: return testresult def parse_testcase(testcase) -> dict: """ Get all properties + name for a testcase """ ret = {} filename = testcase.get("file", testcase.get("classname").replace(".", "/") + ".py") fulltestname = filename + "::" + testcase.get("name") ret["testcase"] = fulltestname result = get_result_from_testcase(testcase) ret["result"] = result properties = { p.get("name"): p.get("value") for p in testcase.findall(".//property") } ret.update(properties) return ret def main(xml_report, csv_file): df = xml_to_dataframe(xml_report) df.to_csv(csv_file) df.to_csv(csv_file, index=False) n_testcases = len(df) count = Counter(df["result"]) Loading