test_simpletestcase.py 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. import unittest
  2. from io import StringIO
  3. from unittest import mock
  4. from unittest.suite import _DebugResult
  5. from django.test import SimpleTestCase
  6. class ErrorTestCase(SimpleTestCase):
  7. def raising_test(self):
  8. self._pre_setup.assert_called_once_with()
  9. raise Exception('debug() bubbles up exceptions before cleanup.')
  10. def simple_test(self):
  11. self._pre_setup.assert_called_once_with()
  12. @unittest.skip('Skip condition.')
  13. def skipped_test(self):
  14. pass
  15. @mock.patch.object(ErrorTestCase, '_post_teardown')
  16. @mock.patch.object(ErrorTestCase, '_pre_setup')
  17. class DebugInvocationTests(SimpleTestCase):
  18. def get_runner(self):
  19. return unittest.TextTestRunner(stream=StringIO())
  20. def isolate_debug_test(self, test_suite, result):
  21. # Suite teardown needs to be manually called to isolate failures.
  22. test_suite._tearDownPreviousClass(None, result)
  23. test_suite._handleModuleTearDown(result)
  24. def test_run_cleanup(self, _pre_setup, _post_teardown):
  25. """Simple test run: catches errors and runs cleanup."""
  26. test_suite = unittest.TestSuite()
  27. test_suite.addTest(ErrorTestCase('raising_test'))
  28. result = self.get_runner()._makeResult()
  29. self.assertEqual(result.errors, [])
  30. test_suite.run(result)
  31. self.assertEqual(len(result.errors), 1)
  32. _, traceback = result.errors[0]
  33. self.assertIn('Exception: debug() bubbles up exceptions before cleanup.', traceback)
  34. _pre_setup.assert_called_once_with()
  35. _post_teardown.assert_called_once_with()
  36. def test_run_pre_setup_error(self, _pre_setup, _post_teardown):
  37. _pre_setup.side_effect = Exception('Exception in _pre_setup.')
  38. test_suite = unittest.TestSuite()
  39. test_suite.addTest(ErrorTestCase('simple_test'))
  40. result = self.get_runner()._makeResult()
  41. self.assertEqual(result.errors, [])
  42. test_suite.run(result)
  43. self.assertEqual(len(result.errors), 1)
  44. _, traceback = result.errors[0]
  45. self.assertIn('Exception: Exception in _pre_setup.', traceback)
  46. # pre-setup is called but not post-teardown.
  47. _pre_setup.assert_called_once_with()
  48. self.assertFalse(_post_teardown.called)
  49. def test_run_post_teardown_error(self, _pre_setup, _post_teardown):
  50. _post_teardown.side_effect = Exception('Exception in _post_teardown.')
  51. test_suite = unittest.TestSuite()
  52. test_suite.addTest(ErrorTestCase('simple_test'))
  53. result = self.get_runner()._makeResult()
  54. self.assertEqual(result.errors, [])
  55. test_suite.run(result)
  56. self.assertEqual(len(result.errors), 1)
  57. _, traceback = result.errors[0]
  58. self.assertIn('Exception: Exception in _post_teardown.', traceback)
  59. # pre-setup and post-teardwn are called.
  60. _pre_setup.assert_called_once_with()
  61. _post_teardown.assert_called_once_with()
  62. def test_run_skipped_test_no_cleanup(self, _pre_setup, _post_teardown):
  63. test_suite = unittest.TestSuite()
  64. test_suite.addTest(ErrorTestCase('skipped_test'))
  65. try:
  66. test_suite.run(self.get_runner()._makeResult())
  67. except unittest.SkipTest:
  68. self.fail('SkipTest should not be raised at this stage.')
  69. self.assertFalse(_post_teardown.called)
  70. self.assertFalse(_pre_setup.called)
  71. def test_debug_cleanup(self, _pre_setup, _post_teardown):
  72. """Simple debug run without errors."""
  73. test_suite = unittest.TestSuite()
  74. test_suite.addTest(ErrorTestCase('simple_test'))
  75. test_suite.debug()
  76. _pre_setup.assert_called_once_with()
  77. _post_teardown.assert_called_once_with()
  78. def test_debug_bubbles_error(self, _pre_setup, _post_teardown):
  79. """debug() bubbles up exceptions before cleanup."""
  80. test_suite = unittest.TestSuite()
  81. test_suite.addTest(ErrorTestCase('raising_test'))
  82. msg = 'debug() bubbles up exceptions before cleanup.'
  83. with self.assertRaisesMessage(Exception, msg):
  84. # This is the same as test_suite.debug().
  85. result = _DebugResult()
  86. test_suite.run(result, debug=True)
  87. # pre-setup is called but not post-teardown.
  88. _pre_setup.assert_called_once_with()
  89. self.assertFalse(_post_teardown.called)
  90. self.isolate_debug_test(test_suite, result)
  91. def test_debug_bubbles_pre_setup_error(self, _pre_setup, _post_teardown):
  92. """debug() bubbles up exceptions during _pre_setup."""
  93. msg = 'Exception in _pre_setup.'
  94. _pre_setup.side_effect = Exception(msg)
  95. test_suite = unittest.TestSuite()
  96. test_suite.addTest(ErrorTestCase('simple_test'))
  97. with self.assertRaisesMessage(Exception, msg):
  98. # This is the same as test_suite.debug().
  99. result = _DebugResult()
  100. test_suite.run(result, debug=True)
  101. # pre-setup is called but not post-teardown.
  102. _pre_setup.assert_called_once_with()
  103. self.assertFalse(_post_teardown.called)
  104. self.isolate_debug_test(test_suite, result)
  105. def test_debug_bubbles_post_teardown_error(self, _pre_setup, _post_teardown):
  106. """debug() bubbles up exceptions during _post_teardown."""
  107. msg = 'Exception in _post_teardown.'
  108. _post_teardown.side_effect = Exception(msg)
  109. test_suite = unittest.TestSuite()
  110. test_suite.addTest(ErrorTestCase('simple_test'))
  111. with self.assertRaisesMessage(Exception, msg):
  112. # This is the same as test_suite.debug().
  113. result = _DebugResult()
  114. test_suite.run(result, debug=True)
  115. # pre-setup and post-teardwn are called.
  116. _pre_setup.assert_called_once_with()
  117. _post_teardown.assert_called_once_with()
  118. self.isolate_debug_test(test_suite, result)
  119. def test_debug_skipped_test_no_cleanup(self, _pre_setup, _post_teardown):
  120. test_suite = unittest.TestSuite()
  121. test_suite.addTest(ErrorTestCase('skipped_test'))
  122. with self.assertRaisesMessage(unittest.SkipTest, 'Skip condition.'):
  123. # This is the same as test_suite.debug().
  124. result = _DebugResult()
  125. test_suite.run(result, debug=True)
  126. self.assertFalse(_post_teardown.called)
  127. self.assertFalse(_pre_setup.called)
  128. self.isolate_debug_test(test_suite, result)