summaryrefslogtreecommitdiff
path: root/python/subunit
diff options
context:
space:
mode:
Diffstat (limited to 'python/subunit')
-rw-r--r--python/subunit/__init__.py6
-rwxr-xr-xpython/subunit/run.py15
-rw-r--r--python/subunit/test_results.py7
-rw-r--r--python/subunit/tests/test_test_results.py6
4 files changed, 31 insertions, 3 deletions
diff --git a/python/subunit/__init__.py b/python/subunit/__init__.py
index 6015c0e..ebe6e8c 100644
--- a/python/subunit/__init__.py
+++ b/python/subunit/__init__.py
@@ -636,6 +636,8 @@ class TestProtocolClient(testresult.TestResult):
to subunit.Content objects.
"""
self._addOutcome("error", test, error=error, details=details)
+ if self.failfast:
+ self.stop()
def addExpectedFailure(self, test, error=None, details=None):
"""Report an expected failure in test test.
@@ -666,6 +668,8 @@ class TestProtocolClient(testresult.TestResult):
to subunit.Content objects.
"""
self._addOutcome("failure", test, error=error, details=details)
+ if self.failfast:
+ self.stop()
def _addOutcome(self, outcome, test, error=None, details=None,
error_permitted=True):
@@ -730,6 +734,8 @@ class TestProtocolClient(testresult.TestResult):
"""
self._addOutcome("uxsuccess", test, details=details,
error_permitted=False)
+ if self.failfast:
+ self.stop()
def startTest(self, test):
"""Mark a test as starting its test run."""
diff --git a/python/subunit/run.py b/python/subunit/run.py
index ca5fe5c..b5ccea4 100755
--- a/python/subunit/run.py
+++ b/python/subunit/run.py
@@ -34,13 +34,22 @@ from testtools.run import (
class SubunitTestRunner(object):
- def __init__(self, stream=sys.stdout):
- self.stream = stream
+ def __init__(self, verbosity=None, failfast=None, buffer=None, stream=None):
+ """Create a TestToolsTestRunner.
+
+ :param verbosity: Ignored.
+ :param failfast: Stop running tests at the first failure.
+ :param buffer: Ignored.
+ """
+ self.failfast = failfast
+ self.stream = stream or sys.stdout
def run(self, test):
"Run the given test case or test suite."
result = TestProtocolClient(self.stream)
result = AutoTimingTestResultDecorator(result)
+ if self.failfast is not None:
+ result.failfast = self.failfast
test(result)
return result
@@ -70,6 +79,6 @@ class SubunitTestProgram(TestProgram):
if __name__ == '__main__':
stream = get_default_formatter()
- runner = SubunitTestRunner(stream)
+ runner = SubunitTestRunner
SubunitTestProgram(module=None, argv=sys.argv, testRunner=runner,
stdout=sys.stdout)
diff --git a/python/subunit/test_results.py b/python/subunit/test_results.py
index c00a2d3..91c9bbd 100644
--- a/python/subunit/test_results.py
+++ b/python/subunit/test_results.py
@@ -78,6 +78,13 @@ class TestResultDecorator(object):
def addUnexpectedSuccess(self, test, details=None):
return self.decorated.addUnexpectedSuccess(test, details=details)
+ def _get_failfast(self):
+ return getattr(self.decorated, 'failfast', False)
+
+ def _set_failfast(self, value):
+ self.decorated.failfast = value
+ failfast = property(_get_failfast, _set_failfast)
+
def progress(self, offset, whence):
return self.decorated.progress(offset, whence)
diff --git a/python/subunit/tests/test_test_results.py b/python/subunit/tests/test_test_results.py
index 236dfa2..ff74b9a 100644
--- a/python/subunit/tests/test_test_results.py
+++ b/python/subunit/tests/test_test_results.py
@@ -61,6 +61,7 @@ class TimeCapturingResult(unittest.TestResult):
def __init__(self):
super(TimeCapturingResult, self).__init__()
self._calls = []
+ self.failfast = False
def time(self, a_datetime):
self._calls.append(a_datetime)
@@ -198,6 +199,11 @@ class TestAutoTimingTestResultDecorator(unittest.TestCase):
self.assertEqual(3, len(self.decorated._calls))
self.assertNotEqual(None, self.decorated._calls[2])
+ def test_set_failfast_True(self):
+ self.assertFalse(self.decorated.failfast)
+ self.result.failfast = True
+ self.assertTrue(self.decorated.failfast)
+
class TestTagCollapsingDecorator(TestCase):