Source code for mlx.warnings.junit_checker
try:
from lxml import etree
except ImportError:
from xml.etree import ElementTree as etree
from junitparser import Error, Failure, JUnitXml
from .warnings_checker import WarningsChecker
[docs]class JUnitChecker(WarningsChecker):
name = 'junit'
[docs] def check(self, content):
''' Function for counting the number of JUnit failures in a specific text
Args:
content (str): The content to parse
'''
try:
root_input = etree.fromstring(content.encode('utf-8'))
testsuites_root = self.prepare_tree(root_input)
suites = JUnitXml.fromelem(testsuites_root)
amount_to_exclude = 0
for suite in suites:
for testcase in suite:
amount_to_exclude += self._check_testcase(testcase)
suites.update_statistics()
self.count += suites.failures + suites.errors - amount_to_exclude
except etree.ParseError as err:
print(err)
[docs] @staticmethod
def prepare_tree(root_input):
''' Prepares the tree element by adding a testsuites element as root when missing (to please JUnitXml)
Args:
root_input (lxml.etree._Element/xml.etree.ElementTree.Element): Top-level XML element from input file
Returns:
lxml.etree._Element/xml.etree.ElementTree.Element: Top-level XML element with testsuites tag
'''
if root_input.tag.startswith('testsuite') and root_input.find('testcase') is None:
testsuites_root = root_input
else:
testsuites_root = etree.Element("testsuites")
testsuites_root.append(root_input)
return testsuites_root
def _check_testcase(self, testcase):
""" Handles the check of a test case element by checking if the result is a failure/error.
If it is to be excluded by a configured regex, 1 is returned.
Otherwise, when in verbose mode, the suite name and test case name are printed.
Args:
testcase (junitparser.TestCase): Test case element to check for failure or error
Returns:
int: 1 if a failure/error is to be subtracted from the final count, 0 otherwise
"""
if isinstance(testcase.result, (Failure, Error)):
if self._is_excluded(testcase.result.message):
return 1
string = '{classname}.{testname}'.format(classname=testcase.classname, testname=testcase.name)
self.counted_warnings.append('{}: {}'.format(string, testcase.result.message))
self.print_when_verbose(string)
return 0