diff options
| author | Robert Collins <robertc@robertcollins.net> | 2009-10-25 18:05:21 +1100 |
|---|---|---|
| committer | Robert Collins <robertc@robertcollins.net> | 2009-10-25 18:05:21 +1100 |
| commit | 7e1d290cb2345840319b58fc8c6cab422cb5b68e (patch) | |
| tree | 18832cee1b295d667b1cfb5ec43a930edfa75e58 /python | |
| parent | f6b397940103643565955391e73099bf54de6dfb (diff) | |
| download | subunit-git-7e1d290cb2345840319b58fc8c6cab422cb5b68e.tar.gz | |
Teach filters about details and outcomes.
Diffstat (limited to 'python')
| -rw-r--r-- | python/subunit/test_results.py | 93 | ||||
| -rw-r--r-- | python/subunit/tests/test_subunit_filter.py | 4 | ||||
| -rw-r--r-- | python/subunit/tests/test_test_results.py | 18 |
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) |
