import functools import os import warnings try: import lxml.etree p = lxml.etree.XMLParser(huge_tree=True) parse = functools.partial(lxml.etree.parse, parser=p) except ImportError: import xml.etree.ElementTree as ET parse = ET.parse warnings.warn( "lxml was not found. `pip install lxml` to make this script run much faster" ) def open_test_results(directory): xmls = [] for root, _, files in os.walk(directory): for file in files: if file.endswith(".xml"): tree = parse(f"{root}/{file}") xmls.append(tree) return xmls def get_testcases(xmls): testcases = [] for xml in xmls: root = xml.getroot() testcases.extend(list(root.iter("testcase"))) return testcases def find(testcase, condition): children = list(testcase.iter()) assert children[0] is testcase children = children[1:] return condition(children) def skipped_test(testcase): def condition(children): return "skipped" in {child.tag for child in children} return find(testcase, condition) def passed_test(testcase): def condition(children): if len(children) == 0: return True tags = {child.tag for child in children} return "skipped" not in tags and "failed" not in tags return find(testcase, condition) def key(testcase): file = testcase.attrib.get("file", "UNKNOWN") classname = testcase.attrib["classname"] name = testcase.attrib["name"] return "::".join([file, classname, name]) def get_passed_testcases(xmls): testcases = get_testcases(xmls) passed_testcases = [testcase for testcase in testcases if passed_test(testcase)] return passed_testcases def get_excluded_testcases(xmls): testcases = get_testcases(xmls) excluded_testcases = [t for t in testcases if excluded_testcase(t)] return excluded_testcases def excluded_testcase(testcase): def condition(children): for child in children: if child.tag == "skipped": if "Policy: we don't run" in child.attrib["message"]: return True return False return find(testcase, condition) def is_unexpected_success(testcase): def condition(children): for child in children: if child.tag != "failure": continue is_unexpected_success = ( "unexpected success" in child.attrib["message"].lower() ) if is_unexpected_success: return True return False return find(testcase, condition) MSG = "This test passed, maybe we can remove the skip from dynamo_test_failures.py" def is_passing_skipped_test(testcase): def condition(children): for child in children: if child.tag != "skipped": continue has_passing_skipped_test_msg = MSG in child.attrib["message"] if has_passing_skipped_test_msg: return True return False return find(testcase, condition) # NB: not an unexpected success def is_failure(testcase): def condition(children): for child in children: if child.tag != "failure": continue is_unexpected_success = ( "unexpected success" in child.attrib["message"].lower() ) if not is_unexpected_success: return True return False return find(testcase, condition)