| 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) |