[Lldb-commits] [lldb] r248247 - xUnit test formatter: add options for ignoring skipped tests
Todd Fiala via lldb-commits
lldb-commits at lists.llvm.org
Mon Sep 21 23:32:50 PDT 2015
Author: tfiala
Date: Tue Sep 22 01:32:50 2015
New Revision: 248247
URL: http://llvm.org/viewvc/llvm-project?rev=248247&view=rev
Log:
xUnit test formatter: add options for ignoring skipped tests
Skipped tests can be dropped from xUnit reports if either
the name or the skip reason matches one of a given set of
regular expression patterns (via re.search(), not re.match()).
New formatter option for the xunit formatter:
--ignore-skip-matching-reason and
--ignore-skip-matching-name
Both are results-formatter options.
Modified:
lldb/trunk/test/test_results.py
Modified: lldb/trunk/test/test_results.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/test_results.py?rev=248247&r1=248246&r2=248247&view=diff
==============================================================================
--- lldb/trunk/test/test_results.py (original)
+++ lldb/trunk/test/test_results.py Tue Sep 22 01:32:50 2015
@@ -456,6 +456,7 @@ class ResultsFormatter(object):
terminate_event = EventBuilder.bare_event("terminate")
self.handle_event(terminate_event)
+
class XunitFormatter(ResultsFormatter):
"""Provides xUnit-style formatted output.
"""
@@ -537,6 +538,20 @@ class XunitFormatter(ResultsFormatter):
help=('cause unknown test events to generate '
'a python assert. Default is to ignore.'))
parser.add_argument(
+ "--ignore-skip-matching-name",
+ action="store",
+ help=('one or more comma-separated python regex patterns, where '
+ 'any skipped test with a test method name where regex '
+ 'matches (via search) will be ignored for xUnit test '
+ 'result purposes.'))
+ parser.add_argument(
+ "--ignore-skip-matching-reason",
+ action="store",
+ help=('one or more comma-separated python regex patterns, where '
+ 'any skipped test with a skip reason where the regex '
+ 'matches (via search) will be ignored for xUnit test '
+ 'result purposes.'))
+ parser.add_argument(
"--xpass", action="store", choices=results_mapping_choices,
default=XunitFormatter.RM_FAILURE,
help=('specify mapping from unexpected success to jUnit/xUnit '
@@ -548,6 +563,22 @@ class XunitFormatter(ResultsFormatter):
'result type'))
return parser
+ @staticmethod
+ def _build_regex_list_from_option(option):
+ """Builds a list of compiled regexes from option value.
+
+ @param option string containing a comma-separated list of regex
+ patterns. Zero-length or None will produce an empty regex list.
+
+ @return list of compiled regular expressions, empty if no
+ patterns provided.
+ """
+ regex_list = []
+ if option is not None and len(option) > 0:
+ for pattern in option.split(","):
+ regex_list.append(re.compile(pattern))
+ return regex_list
+
def __init__(self, out_file, options):
"""Initializes the XunitFormatter instance.
@param out_file file-like object where formatted output is written.
@@ -558,8 +589,13 @@ class XunitFormatter(ResultsFormatter):
super(XunitFormatter, self).__init__(out_file, options)
self.text_encoding = "UTF-8"
self.invalid_xml_re = XunitFormatter._build_illegal_xml_regex()
-
self.total_test_count = 0
+ self.ignore_skip_name_regexes = (
+ XunitFormatter._build_regex_list_from_option(
+ options.ignore_skip_matching_name))
+ self.ignore_skip_reason_regexes = (
+ XunitFormatter._build_regex_list_from_option(
+ options.ignore_skip_matching_reason))
self.elements = {
"successes": [],
@@ -648,10 +684,40 @@ class XunitFormatter(ResultsFormatter):
with self.lock:
self.elements["errors"].append(result)
+ @staticmethod
+ def _ignore_based_on_regex_list(test_event, test_key, regex_list):
+ """Returns whether to ignore a test event based on patterns.
+
+ @param test_event the test event dictionary to check.
+ @param test_key the key within the dictionary to check.
+ @param regex_list a list of zero or more regexes. May contain
+ zero or more compiled regexes.
+
+ @return True if any o the regex list match based on the
+ re.search() method; false otherwise.
+ """
+ for regex in regex_list:
+ match = regex.search(test_event.get(test_key, ''))
+ if match:
+ return True
+ return False
+
def _handle_skip(self, test_event):
"""Handles a skipped test.
@param test_event the test event to handle.
"""
+
+ # Are we ignoring this test based on test name?
+ if XunitFormatter._ignore_based_on_regex_list(
+ test_event, 'test_name', self.ignore_skip_name_regexes):
+ return
+
+ # Are we ignoring this test based on skip reason?
+ if XunitFormatter._ignore_based_on_regex_list(
+ test_event, 'skip_reason', self.ignore_skip_reason_regexes):
+ return
+
+ # We're not ignoring this test. Process the skip.
reason = self._replace_invalid_xml(test_event.get("skip_reason", ""))
result = self._common_add_testcase_entry(
test_event,
@@ -857,6 +923,7 @@ class XunitFormatter(ResultsFormatter):
self.out_file.write('</testsuite></testsuites>\n')
def _finish_output(self):
+ """Finish writing output as all incoming events have arrived."""
with self.lock:
self._finish_output_no_lock()
More information about the lldb-commits
mailing list