Commit 32f381eb authored by Jan Kiene's avatar Jan Kiene
Browse files

handle duplicate testcase for ERROR results

parent 5089e568
Loading
Loading
Loading
Loading
+44 −24
Original line number Diff line number Diff line
@@ -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()
@@ -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

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