blob: f6abdb1207c029be5cd70bbea3e1eaa8070f6585 [file] [log] [blame] [edit]
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)