summaryrefslogtreecommitdiff
path: root/python
diff options
context:
space:
mode:
authorRobert Collins <robertc@robertcollins.net>2009-10-25 18:05:21 +1100
committerRobert Collins <robertc@robertcollins.net>2009-10-25 18:05:21 +1100
commit7e1d290cb2345840319b58fc8c6cab422cb5b68e (patch)
tree18832cee1b295d667b1cfb5ec43a930edfa75e58 /python
parentf6b397940103643565955391e73099bf54de6dfb (diff)
downloadsubunit-git-7e1d290cb2345840319b58fc8c6cab422cb5b68e.tar.gz
Teach filters about details and outcomes.
Diffstat (limited to 'python')
-rw-r--r--python/subunit/test_results.py93
-rw-r--r--python/subunit/tests/test_subunit_filter.py4
-rw-r--r--python/subunit/tests/test_test_results.py18
3 files changed, 77 insertions, 38 deletions
diff --git a/python/subunit/test_results.py b/python/subunit/test_results.py
index 5401c32..8bfdce5 100644
--- a/python/subunit/test_results.py
+++ b/python/subunit/test_results.py
@@ -51,23 +51,23 @@ class TestResultDecorator(object):
def stopTestRun(self):
return self.decorated.stopTestRun()
- def addError(self, test, err):
- return self.decorated.addError(test, err)
+ def addError(self, test, err=None, details=None):
+ return self.decorated.addError(test, err, details=details)
- def addFailure(self, test, err):
- return self.decorated.addFailure(test, err)
+ def addFailure(self, test, err=None, details=None):
+ return self.decorated.addFailure(test, err, details=details)
- def addSuccess(self, test):
- return self.decorated.addSuccess(test)
+ def addSuccess(self, test, details=None):
+ return self.decorated.addSuccess(test, details=details)
- def addSkip(self, test, reason):
- return self.decorated.addSkip(test, reason)
+ def addSkip(self, test, reason=None, details=None):
+ return self.decorated.addSkip(test, reason, details=details)
- def addExpectedFailure(self, test, err):
- return self.decorated.addExpectedFailure(test, err)
+ def addExpectedFailure(self, test, err=None, details=None):
+ return self.decorated.addExpectedFailure(test, err, details=details)
- def addUnexpectedSuccess(self, test):
- return self.decorated.addUnexpectedSuccess(test)
+ def addUnexpectedSuccess(self, test, details=None):
+ return self.decorated.addUnexpectedSuccess(test, details=details)
def progress(self, offset, whence):
return self.decorated.progress(offset, whence)
@@ -112,29 +112,29 @@ class HookedTestResultDecorator(TestResultDecorator):
self._before_event()
return self.super.stopTestRun()
- def addError(self, test, err):
+ def addError(self, test, err=None, details=None):
self._before_event()
- return self.super.addError(test, err)
+ return self.super.addError(test, err, details=details)
- def addFailure(self, test, err):
+ def addFailure(self, test, err=None, details=None):
self._before_event()
- return self.super.addFailure(test, err)
+ return self.super.addFailure(test, err, details=details)
- def addSuccess(self, test):
+ def addSuccess(self, test, details=None):
self._before_event()
- return self.super.addSuccess(test)
+ return self.super.addSuccess(test, details=details)
- def addSkip(self, test, reason):
+ def addSkip(self, test, reason=None, details=None):
self._before_event()
- return self.super.addSkip(test, reason)
+ return self.super.addSkip(test, reason, details=details)
- def addExpectedFailure(self, test, err):
+ def addExpectedFailure(self, test, err=None, details=None):
self._before_event()
- return self.super.addExpectedFailure(test, err)
+ return self.super.addExpectedFailure(test, err, details=details)
- def addUnexpectedSuccess(self, test):
+ def addUnexpectedSuccess(self, test, details=None):
self._before_event()
- return self.super.addUnexpectedSuccess(test)
+ return self.super.addUnexpectedSuccess(test, details=details)
def progress(self, offset, whence):
self._before_event()
@@ -217,9 +217,11 @@ class TestResultFilter(TestResultDecorator):
: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.
+ :param filter_predicate: A callable taking (test, outcome, err,
+ details) and returning True if the result should be passed
+ through. err and details may be none if no error or extra
+ metadata is available. outcome is the name of the outcome such
+ as 'success' or 'failure'.
"""
TestResultDecorator.__init__(self, result)
self._filter_error = filter_error
@@ -227,7 +229,7 @@ class TestResultFilter(TestResultDecorator):
self._filter_success = filter_success
self._filter_skip = filter_skip
if filter_predicate is None:
- filter_predicate = lambda test, err: True
+ filter_predicate = lambda test, outcome, err, details: True
self.filter_predicate = filter_predicate
# The current test (for filtering tags)
self._current_test = None
@@ -236,36 +238,53 @@ class TestResultFilter(TestResultDecorator):
# The (new, gone) tags for the current test.
self._current_test_tags = None
- def addError(self, test, err, details=None):
- if not self._filter_error and self.filter_predicate(test, err):
+ def addError(self, test, err=None, details=None):
+ if (not self._filter_error and
+ self.filter_predicate(test, 'error', err, details)):
self.decorated.startTest(test)
self.decorated.addError(test, err, details=details)
+ else:
+ self._filtered()
- def addFailure(self, test, err, details=None):
- if not self._filter_failure and self.filter_predicate(test, err):
+ def addFailure(self, test, err=None, details=None):
+ if (not self._filter_failure and
+ self.filter_predicate(test, 'failure', err, details)):
self.decorated.startTest(test)
self.decorated.addFailure(test, err, details=details)
+ else:
+ self._filtered()
- def addSkip(self, test, reason, details=None):
- if not self._filter_skip and self.filter_predicate(test, reason):
+ def addSkip(self, test, reason=None, details=None):
+ if (not self._filter_skip and
+ self.filter_predicate(test, 'skip', reason, details)):
self.decorated.startTest(test)
self.decorated.addSkip(test, reason, details=details)
+ else:
+ self._filtered()
def addSuccess(self, test, details=None):
- if not self._filter_success and self.filter_predicate(test, None):
+ if (not self._filter_success and
+ self.filter_predicate(test, 'success', None, details)):
self.decorated.startTest(test)
self.decorated.addSuccess(test, details=details)
+ else:
+ self._filtered()
- def addExpectedFailure(self, test, err, details=None):
- if self.filter_predicate(test, err):
+ def addExpectedFailure(self, test, err=None, details=None):
+ if self.filter_predicate(test, 'expectedfailure', err, details):
self.decorated.startTest(test)
return self.decorated.addExpectedFailure(test, err,
details=details)
+ else:
+ self._filtered()
def addUnexpectedSuccess(self, test, details=None):
self.decorated.startTest(test)
return self.decorated.addUnexpectedSuccess(test, details=details)
+ def _filtered(self):
+ self._current_test_filtered = True
+
def startTest(self, test):
"""Start a test.
diff --git a/python/subunit/tests/test_subunit_filter.py b/python/subunit/tests/test_subunit_filter.py
index 9baff24..3c65ed3 100644
--- a/python/subunit/tests/test_subunit_filter.py
+++ b/python/subunit/tests/test_subunit_filter.py
@@ -91,11 +91,13 @@ class TestTestResultFilter(unittest.TestCase):
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
+ def filter_cb(test, outcome, err, details):
+ return outcome == 'success'
self.filter = TestResultFilter(self.filtered_result,
filter_predicate=filter_cb,
filter_success=False)
self.run_tests()
+ # Only success should pass
self.assertEqual(1, self.filtered_result.testsRun)
def run_tests(self):
diff --git a/python/subunit/tests/test_test_results.py b/python/subunit/tests/test_test_results.py
index cb7b47e..f0944dd 100644
--- a/python/subunit/tests/test_test_results.py
+++ b/python/subunit/tests/test_test_results.py
@@ -518,21 +518,39 @@ class TestHookedTestResultDecorator(unittest.TestCase):
def test_addError(self):
self.result.addError(self, subunit.RemoteError())
+ def test_addError_details(self):
+ self.result.addError(self, details={})
+
def test_addFailure(self):
self.result.addFailure(self, subunit.RemoteError())
+ def test_addFailure_details(self):
+ self.result.addFailure(self, details={})
+
def test_addSuccess(self):
self.result.addSuccess(self)
+ def test_addSuccess_details(self):
+ self.result.addSuccess(self, details={})
+
def test_addSkip(self):
self.result.addSkip(self, "foo")
+ def test_addSkip_details(self):
+ self.result.addSkip(self, details={})
+
def test_addExpectedFailure(self):
self.result.addExpectedFailure(self, subunit.RemoteError())
+ def test_addExpectedFailure_details(self):
+ self.result.addExpectedFailure(self, details={})
+
def test_addUnexpectedSuccess(self):
self.result.addUnexpectedSuccess(self)
+ def test_addUnexpectedSuccess_details(self):
+ self.result.addUnexpectedSuccess(self, details={})
+
def test_progress(self):
self.result.progress(1, subunit.PROGRESS_SET)