|
@@ -25,6 +25,11 @@ class DebugInvocationTests(SimpleTestCase):
|
|
|
def get_runner(self):
|
|
|
return unittest.TextTestRunner(stream=StringIO())
|
|
|
|
|
|
+ def isolate_debug_test(self, test_suite, result):
|
|
|
+ # Suite teardown needs to be manually called to isolate failures.
|
|
|
+ test_suite._tearDownPreviousClass(None, result)
|
|
|
+ test_suite._handleModuleTearDown(result)
|
|
|
+
|
|
|
def test_run_cleanup(self, _pre_setup, _post_teardown):
|
|
|
"""Simple test run: catches errors and runs cleanup."""
|
|
|
test_suite = unittest.TestSuite()
|
|
@@ -76,6 +81,58 @@ class DebugInvocationTests(SimpleTestCase):
|
|
|
self.assertFalse(_post_teardown.called)
|
|
|
self.assertFalse(_pre_setup.called)
|
|
|
|
|
|
+ def test_debug_cleanup(self, _pre_setup, _post_teardown):
|
|
|
+ """Simple debug run without errors."""
|
|
|
+ test_suite = unittest.TestSuite()
|
|
|
+ test_suite.addTest(ErrorTestCase('simple_test'))
|
|
|
+ test_suite.debug()
|
|
|
+ _pre_setup.assert_called_once_with()
|
|
|
+ _post_teardown.assert_called_once_with()
|
|
|
+
|
|
|
+ def test_debug_bubbles_error(self, _pre_setup, _post_teardown):
|
|
|
+ """debug() bubbles up exceptions before cleanup."""
|
|
|
+ test_suite = unittest.TestSuite()
|
|
|
+ test_suite.addTest(ErrorTestCase('raising_test'))
|
|
|
+ msg = 'debug() bubbles up exceptions before cleanup.'
|
|
|
+ with self.assertRaisesMessage(Exception, msg):
|
|
|
+ # This is the same as test_suite.debug().
|
|
|
+ result = _DebugResult()
|
|
|
+ test_suite.run(result, debug=True)
|
|
|
+ # pre-setup is called but not post-teardown.
|
|
|
+ _pre_setup.assert_called_once_with()
|
|
|
+ self.assertFalse(_post_teardown.called)
|
|
|
+ self.isolate_debug_test(test_suite, result)
|
|
|
+
|
|
|
+ def test_debug_bubbles_pre_setup_error(self, _pre_setup, _post_teardown):
|
|
|
+ """debug() bubbles up exceptions during _pre_setup."""
|
|
|
+ msg = 'Exception in _pre_setup.'
|
|
|
+ _pre_setup.side_effect = Exception(msg)
|
|
|
+ test_suite = unittest.TestSuite()
|
|
|
+ test_suite.addTest(ErrorTestCase('simple_test'))
|
|
|
+ with self.assertRaisesMessage(Exception, msg):
|
|
|
+ # This is the same as test_suite.debug().
|
|
|
+ result = _DebugResult()
|
|
|
+ test_suite.run(result, debug=True)
|
|
|
+ # pre-setup is called but not post-teardown.
|
|
|
+ _pre_setup.assert_called_once_with()
|
|
|
+ self.assertFalse(_post_teardown.called)
|
|
|
+ self.isolate_debug_test(test_suite, result)
|
|
|
+
|
|
|
+ def test_debug_bubbles_post_teardown_error(self, _pre_setup, _post_teardown):
|
|
|
+ """debug() bubbles up exceptions during _post_teardown."""
|
|
|
+ msg = 'Exception in _post_teardown.'
|
|
|
+ _post_teardown.side_effect = Exception(msg)
|
|
|
+ test_suite = unittest.TestSuite()
|
|
|
+ test_suite.addTest(ErrorTestCase('simple_test'))
|
|
|
+ with self.assertRaisesMessage(Exception, msg):
|
|
|
+ # This is the same as test_suite.debug().
|
|
|
+ result = _DebugResult()
|
|
|
+ test_suite.run(result, debug=True)
|
|
|
+ # pre-setup and post-teardwn are called.
|
|
|
+ _pre_setup.assert_called_once_with()
|
|
|
+ _post_teardown.assert_called_once_with()
|
|
|
+ self.isolate_debug_test(test_suite, result)
|
|
|
+
|
|
|
def test_debug_skipped_test_no_cleanup(self, _pre_setup, _post_teardown):
|
|
|
test_suite = unittest.TestSuite()
|
|
|
test_suite.addTest(ErrorTestCase('skipped_test'))
|
|
@@ -85,6 +142,4 @@ class DebugInvocationTests(SimpleTestCase):
|
|
|
test_suite.run(result, debug=True)
|
|
|
self.assertFalse(_post_teardown.called)
|
|
|
self.assertFalse(_pre_setup.called)
|
|
|
- # Suite teardown needs to be manually called to isolate failure.
|
|
|
- test_suite._tearDownPreviousClass(None, result)
|
|
|
- test_suite._handleModuleTearDown(result)
|
|
|
+ self.isolate_debug_test(test_suite, result)
|