the other instance must be interrogated.
:ivar result: The result that tests are passed to after filtering.
+ :ivar filter_predicate: The callback run to decide whether to pass
+ a result.
"""
def __init__(self, result, filter_error=False, filter_failure=False,
- filter_success=True, filter_skip=False):
+ filter_success=True, filter_skip=False,
+ filter_predicate=None):
"""Create a FilterResult object filtering to result.
:param filter_error: Filter out errors.
:param filter_failure: Filter out failures.
:param filter_success: Filter out successful tests.
:param filter_skip: Filter out skipped tests.
+ :param filter_predicate: A callable taking (test, err) and
+ returning True if the result should be passed through.
+ err is None for success.
"""
unittest.TestResult.__init__(self)
self.result = result
self._filter_failure = filter_failure
self._filter_success = filter_success
self._filter_skip = filter_skip
+ if filter_predicate is None:
+ filter_predicate = lambda test, err: True
+ self.filter_predicate = filter_predicate
def addError(self, test, err):
- if not self._filter_error:
+ if not self._filter_error and self.filter_predicate(test, err):
self.result.startTest(test)
self.result.addError(test, err)
self.result.stopTest(test)
def addFailure(self, test, err):
- if not self._filter_failure:
+ if not self._filter_failure and self.filter_predicate(test, err):
self.result.startTest(test)
self.result.addFailure(test, err)
self.result.stopTest(test)
def addSkip(self, test, reason):
- if not self._filter_skip:
+ if not self._filter_skip and self.filter_predicate(test, reason):
self.result.startTest(test)
# This is duplicated, it would be nice to have on a 'calls
# TestResults' mixin perhaps.
self.result.stopTest(test)
def addSuccess(self, test):
- if not self._filter_success:
+ if not self._filter_success and self.filter_predicate(test, None):
self.result.startTest(test)
self.result.addSuccess(test)
self.result.stopTest(test)
self.filtered_result.failures])
self.assertEqual(5, self.filtered_result.testsRun)
+ def test_filter_predicate(self):
+ """You can filter by predicate callbacks"""
+ self.filtered_result = unittest.TestResult()
+ filter_cb = lambda test, err: str(err).find('error details') != -1
+ self.filter = subunit.TestResultFilter(self.filtered_result,
+ filter_predicate=filter_cb,
+ filter_success=False)
+ self.run_tests()
+ self.assertEqual(1,
+ self.filtered_result.testsRun)
+ # I'd like to test filtering the xfail but it's blocked by
+ # https://bugs.edge.launchpad.net/subunit/+bug/409193 -- mbp 20090805
+
def run_tests(self):
self.setUpTestStream()
self.test = subunit.ProtocolTestCase(self.input_stream)
tags: local
failure failed
test error
-error error
+error error [
+error details
+]
test skipped
skip skipped
test todo