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 3940daa..33ab47a 100644
--- a/Lib/unittest/case.py
+++ b/Lib/unittest/case.py
@@ -311,11 +311,15 @@
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 @@
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 @@
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 @@
# 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()