From a17f076f614222cec6ff415c940717ecbbddd9fe Mon Sep 17 00:00:00 2001 From: Michael Foord Date: Sun, 19 Dec 2010 14:53:19 +0000 Subject: Issue 10611. SystemExit should not cause a unittest test run to exit. --- Lib/unittest/case.py | 16 +++++++++---- Lib/unittest/test/test_case.py | 52 ++++++++++++++++++++++++++++++++++++++++++ Misc/NEWS | 2 ++ 3 files changed, 66 insertions(+), 4 deletions(-) diff --git a/Lib/unittest/case.py b/Lib/unittest/case.py index 3940daa..33ab47a 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 4e9dfc6..c42d98d 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 19d6c41..b1b0265 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. -- cgit v0.12