summaryrefslogtreecommitdiffstats
path: root/Lib/unittest
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/unittest')
-rw-r--r--Lib/unittest/result.py3
-rw-r--r--Lib/unittest/test/test_case.py28
2 files changed, 30 insertions, 1 deletions
diff --git a/Lib/unittest/result.py b/Lib/unittest/result.py
index b967a60..8e0a643 100644
--- a/Lib/unittest/result.py
+++ b/Lib/unittest/result.py
@@ -121,7 +121,6 @@ class TestResult(object):
self.failures.append((test, self._exc_info_to_string(err, test)))
self._mirrorOutput = True
- @failfast
def addSubTest(self, test, subtest, err):
"""Called at the end of a subtest.
'err' is None if the subtest ended successfully, otherwise it's a
@@ -130,6 +129,8 @@ class TestResult(object):
# By default, we don't do anything with successful subtests, but
# more sophisticated test results might want to record them.
if err is not None:
+ if getattr(self, 'failfast', False):
+ self.stop()
if issubclass(err[0], test.failureException):
errors = self.failures
else:
diff --git a/Lib/unittest/test/test_case.py b/Lib/unittest/test/test_case.py
index c4a100c..503ad2f 100644
--- a/Lib/unittest/test/test_case.py
+++ b/Lib/unittest/test/test_case.py
@@ -397,6 +397,34 @@ class Test_TestCase(unittest.TestCase, TestEquality, TestHashing):
Foo(events).run(result)
self.assertEqual(events, expected)
+ def test_subtests_failfast(self):
+ # Ensure proper test flow with subtests and failfast (issue #22894)
+ events = []
+
+ class Foo(unittest.TestCase):
+ def test_a(self):
+ with self.subTest():
+ events.append('a1')
+ events.append('a2')
+
+ def test_b(self):
+ with self.subTest():
+ events.append('b1')
+ with self.subTest():
+ self.fail('failure')
+ events.append('b2')
+
+ def test_c(self):
+ events.append('c')
+
+ result = unittest.TestResult()
+ result.failfast = True
+ suite = unittest.makeSuite(Foo)
+ suite.run(result)
+
+ expected = ['a1', 'a2', 'b1']
+ self.assertEqual(events, expected)
+
# "This class attribute gives the exception raised by the test() method.
# If a test framework needs to use a specialized exception, possibly to
# carry additional information, it must subclass this exception in