From: Michael Foord Date: Sun, 19 Dec 2010 14:53:19 +0000 (+0000) Subject: Issue 10611. SystemExit should not cause a unittest test run to exit. X-Git-Tag: v2.7.2rc1~456 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a17f076f614222cec6ff415c940717ecbbddd9fe;p=python Issue 10611. SystemExit should not cause a unittest test run to exit. --- diff --git a/Lib/unittest/case.py b/Lib/unittest/case.py index 3940daa4c4..33ab47a4b5 100644 --- a/Lib/unittest/case.py +++ b/Lib/unittest/case.py @@ -311,11 +311,15 @@ class TestCase(object): self.setUp() except SkipTest as e: self._addSkip(result, str(e)) - except Exception: + except KeyboardInterrupt: + raise + except: result.addError(self, sys.exc_info()) else: try: testMethod() + except KeyboardInterrupt: + raise except self.failureException: result.addFailure(self, sys.exc_info()) except _ExpectedFailure as e: @@ -336,14 +340,16 @@ class TestCase(object): result.addFailure(self, sys.exc_info()) except SkipTest as e: self._addSkip(result, str(e)) - except Exception: + except: result.addError(self, sys.exc_info()) else: success = True try: self.tearDown() - except Exception: + except KeyboardInterrupt: + raise + except: result.addError(self, sys.exc_info()) success = False @@ -367,7 +373,9 @@ class TestCase(object): function, args, kwargs = self._cleanups.pop(-1) try: function(*args, **kwargs) - except Exception: + except KeyboardInterrupt: + raise + except: ok = False result.addError(self, sys.exc_info()) return ok diff --git a/Lib/unittest/test/test_case.py b/Lib/unittest/test/test_case.py index 4e9dfc6901..c42d98d82d 100644 --- a/Lib/unittest/test/test_case.py +++ b/Lib/unittest/test/test_case.py @@ -999,6 +999,58 @@ test case # This shouldn't blow up deepcopy(test) + def testKeyboardInterrupt(self): + def _raise(self=None): + raise KeyboardInterrupt + def nothing(self): + pass + + class Test1(unittest.TestCase): + test_something = _raise + + class Test2(unittest.TestCase): + setUp = _raise + test_something = nothing + + class Test3(unittest.TestCase): + test_something = nothing + tearDown = _raise + + class Test4(unittest.TestCase): + def test_something(self): + self.addCleanup(_raise) + + for klass in (Test1, Test2, Test3, Test4): + with self.assertRaises(KeyboardInterrupt): + klass('test_something').run() + + def testSystemExit(self): + def _raise(self=None): + raise SystemExit + def nothing(self): + pass + + class Test1(unittest.TestCase): + test_something = _raise + + class Test2(unittest.TestCase): + setUp = _raise + test_something = nothing + + class Test3(unittest.TestCase): + test_something = nothing + tearDown = _raise + + class Test4(unittest.TestCase): + def test_something(self): + self.addCleanup(_raise) + + for klass in (Test1, Test2, Test3, Test4): + result = unittest.TestResult() + klass('test_something').run(result) + self.assertEqual(len(result.errors), 1) + self.assertEqual(result.testsRun, 1) + if __name__ == '__main__': unittest.main() diff --git a/Misc/NEWS b/Misc/NEWS index 19d6c418e8..b1b026545d 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -22,6 +22,8 @@ Core and Builtins Library ------- +- Issue #10611: SystemExit should not cause a unittest test run to exit. + - Issue #6791: Limit header line length (to 65535 bytes) in http.client, to avoid denial of services from the other party.