diff options
author | Antoine Pitrou <solipsis@pitrou.net> | 2014-11-23 14:55:11 (GMT) |
---|---|---|
committer | Antoine Pitrou <solipsis@pitrou.net> | 2014-11-23 14:55:11 (GMT) |
commit | 18f22989dd73c7b9c09a746e89cb9d7ce7243d1d (patch) | |
tree | 88e0aaf2130047e6e6f85f823bf313a4b4fa1a8e /Lib | |
parent | a21de3d45ec2aebf899712cbd0e44eba9611d2af (diff) | |
download | cpython-18f22989dd73c7b9c09a746e89cb9d7ce7243d1d.zip cpython-18f22989dd73c7b9c09a746e89cb9d7ce7243d1d.tar.gz cpython-18f22989dd73c7b9c09a746e89cb9d7ce7243d1d.tar.bz2 |
Issue #22894: TestCase.subTest() would cause the test suite to be stopped when in failfast mode, even in the absence of failures.
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/unittest/result.py | 3 | ||||
-rw-r--r-- | Lib/unittest/test/test_case.py | 28 |
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 f0b327d..c7ff3b0 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 |