test_runner.py 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. import unittest
  2. from cStringIO import StringIO
  3. import pickle
  4. from unittest.test.support import (LoggingResult,
  5. ResultWithNoStartTestRunStopTestRun)
  6. class TestCleanUp(unittest.TestCase):
  7. def testCleanUp(self):
  8. class TestableTest(unittest.TestCase):
  9. def testNothing(self):
  10. pass
  11. test = TestableTest('testNothing')
  12. self.assertEqual(test._cleanups, [])
  13. cleanups = []
  14. def cleanup1(*args, **kwargs):
  15. cleanups.append((1, args, kwargs))
  16. def cleanup2(*args, **kwargs):
  17. cleanups.append((2, args, kwargs))
  18. test.addCleanup(cleanup1, 1, 2, 3, four='hello', five='goodbye')
  19. test.addCleanup(cleanup2)
  20. self.assertEqual(test._cleanups,
  21. [(cleanup1, (1, 2, 3), dict(four='hello', five='goodbye')),
  22. (cleanup2, (), {})])
  23. result = test.doCleanups()
  24. self.assertTrue(result)
  25. self.assertEqual(cleanups, [(2, (), {}), (1, (1, 2, 3),
  26. dict(four='hello', five='goodbye'))])
  27. def testCleanUpWithErrors(self):
  28. class TestableTest(unittest.TestCase):
  29. def testNothing(self):
  30. pass
  31. class MockResult(object):
  32. errors = []
  33. def addError(self, test, exc_info):
  34. self.errors.append((test, exc_info))
  35. result = MockResult()
  36. test = TestableTest('testNothing')
  37. test._resultForDoCleanups = result
  38. exc1 = Exception('foo')
  39. exc2 = Exception('bar')
  40. def cleanup1():
  41. raise exc1
  42. def cleanup2():
  43. raise exc2
  44. test.addCleanup(cleanup1)
  45. test.addCleanup(cleanup2)
  46. self.assertFalse(test.doCleanups())
  47. (test1, (Type1, instance1, _)), (test2, (Type2, instance2, _)) = reversed(MockResult.errors)
  48. self.assertEqual((test1, Type1, instance1), (test, Exception, exc1))
  49. self.assertEqual((test2, Type2, instance2), (test, Exception, exc2))
  50. def testCleanupInRun(self):
  51. blowUp = False
  52. ordering = []
  53. class TestableTest(unittest.TestCase):
  54. def setUp(self):
  55. ordering.append('setUp')
  56. if blowUp:
  57. raise Exception('foo')
  58. def testNothing(self):
  59. ordering.append('test')
  60. def tearDown(self):
  61. ordering.append('tearDown')
  62. test = TestableTest('testNothing')
  63. def cleanup1():
  64. ordering.append('cleanup1')
  65. def cleanup2():
  66. ordering.append('cleanup2')
  67. test.addCleanup(cleanup1)
  68. test.addCleanup(cleanup2)
  69. def success(some_test):
  70. self.assertEqual(some_test, test)
  71. ordering.append('success')
  72. result = unittest.TestResult()
  73. result.addSuccess = success
  74. test.run(result)
  75. self.assertEqual(ordering, ['setUp', 'test', 'tearDown',
  76. 'cleanup2', 'cleanup1', 'success'])
  77. blowUp = True
  78. ordering = []
  79. test = TestableTest('testNothing')
  80. test.addCleanup(cleanup1)
  81. test.run(result)
  82. self.assertEqual(ordering, ['setUp', 'cleanup1'])
  83. def testTestCaseDebugExecutesCleanups(self):
  84. ordering = []
  85. class TestableTest(unittest.TestCase):
  86. def setUp(self):
  87. ordering.append('setUp')
  88. self.addCleanup(cleanup1)
  89. def testNothing(self):
  90. ordering.append('test')
  91. def tearDown(self):
  92. ordering.append('tearDown')
  93. test = TestableTest('testNothing')
  94. def cleanup1():
  95. ordering.append('cleanup1')
  96. test.addCleanup(cleanup2)
  97. def cleanup2():
  98. ordering.append('cleanup2')
  99. test.debug()
  100. self.assertEqual(ordering, ['setUp', 'test', 'tearDown', 'cleanup1', 'cleanup2'])
  101. class Test_TextTestRunner(unittest.TestCase):
  102. """Tests for TextTestRunner."""
  103. def test_init(self):
  104. runner = unittest.TextTestRunner()
  105. self.assertFalse(runner.failfast)
  106. self.assertFalse(runner.buffer)
  107. self.assertEqual(runner.verbosity, 1)
  108. self.assertTrue(runner.descriptions)
  109. self.assertEqual(runner.resultclass, unittest.TextTestResult)
  110. def test_multiple_inheritance(self):
  111. class AResult(unittest.TestResult):
  112. def __init__(self, stream, descriptions, verbosity):
  113. super(AResult, self).__init__(stream, descriptions, verbosity)
  114. class ATextResult(unittest.TextTestResult, AResult):
  115. pass
  116. # This used to raise an exception due to TextTestResult not passing
  117. # on arguments in its __init__ super call
  118. ATextResult(None, None, 1)
  119. def testBufferAndFailfast(self):
  120. class Test(unittest.TestCase):
  121. def testFoo(self):
  122. pass
  123. result = unittest.TestResult()
  124. runner = unittest.TextTestRunner(stream=StringIO(), failfast=True,
  125. buffer=True)
  126. # Use our result object
  127. runner._makeResult = lambda: result
  128. runner.run(Test('testFoo'))
  129. self.assertTrue(result.failfast)
  130. self.assertTrue(result.buffer)
  131. def testRunnerRegistersResult(self):
  132. class Test(unittest.TestCase):
  133. def testFoo(self):
  134. pass
  135. originalRegisterResult = unittest.runner.registerResult
  136. def cleanup():
  137. unittest.runner.registerResult = originalRegisterResult
  138. self.addCleanup(cleanup)
  139. result = unittest.TestResult()
  140. runner = unittest.TextTestRunner(stream=StringIO())
  141. # Use our result object
  142. runner._makeResult = lambda: result
  143. self.wasRegistered = 0
  144. def fakeRegisterResult(thisResult):
  145. self.wasRegistered += 1
  146. self.assertEqual(thisResult, result)
  147. unittest.runner.registerResult = fakeRegisterResult
  148. runner.run(unittest.TestSuite())
  149. self.assertEqual(self.wasRegistered, 1)
  150. def test_works_with_result_without_startTestRun_stopTestRun(self):
  151. class OldTextResult(ResultWithNoStartTestRunStopTestRun):
  152. separator2 = ''
  153. def printErrors(self):
  154. pass
  155. class Runner(unittest.TextTestRunner):
  156. def __init__(self):
  157. super(Runner, self).__init__(StringIO())
  158. def _makeResult(self):
  159. return OldTextResult()
  160. runner = Runner()
  161. runner.run(unittest.TestSuite())
  162. def test_startTestRun_stopTestRun_called(self):
  163. class LoggingTextResult(LoggingResult):
  164. separator2 = ''
  165. def printErrors(self):
  166. pass
  167. class LoggingRunner(unittest.TextTestRunner):
  168. def __init__(self, events):
  169. super(LoggingRunner, self).__init__(StringIO())
  170. self._events = events
  171. def _makeResult(self):
  172. return LoggingTextResult(self._events)
  173. events = []
  174. runner = LoggingRunner(events)
  175. runner.run(unittest.TestSuite())
  176. expected = ['startTestRun', 'stopTestRun']
  177. self.assertEqual(events, expected)
  178. def test_pickle_unpickle(self):
  179. # Issue #7197: a TextTestRunner should be (un)pickleable. This is
  180. # required by test_multiprocessing under Windows (in verbose mode).
  181. from StringIO import StringIO as PickleableIO
  182. # cStringIO objects are not pickleable, but StringIO objects are.
  183. stream = PickleableIO("foo")
  184. runner = unittest.TextTestRunner(stream)
  185. for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
  186. s = pickle.dumps(runner, protocol=protocol)
  187. obj = pickle.loads(s)
  188. # StringIO objects never compare equal, a cheap test instead.
  189. self.assertEqual(obj.stream.getvalue(), stream.getvalue())
  190. def test_resultclass(self):
  191. def MockResultClass(*args):
  192. return args
  193. STREAM = object()
  194. DESCRIPTIONS = object()
  195. VERBOSITY = object()
  196. runner = unittest.TextTestRunner(STREAM, DESCRIPTIONS, VERBOSITY,
  197. resultclass=MockResultClass)
  198. self.assertEqual(runner.resultclass, MockResultClass)
  199. expectedresult = (runner.stream, DESCRIPTIONS, VERBOSITY)
  200. self.assertEqual(runner._makeResult(), expectedresult)
  201. if __name__ == '__main__':
  202. unittest.main()