diff options
| author | Robert Collins <robertc@robertcollins.net> | 2009-02-28 20:27:25 +1100 |
|---|---|---|
| committer | Robert Collins <robertc@robertcollins.net> | 2009-02-28 20:27:25 +1100 |
| commit | 2d27527361848457a6da460b1790385ef61fee90 (patch) | |
| tree | db8e9def1e7f340ebe9ccc8411fdaebe9ee98b49 /python/subunit/__init__.py | |
| parent | 14026b1a23447dda1ada9bb490cdfa118e06fb8d (diff) | |
| download | subunit-git-2d27527361848457a6da460b1790385ef61fee90.tar.gz | |
Update skip support in python to be in line with testtools.
Diffstat (limited to 'python/subunit/__init__.py')
| -rw-r--r-- | python/subunit/__init__.py | 53 |
1 files changed, 46 insertions, 7 deletions
diff --git a/python/subunit/__init__.py b/python/subunit/__init__.py index 84426ac..9f7dd64 100644 --- a/python/subunit/__init__.py +++ b/python/subunit/__init__.py @@ -133,7 +133,7 @@ class TestProtocolServer(object): self.current_test_description == line[offset:-1]): self.state = TestProtocolServer.OUTSIDE_TEST self.current_test_description = None - self.client.addSuccess(self._current_test) + self._skip_or_error() self.client.stopTest(self._current_test) elif (self.state == TestProtocolServer.TEST_STARTED and self.current_test_description + " [" == line[offset:-1]): @@ -142,6 +142,16 @@ class TestProtocolServer(object): else: self.stdOutLineReceived(line) + def _skip_or_error(self, message=None): + """Report the current test as a skip if possible, or else an error.""" + addSkip = getattr(self.client, 'addSkip', None) + if not callable(addSkip): + self.client.addError(self._current_test, RemoteError(message)) + else: + if not message: + message = "No reason given" + addSkip(self._current_test, message) + def _addSuccess(self, offset, line): if (self.state == TestProtocolServer.TEST_STARTED and self.current_test_description == line[offset:-1]): @@ -173,8 +183,12 @@ class TestProtocolServer(object): self.client.addError(self._current_test, RemoteError(self._message)) self.client.stopTest(self._current_test) + elif self.state == TestProtocolServer.READING_SKIP: + self.state = TestProtocolServer.OUTSIDE_TEST + self.current_test_description = None + self._skip_or_error(self._message) + self.client.stopTest(self._current_test) elif self.state in ( - TestProtocolServer.READING_SKIP, TestProtocolServer.READING_SUCCESS, TestProtocolServer.READING_XFAIL, ): @@ -314,6 +328,12 @@ class TestProtocolClient(unittest.TestResult): self._stream.write("%s\n" % line) self._stream.write("]\n") + def addSkip(self, test, reason): + """Report a skipped test.""" + self._stream.write("skip: %s [\n" % test.id()) + self._stream.write("%s\n" % reason) + self._stream.write("]\n") + def addSuccess(self, test): """Report a success in a test.""" self._stream.write("successful: %s\n" % test.id()) @@ -651,6 +671,7 @@ class TestResultStats(unittest.TestResult): unittest.TestResult.__init__(self) self._stream = stream self.failed_tests = 0 + self.skipped_tests = 0 self.tags = set() @property @@ -663,16 +684,20 @@ class TestResultStats(unittest.TestResult): def addFailure(self, test, err): self.failed_tests += 1 + def addSkip(self, test, reason): + self.skipped_tests += 1 + def formatStats(self): - self._stream.write("Total tests: %5d\n" % self.total_tests) - self._stream.write("Passed tests: %5d\n" % self.passed_tests) - self._stream.write("Failed tests: %5d\n" % self.failed_tests) + self._stream.write("Total tests: %5d\n" % self.total_tests) + self._stream.write("Passed tests: %5d\n" % self.passed_tests) + self._stream.write("Failed tests: %5d\n" % self.failed_tests) + self._stream.write("Skipped tests: %5d\n" % self.skipped_tests) tags = sorted(self.tags) self._stream.write("Tags: %s\n" % (", ".join(tags))) @property def passed_tests(self): - return self.total_tests - self.failed_tests + return self.total_tests - self.failed_tests - self.skipped_tests def stopTest(self, test): unittest.TestResult.stopTest(self, test) @@ -694,18 +719,20 @@ class TestResultFilter(unittest.TestResult): """ def __init__(self, result, filter_error=False, filter_failure=False, - filter_success=True): + filter_success=True, filter_skip=False): """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. """ unittest.TestResult.__init__(self) self.result = result self._filter_error = filter_error self._filter_failure = filter_failure self._filter_success = filter_success + self._filter_skip = filter_skip def addError(self, test, err): if not self._filter_error: @@ -719,6 +746,18 @@ class TestResultFilter(unittest.TestResult): self.result.addFailure(test, err) self.result.stopTest(test) + def addSkip(self, test, reason): + if not self._filter_skip: + self.result.startTest(test) + # This is duplicated, it would be nice to have on a 'calls + # TestResults' mixin perhaps. + addSkip = getattr(self.result, 'addSkip', None) + if not callable(addSkip): + self.result.addError(test, RemoteError(reason)) + else: + self.result.addSkip(test, reason) + self.result.stopTest(test) + def addSuccess(self, test): if not self._filter_success: self.result.startTest(test) |
