summaryrefslogtreecommitdiff
path: root/python
diff options
context:
space:
mode:
Diffstat (limited to 'python')
-rw-r--r--python/subunit/__init__.py19
-rw-r--r--python/subunit/tests/test_subunit_filter.py17
2 files changed, 30 insertions, 6 deletions
diff --git a/python/subunit/__init__.py b/python/subunit/__init__.py
index 4907332..4c97015 100644
--- a/python/subunit/__init__.py
+++ b/python/subunit/__init__.py
@@ -792,16 +792,22 @@ class TestResultFilter(unittest.TestResult):
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
@@ -809,21 +815,24 @@ class TestResultFilter(unittest.TestResult):
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.
@@ -835,7 +844,7 @@ class TestResultFilter(unittest.TestResult):
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)
diff --git a/python/subunit/tests/test_subunit_filter.py b/python/subunit/tests/test_subunit_filter.py
index 1341d12..e7196ff 100644
--- a/python/subunit/tests/test_subunit_filter.py
+++ b/python/subunit/tests/test_subunit_filter.py
@@ -91,6 +91,19 @@ class TestTestResultFilter(unittest.TestCase):
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)
@@ -109,7 +122,9 @@ test failed
tags: local
failure failed
test error
-error error
+error error [
+error details
+]
test skipped
skip skipped
test todo