test_result.py 53 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387
  1. import io
  2. import sys
  3. import textwrap
  4. from test.support import warnings_helper, captured_stdout, captured_stderr
  5. import traceback
  6. import unittest
  7. from unittest.util import strclass
  8. class MockTraceback(object):
  9. class TracebackException:
  10. def __init__(self, *args, **kwargs):
  11. self.capture_locals = kwargs.get('capture_locals', False)
  12. def format(self):
  13. result = ['A traceback']
  14. if self.capture_locals:
  15. result.append('locals')
  16. return result
  17. def restore_traceback():
  18. unittest.result.traceback = traceback
  19. def bad_cleanup1():
  20. print('do cleanup1')
  21. raise TypeError('bad cleanup1')
  22. def bad_cleanup2():
  23. print('do cleanup2')
  24. raise ValueError('bad cleanup2')
  25. class BufferedWriter:
  26. def __init__(self):
  27. self.result = ''
  28. self.buffer = ''
  29. def write(self, arg):
  30. self.buffer += arg
  31. def flush(self):
  32. self.result += self.buffer
  33. self.buffer = ''
  34. def getvalue(self):
  35. return self.result
  36. class Test_TestResult(unittest.TestCase):
  37. # Note: there are not separate tests for TestResult.wasSuccessful(),
  38. # TestResult.errors, TestResult.failures, TestResult.testsRun or
  39. # TestResult.shouldStop because these only have meaning in terms of
  40. # other TestResult methods.
  41. #
  42. # Accordingly, tests for the aforenamed attributes are incorporated
  43. # in with the tests for the defining methods.
  44. ################################################################
  45. def test_init(self):
  46. result = unittest.TestResult()
  47. self.assertTrue(result.wasSuccessful())
  48. self.assertEqual(len(result.errors), 0)
  49. self.assertEqual(len(result.failures), 0)
  50. self.assertEqual(result.testsRun, 0)
  51. self.assertEqual(result.shouldStop, False)
  52. self.assertIsNone(result._stdout_buffer)
  53. self.assertIsNone(result._stderr_buffer)
  54. # "This method can be called to signal that the set of tests being
  55. # run should be aborted by setting the TestResult's shouldStop
  56. # attribute to True."
  57. def test_stop(self):
  58. result = unittest.TestResult()
  59. result.stop()
  60. self.assertEqual(result.shouldStop, True)
  61. # "Called when the test case test is about to be run. The default
  62. # implementation simply increments the instance's testsRun counter."
  63. def test_startTest(self):
  64. class Foo(unittest.TestCase):
  65. def test_1(self):
  66. pass
  67. test = Foo('test_1')
  68. result = unittest.TestResult()
  69. result.startTest(test)
  70. self.assertTrue(result.wasSuccessful())
  71. self.assertEqual(len(result.errors), 0)
  72. self.assertEqual(len(result.failures), 0)
  73. self.assertEqual(result.testsRun, 1)
  74. self.assertEqual(result.shouldStop, False)
  75. result.stopTest(test)
  76. # "Called after the test case test has been executed, regardless of
  77. # the outcome. The default implementation does nothing."
  78. def test_stopTest(self):
  79. class Foo(unittest.TestCase):
  80. def test_1(self):
  81. pass
  82. test = Foo('test_1')
  83. result = unittest.TestResult()
  84. result.startTest(test)
  85. self.assertTrue(result.wasSuccessful())
  86. self.assertEqual(len(result.errors), 0)
  87. self.assertEqual(len(result.failures), 0)
  88. self.assertEqual(result.testsRun, 1)
  89. self.assertEqual(result.shouldStop, False)
  90. result.stopTest(test)
  91. # Same tests as above; make sure nothing has changed
  92. self.assertTrue(result.wasSuccessful())
  93. self.assertEqual(len(result.errors), 0)
  94. self.assertEqual(len(result.failures), 0)
  95. self.assertEqual(result.testsRun, 1)
  96. self.assertEqual(result.shouldStop, False)
  97. # "Called before and after tests are run. The default implementation does nothing."
  98. def test_startTestRun_stopTestRun(self):
  99. result = unittest.TestResult()
  100. result.startTestRun()
  101. result.stopTestRun()
  102. # "addSuccess(test)"
  103. # ...
  104. # "Called when the test case test succeeds"
  105. # ...
  106. # "wasSuccessful() - Returns True if all tests run so far have passed,
  107. # otherwise returns False"
  108. # ...
  109. # "testsRun - The total number of tests run so far."
  110. # ...
  111. # "errors - A list containing 2-tuples of TestCase instances and
  112. # formatted tracebacks. Each tuple represents a test which raised an
  113. # unexpected exception. Contains formatted
  114. # tracebacks instead of sys.exc_info() results."
  115. # ...
  116. # "failures - A list containing 2-tuples of TestCase instances and
  117. # formatted tracebacks. Each tuple represents a test where a failure was
  118. # explicitly signalled using the TestCase.fail*() or TestCase.assert*()
  119. # methods. Contains formatted tracebacks instead
  120. # of sys.exc_info() results."
  121. def test_addSuccess(self):
  122. class Foo(unittest.TestCase):
  123. def test_1(self):
  124. pass
  125. test = Foo('test_1')
  126. result = unittest.TestResult()
  127. result.startTest(test)
  128. result.addSuccess(test)
  129. result.stopTest(test)
  130. self.assertTrue(result.wasSuccessful())
  131. self.assertEqual(len(result.errors), 0)
  132. self.assertEqual(len(result.failures), 0)
  133. self.assertEqual(result.testsRun, 1)
  134. self.assertEqual(result.shouldStop, False)
  135. # "addFailure(test, err)"
  136. # ...
  137. # "Called when the test case test signals a failure. err is a tuple of
  138. # the form returned by sys.exc_info(): (type, value, traceback)"
  139. # ...
  140. # "wasSuccessful() - Returns True if all tests run so far have passed,
  141. # otherwise returns False"
  142. # ...
  143. # "testsRun - The total number of tests run so far."
  144. # ...
  145. # "errors - A list containing 2-tuples of TestCase instances and
  146. # formatted tracebacks. Each tuple represents a test which raised an
  147. # unexpected exception. Contains formatted
  148. # tracebacks instead of sys.exc_info() results."
  149. # ...
  150. # "failures - A list containing 2-tuples of TestCase instances and
  151. # formatted tracebacks. Each tuple represents a test where a failure was
  152. # explicitly signalled using the TestCase.fail*() or TestCase.assert*()
  153. # methods. Contains formatted tracebacks instead
  154. # of sys.exc_info() results."
  155. def test_addFailure(self):
  156. class Foo(unittest.TestCase):
  157. def test_1(self):
  158. pass
  159. test = Foo('test_1')
  160. try:
  161. test.fail("foo")
  162. except:
  163. exc_info_tuple = sys.exc_info()
  164. result = unittest.TestResult()
  165. result.startTest(test)
  166. result.addFailure(test, exc_info_tuple)
  167. result.stopTest(test)
  168. self.assertFalse(result.wasSuccessful())
  169. self.assertEqual(len(result.errors), 0)
  170. self.assertEqual(len(result.failures), 1)
  171. self.assertEqual(result.testsRun, 1)
  172. self.assertEqual(result.shouldStop, False)
  173. test_case, formatted_exc = result.failures[0]
  174. self.assertIs(test_case, test)
  175. self.assertIsInstance(formatted_exc, str)
  176. def test_addFailure_filter_traceback_frames(self):
  177. class Foo(unittest.TestCase):
  178. def test_1(self):
  179. pass
  180. test = Foo('test_1')
  181. def get_exc_info():
  182. try:
  183. test.fail("foo")
  184. except:
  185. return sys.exc_info()
  186. exc_info_tuple = get_exc_info()
  187. full_exc = traceback.format_exception(*exc_info_tuple)
  188. result = unittest.TestResult()
  189. result.startTest(test)
  190. result.addFailure(test, exc_info_tuple)
  191. result.stopTest(test)
  192. formatted_exc = result.failures[0][1]
  193. dropped = [l for l in full_exc if l not in formatted_exc]
  194. self.assertEqual(len(dropped), 1)
  195. self.assertIn("raise self.failureException(msg)", dropped[0])
  196. def test_addFailure_filter_traceback_frames_context(self):
  197. class Foo(unittest.TestCase):
  198. def test_1(self):
  199. pass
  200. test = Foo('test_1')
  201. def get_exc_info():
  202. try:
  203. try:
  204. test.fail("foo")
  205. except:
  206. raise ValueError(42)
  207. except:
  208. return sys.exc_info()
  209. exc_info_tuple = get_exc_info()
  210. full_exc = traceback.format_exception(*exc_info_tuple)
  211. result = unittest.TestResult()
  212. result.startTest(test)
  213. result.addFailure(test, exc_info_tuple)
  214. result.stopTest(test)
  215. formatted_exc = result.failures[0][1]
  216. dropped = [l for l in full_exc if l not in formatted_exc]
  217. self.assertEqual(len(dropped), 1)
  218. self.assertIn("raise self.failureException(msg)", dropped[0])
  219. def test_addFailure_filter_traceback_frames_chained_exception_self_loop(self):
  220. class Foo(unittest.TestCase):
  221. def test_1(self):
  222. pass
  223. def get_exc_info():
  224. try:
  225. loop = Exception("Loop")
  226. loop.__cause__ = loop
  227. loop.__context__ = loop
  228. raise loop
  229. except:
  230. return sys.exc_info()
  231. exc_info_tuple = get_exc_info()
  232. test = Foo('test_1')
  233. result = unittest.TestResult()
  234. result.startTest(test)
  235. result.addFailure(test, exc_info_tuple)
  236. result.stopTest(test)
  237. formatted_exc = result.failures[0][1]
  238. self.assertEqual(formatted_exc.count("Exception: Loop\n"), 1)
  239. def test_addFailure_filter_traceback_frames_chained_exception_cycle(self):
  240. class Foo(unittest.TestCase):
  241. def test_1(self):
  242. pass
  243. def get_exc_info():
  244. try:
  245. # Create two directionally opposed cycles
  246. # __cause__ in one direction, __context__ in the other
  247. A, B, C = Exception("A"), Exception("B"), Exception("C")
  248. edges = [(C, B), (B, A), (A, C)]
  249. for ex1, ex2 in edges:
  250. ex1.__cause__ = ex2
  251. ex2.__context__ = ex1
  252. raise C
  253. except:
  254. return sys.exc_info()
  255. exc_info_tuple = get_exc_info()
  256. test = Foo('test_1')
  257. result = unittest.TestResult()
  258. result.startTest(test)
  259. result.addFailure(test, exc_info_tuple)
  260. result.stopTest(test)
  261. formatted_exc = result.failures[0][1]
  262. self.assertEqual(formatted_exc.count("Exception: A\n"), 1)
  263. self.assertEqual(formatted_exc.count("Exception: B\n"), 1)
  264. self.assertEqual(formatted_exc.count("Exception: C\n"), 1)
  265. # "addError(test, err)"
  266. # ...
  267. # "Called when the test case test raises an unexpected exception err
  268. # is a tuple of the form returned by sys.exc_info():
  269. # (type, value, traceback)"
  270. # ...
  271. # "wasSuccessful() - Returns True if all tests run so far have passed,
  272. # otherwise returns False"
  273. # ...
  274. # "testsRun - The total number of tests run so far."
  275. # ...
  276. # "errors - A list containing 2-tuples of TestCase instances and
  277. # formatted tracebacks. Each tuple represents a test which raised an
  278. # unexpected exception. Contains formatted
  279. # tracebacks instead of sys.exc_info() results."
  280. # ...
  281. # "failures - A list containing 2-tuples of TestCase instances and
  282. # formatted tracebacks. Each tuple represents a test where a failure was
  283. # explicitly signalled using the TestCase.fail*() or TestCase.assert*()
  284. # methods. Contains formatted tracebacks instead
  285. # of sys.exc_info() results."
  286. def test_addError(self):
  287. class Foo(unittest.TestCase):
  288. def test_1(self):
  289. pass
  290. test = Foo('test_1')
  291. try:
  292. raise TypeError()
  293. except:
  294. exc_info_tuple = sys.exc_info()
  295. result = unittest.TestResult()
  296. result.startTest(test)
  297. result.addError(test, exc_info_tuple)
  298. result.stopTest(test)
  299. self.assertFalse(result.wasSuccessful())
  300. self.assertEqual(len(result.errors), 1)
  301. self.assertEqual(len(result.failures), 0)
  302. self.assertEqual(result.testsRun, 1)
  303. self.assertEqual(result.shouldStop, False)
  304. test_case, formatted_exc = result.errors[0]
  305. self.assertIs(test_case, test)
  306. self.assertIsInstance(formatted_exc, str)
  307. def test_addError_locals(self):
  308. class Foo(unittest.TestCase):
  309. def test_1(self):
  310. 1/0
  311. test = Foo('test_1')
  312. result = unittest.TestResult()
  313. result.tb_locals = True
  314. unittest.result.traceback = MockTraceback
  315. self.addCleanup(restore_traceback)
  316. result.startTestRun()
  317. test.run(result)
  318. result.stopTestRun()
  319. self.assertEqual(len(result.errors), 1)
  320. test_case, formatted_exc = result.errors[0]
  321. self.assertEqual('A tracebacklocals', formatted_exc)
  322. def test_addSubTest(self):
  323. class Foo(unittest.TestCase):
  324. def test_1(self):
  325. nonlocal subtest
  326. with self.subTest(foo=1):
  327. subtest = self._subtest
  328. try:
  329. 1/0
  330. except ZeroDivisionError:
  331. exc_info_tuple = sys.exc_info()
  332. # Register an error by hand (to check the API)
  333. result.addSubTest(test, subtest, exc_info_tuple)
  334. # Now trigger a failure
  335. self.fail("some recognizable failure")
  336. subtest = None
  337. test = Foo('test_1')
  338. result = unittest.TestResult()
  339. test.run(result)
  340. self.assertFalse(result.wasSuccessful())
  341. self.assertEqual(len(result.errors), 1)
  342. self.assertEqual(len(result.failures), 1)
  343. self.assertEqual(result.testsRun, 1)
  344. self.assertEqual(result.shouldStop, False)
  345. test_case, formatted_exc = result.errors[0]
  346. self.assertIs(test_case, subtest)
  347. self.assertIn("ZeroDivisionError", formatted_exc)
  348. test_case, formatted_exc = result.failures[0]
  349. self.assertIs(test_case, subtest)
  350. self.assertIn("some recognizable failure", formatted_exc)
  351. def testStackFrameTrimming(self):
  352. class Frame(object):
  353. class tb_frame(object):
  354. f_globals = {}
  355. result = unittest.TestResult()
  356. self.assertFalse(result._is_relevant_tb_level(Frame))
  357. Frame.tb_frame.f_globals['__unittest'] = True
  358. self.assertTrue(result._is_relevant_tb_level(Frame))
  359. def testFailFast(self):
  360. result = unittest.TestResult()
  361. result._exc_info_to_string = lambda *_: ''
  362. result.failfast = True
  363. result.addError(None, None)
  364. self.assertTrue(result.shouldStop)
  365. result = unittest.TestResult()
  366. result._exc_info_to_string = lambda *_: ''
  367. result.failfast = True
  368. result.addFailure(None, None)
  369. self.assertTrue(result.shouldStop)
  370. result = unittest.TestResult()
  371. result._exc_info_to_string = lambda *_: ''
  372. result.failfast = True
  373. result.addUnexpectedSuccess(None)
  374. self.assertTrue(result.shouldStop)
  375. def testFailFastSetByRunner(self):
  376. stream = BufferedWriter()
  377. runner = unittest.TextTestRunner(stream=stream, failfast=True)
  378. def test(result):
  379. self.assertTrue(result.failfast)
  380. result = runner.run(test)
  381. stream.flush()
  382. self.assertTrue(stream.getvalue().endswith('\n\nOK\n'))
  383. class Test_TextTestResult(unittest.TestCase):
  384. maxDiff = None
  385. def testGetDescriptionWithoutDocstring(self):
  386. result = unittest.TextTestResult(None, True, 1)
  387. self.assertEqual(
  388. result.getDescription(self),
  389. 'testGetDescriptionWithoutDocstring (' + __name__ +
  390. '.Test_TextTestResult.testGetDescriptionWithoutDocstring)')
  391. def testGetSubTestDescriptionWithoutDocstring(self):
  392. with self.subTest(foo=1, bar=2):
  393. result = unittest.TextTestResult(None, True, 1)
  394. self.assertEqual(
  395. result.getDescription(self._subtest),
  396. 'testGetSubTestDescriptionWithoutDocstring (' + __name__ +
  397. '.Test_TextTestResult.testGetSubTestDescriptionWithoutDocstring) (foo=1, bar=2)')
  398. with self.subTest('some message'):
  399. result = unittest.TextTestResult(None, True, 1)
  400. self.assertEqual(
  401. result.getDescription(self._subtest),
  402. 'testGetSubTestDescriptionWithoutDocstring (' + __name__ +
  403. '.Test_TextTestResult.testGetSubTestDescriptionWithoutDocstring) [some message]')
  404. def testGetSubTestDescriptionWithoutDocstringAndParams(self):
  405. with self.subTest():
  406. result = unittest.TextTestResult(None, True, 1)
  407. self.assertEqual(
  408. result.getDescription(self._subtest),
  409. 'testGetSubTestDescriptionWithoutDocstringAndParams '
  410. '(' + __name__ + '.Test_TextTestResult.testGetSubTestDescriptionWithoutDocstringAndParams) '
  411. '(<subtest>)')
  412. def testGetSubTestDescriptionForFalsyValues(self):
  413. expected = 'testGetSubTestDescriptionForFalsyValues (%s.Test_TextTestResult.testGetSubTestDescriptionForFalsyValues) [%s]'
  414. result = unittest.TextTestResult(None, True, 1)
  415. for arg in [0, None, []]:
  416. with self.subTest(arg):
  417. self.assertEqual(
  418. result.getDescription(self._subtest),
  419. expected % (__name__, arg)
  420. )
  421. def testGetNestedSubTestDescriptionWithoutDocstring(self):
  422. with self.subTest(foo=1):
  423. with self.subTest(baz=2, bar=3):
  424. result = unittest.TextTestResult(None, True, 1)
  425. self.assertEqual(
  426. result.getDescription(self._subtest),
  427. 'testGetNestedSubTestDescriptionWithoutDocstring '
  428. '(' + __name__ + '.Test_TextTestResult.testGetNestedSubTestDescriptionWithoutDocstring) '
  429. '(baz=2, bar=3, foo=1)')
  430. def testGetDuplicatedNestedSubTestDescriptionWithoutDocstring(self):
  431. with self.subTest(foo=1, bar=2):
  432. with self.subTest(baz=3, bar=4):
  433. result = unittest.TextTestResult(None, True, 1)
  434. self.assertEqual(
  435. result.getDescription(self._subtest),
  436. 'testGetDuplicatedNestedSubTestDescriptionWithoutDocstring '
  437. '(' + __name__ + '.Test_TextTestResult.testGetDuplicatedNestedSubTestDescriptionWithoutDocstring) (baz=3, bar=4, foo=1)')
  438. @unittest.skipIf(sys.flags.optimize >= 2,
  439. "Docstrings are omitted with -O2 and above")
  440. def testGetDescriptionWithOneLineDocstring(self):
  441. """Tests getDescription() for a method with a docstring."""
  442. result = unittest.TextTestResult(None, True, 1)
  443. self.assertEqual(
  444. result.getDescription(self),
  445. ('testGetDescriptionWithOneLineDocstring '
  446. '(' + __name__ + '.Test_TextTestResult.testGetDescriptionWithOneLineDocstring)\n'
  447. 'Tests getDescription() for a method with a docstring.'))
  448. @unittest.skipIf(sys.flags.optimize >= 2,
  449. "Docstrings are omitted with -O2 and above")
  450. def testGetSubTestDescriptionWithOneLineDocstring(self):
  451. """Tests getDescription() for a method with a docstring."""
  452. result = unittest.TextTestResult(None, True, 1)
  453. with self.subTest(foo=1, bar=2):
  454. self.assertEqual(
  455. result.getDescription(self._subtest),
  456. ('testGetSubTestDescriptionWithOneLineDocstring '
  457. '(' + __name__ + '.Test_TextTestResult.testGetSubTestDescriptionWithOneLineDocstring) '
  458. '(foo=1, bar=2)\n'
  459. 'Tests getDescription() for a method with a docstring.'))
  460. @unittest.skipIf(sys.flags.optimize >= 2,
  461. "Docstrings are omitted with -O2 and above")
  462. def testGetDescriptionWithMultiLineDocstring(self):
  463. """Tests getDescription() for a method with a longer docstring.
  464. The second line of the docstring.
  465. """
  466. result = unittest.TextTestResult(None, True, 1)
  467. self.assertEqual(
  468. result.getDescription(self),
  469. ('testGetDescriptionWithMultiLineDocstring '
  470. '(' + __name__ + '.Test_TextTestResult.testGetDescriptionWithMultiLineDocstring)\n'
  471. 'Tests getDescription() for a method with a longer '
  472. 'docstring.'))
  473. @unittest.skipIf(sys.flags.optimize >= 2,
  474. "Docstrings are omitted with -O2 and above")
  475. def testGetSubTestDescriptionWithMultiLineDocstring(self):
  476. """Tests getDescription() for a method with a longer docstring.
  477. The second line of the docstring.
  478. """
  479. result = unittest.TextTestResult(None, True, 1)
  480. with self.subTest(foo=1, bar=2):
  481. self.assertEqual(
  482. result.getDescription(self._subtest),
  483. ('testGetSubTestDescriptionWithMultiLineDocstring '
  484. '(' + __name__ + '.Test_TextTestResult.testGetSubTestDescriptionWithMultiLineDocstring) '
  485. '(foo=1, bar=2)\n'
  486. 'Tests getDescription() for a method with a longer '
  487. 'docstring.'))
  488. class Test(unittest.TestCase):
  489. def testSuccess(self):
  490. pass
  491. def testSkip(self):
  492. self.skipTest('skip')
  493. def testFail(self):
  494. self.fail('fail')
  495. def testError(self):
  496. raise Exception('error')
  497. @unittest.expectedFailure
  498. def testExpectedFailure(self):
  499. self.fail('fail')
  500. @unittest.expectedFailure
  501. def testUnexpectedSuccess(self):
  502. pass
  503. def testSubTestSuccess(self):
  504. with self.subTest('one', a=1):
  505. pass
  506. with self.subTest('two', b=2):
  507. pass
  508. def testSubTestMixed(self):
  509. with self.subTest('success', a=1):
  510. pass
  511. with self.subTest('skip', b=2):
  512. self.skipTest('skip')
  513. with self.subTest('fail', c=3):
  514. self.fail('fail')
  515. with self.subTest('error', d=4):
  516. raise Exception('error')
  517. tearDownError = None
  518. def tearDown(self):
  519. if self.tearDownError is not None:
  520. raise self.tearDownError
  521. def _run_test(self, test_name, verbosity, tearDownError=None):
  522. stream = BufferedWriter()
  523. stream = unittest.runner._WritelnDecorator(stream)
  524. result = unittest.TextTestResult(stream, True, verbosity)
  525. test = self.Test(test_name)
  526. test.tearDownError = tearDownError
  527. test.run(result)
  528. return stream.getvalue()
  529. def testDotsOutput(self):
  530. self.assertEqual(self._run_test('testSuccess', 1), '.')
  531. self.assertEqual(self._run_test('testSkip', 1), 's')
  532. self.assertEqual(self._run_test('testFail', 1), 'F')
  533. self.assertEqual(self._run_test('testError', 1), 'E')
  534. self.assertEqual(self._run_test('testExpectedFailure', 1), 'x')
  535. self.assertEqual(self._run_test('testUnexpectedSuccess', 1), 'u')
  536. def testLongOutput(self):
  537. classname = f'{__name__}.{self.Test.__qualname__}'
  538. self.assertEqual(self._run_test('testSuccess', 2),
  539. f'testSuccess ({classname}.testSuccess) ... ok\n')
  540. self.assertEqual(self._run_test('testSkip', 2),
  541. f"testSkip ({classname}.testSkip) ... skipped 'skip'\n")
  542. self.assertEqual(self._run_test('testFail', 2),
  543. f'testFail ({classname}.testFail) ... FAIL\n')
  544. self.assertEqual(self._run_test('testError', 2),
  545. f'testError ({classname}.testError) ... ERROR\n')
  546. self.assertEqual(self._run_test('testExpectedFailure', 2),
  547. f'testExpectedFailure ({classname}.testExpectedFailure) ... expected failure\n')
  548. self.assertEqual(self._run_test('testUnexpectedSuccess', 2),
  549. f'testUnexpectedSuccess ({classname}.testUnexpectedSuccess) ... unexpected success\n')
  550. def testDotsOutputSubTestSuccess(self):
  551. self.assertEqual(self._run_test('testSubTestSuccess', 1), '.')
  552. def testLongOutputSubTestSuccess(self):
  553. classname = f'{__name__}.{self.Test.__qualname__}'
  554. self.assertEqual(self._run_test('testSubTestSuccess', 2),
  555. f'testSubTestSuccess ({classname}.testSubTestSuccess) ... ok\n')
  556. def testDotsOutputSubTestMixed(self):
  557. self.assertEqual(self._run_test('testSubTestMixed', 1), 'sFE')
  558. def testLongOutputSubTestMixed(self):
  559. classname = f'{__name__}.{self.Test.__qualname__}'
  560. self.assertEqual(self._run_test('testSubTestMixed', 2),
  561. f'testSubTestMixed ({classname}.testSubTestMixed) ... \n'
  562. f" testSubTestMixed ({classname}.testSubTestMixed) [skip] (b=2) ... skipped 'skip'\n"
  563. f' testSubTestMixed ({classname}.testSubTestMixed) [fail] (c=3) ... FAIL\n'
  564. f' testSubTestMixed ({classname}.testSubTestMixed) [error] (d=4) ... ERROR\n')
  565. def testDotsOutputTearDownFail(self):
  566. out = self._run_test('testSuccess', 1, AssertionError('fail'))
  567. self.assertEqual(out, 'F')
  568. out = self._run_test('testError', 1, AssertionError('fail'))
  569. self.assertEqual(out, 'EF')
  570. out = self._run_test('testFail', 1, Exception('error'))
  571. self.assertEqual(out, 'FE')
  572. out = self._run_test('testSkip', 1, AssertionError('fail'))
  573. self.assertEqual(out, 'sF')
  574. def testLongOutputTearDownFail(self):
  575. classname = f'{__name__}.{self.Test.__qualname__}'
  576. out = self._run_test('testSuccess', 2, AssertionError('fail'))
  577. self.assertEqual(out,
  578. f'testSuccess ({classname}.testSuccess) ... FAIL\n')
  579. out = self._run_test('testError', 2, AssertionError('fail'))
  580. self.assertEqual(out,
  581. f'testError ({classname}.testError) ... ERROR\n'
  582. f'testError ({classname}.testError) ... FAIL\n')
  583. out = self._run_test('testFail', 2, Exception('error'))
  584. self.assertEqual(out,
  585. f'testFail ({classname}.testFail) ... FAIL\n'
  586. f'testFail ({classname}.testFail) ... ERROR\n')
  587. out = self._run_test('testSkip', 2, AssertionError('fail'))
  588. self.assertEqual(out,
  589. f"testSkip ({classname}.testSkip) ... skipped 'skip'\n"
  590. f'testSkip ({classname}.testSkip) ... FAIL\n')
  591. classDict = dict(unittest.TestResult.__dict__)
  592. for m in ('addSkip', 'addExpectedFailure', 'addUnexpectedSuccess',
  593. '__init__'):
  594. del classDict[m]
  595. def __init__(self, stream=None, descriptions=None, verbosity=None):
  596. self.failures = []
  597. self.errors = []
  598. self.testsRun = 0
  599. self.shouldStop = False
  600. self.buffer = False
  601. self.tb_locals = False
  602. classDict['__init__'] = __init__
  603. OldResult = type('OldResult', (object,), classDict)
  604. class Test_OldTestResult(unittest.TestCase):
  605. def assertOldResultWarning(self, test, failures):
  606. with warnings_helper.check_warnings(
  607. ("TestResult has no add.+ method,", RuntimeWarning)):
  608. result = OldResult()
  609. test.run(result)
  610. self.assertEqual(len(result.failures), failures)
  611. def testOldTestResult(self):
  612. class Test(unittest.TestCase):
  613. def testSkip(self):
  614. self.skipTest('foobar')
  615. @unittest.expectedFailure
  616. def testExpectedFail(self):
  617. raise TypeError
  618. @unittest.expectedFailure
  619. def testUnexpectedSuccess(self):
  620. pass
  621. for test_name, should_pass in (('testSkip', True),
  622. ('testExpectedFail', True),
  623. ('testUnexpectedSuccess', False)):
  624. test = Test(test_name)
  625. self.assertOldResultWarning(test, int(not should_pass))
  626. def testOldTestTesultSetup(self):
  627. class Test(unittest.TestCase):
  628. def setUp(self):
  629. self.skipTest('no reason')
  630. def testFoo(self):
  631. pass
  632. self.assertOldResultWarning(Test('testFoo'), 0)
  633. def testOldTestResultClass(self):
  634. @unittest.skip('no reason')
  635. class Test(unittest.TestCase):
  636. def testFoo(self):
  637. pass
  638. self.assertOldResultWarning(Test('testFoo'), 0)
  639. def testOldResultWithRunner(self):
  640. class Test(unittest.TestCase):
  641. def testFoo(self):
  642. pass
  643. runner = unittest.TextTestRunner(resultclass=OldResult,
  644. stream=io.StringIO())
  645. # This will raise an exception if TextTestRunner can't handle old
  646. # test result objects
  647. runner.run(Test('testFoo'))
  648. class TestOutputBuffering(unittest.TestCase):
  649. def setUp(self):
  650. self._real_out = sys.stdout
  651. self._real_err = sys.stderr
  652. def tearDown(self):
  653. sys.stdout = self._real_out
  654. sys.stderr = self._real_err
  655. def testBufferOutputOff(self):
  656. real_out = self._real_out
  657. real_err = self._real_err
  658. result = unittest.TestResult()
  659. self.assertFalse(result.buffer)
  660. self.assertIs(real_out, sys.stdout)
  661. self.assertIs(real_err, sys.stderr)
  662. result.startTest(self)
  663. self.assertIs(real_out, sys.stdout)
  664. self.assertIs(real_err, sys.stderr)
  665. def testBufferOutputStartTestAddSuccess(self):
  666. real_out = self._real_out
  667. real_err = self._real_err
  668. result = unittest.TestResult()
  669. self.assertFalse(result.buffer)
  670. result.buffer = True
  671. self.assertIs(real_out, sys.stdout)
  672. self.assertIs(real_err, sys.stderr)
  673. result.startTest(self)
  674. self.assertIsNot(real_out, sys.stdout)
  675. self.assertIsNot(real_err, sys.stderr)
  676. self.assertIsInstance(sys.stdout, io.StringIO)
  677. self.assertIsInstance(sys.stderr, io.StringIO)
  678. self.assertIsNot(sys.stdout, sys.stderr)
  679. out_stream = sys.stdout
  680. err_stream = sys.stderr
  681. result._original_stdout = io.StringIO()
  682. result._original_stderr = io.StringIO()
  683. print('foo')
  684. print('bar', file=sys.stderr)
  685. self.assertEqual(out_stream.getvalue(), 'foo\n')
  686. self.assertEqual(err_stream.getvalue(), 'bar\n')
  687. self.assertEqual(result._original_stdout.getvalue(), '')
  688. self.assertEqual(result._original_stderr.getvalue(), '')
  689. result.addSuccess(self)
  690. result.stopTest(self)
  691. self.assertIs(sys.stdout, result._original_stdout)
  692. self.assertIs(sys.stderr, result._original_stderr)
  693. self.assertEqual(result._original_stdout.getvalue(), '')
  694. self.assertEqual(result._original_stderr.getvalue(), '')
  695. self.assertEqual(out_stream.getvalue(), '')
  696. self.assertEqual(err_stream.getvalue(), '')
  697. def getStartedResult(self):
  698. result = unittest.TestResult()
  699. result.buffer = True
  700. result.startTest(self)
  701. return result
  702. def testBufferOutputAddErrorOrFailure(self):
  703. unittest.result.traceback = MockTraceback
  704. self.addCleanup(restore_traceback)
  705. for message_attr, add_attr, include_error in [
  706. ('errors', 'addError', True),
  707. ('failures', 'addFailure', False),
  708. ('errors', 'addError', True),
  709. ('failures', 'addFailure', False)
  710. ]:
  711. result = self.getStartedResult()
  712. buffered_out = sys.stdout
  713. buffered_err = sys.stderr
  714. result._original_stdout = io.StringIO()
  715. result._original_stderr = io.StringIO()
  716. print('foo', file=sys.stdout)
  717. if include_error:
  718. print('bar', file=sys.stderr)
  719. addFunction = getattr(result, add_attr)
  720. addFunction(self, (None, None, None))
  721. result.stopTest(self)
  722. result_list = getattr(result, message_attr)
  723. self.assertEqual(len(result_list), 1)
  724. test, message = result_list[0]
  725. expectedOutMessage = textwrap.dedent("""
  726. Stdout:
  727. foo
  728. """)
  729. expectedErrMessage = ''
  730. if include_error:
  731. expectedErrMessage = textwrap.dedent("""
  732. Stderr:
  733. bar
  734. """)
  735. expectedFullMessage = 'A traceback%s%s' % (expectedOutMessage, expectedErrMessage)
  736. self.assertIs(test, self)
  737. self.assertEqual(result._original_stdout.getvalue(), expectedOutMessage)
  738. self.assertEqual(result._original_stderr.getvalue(), expectedErrMessage)
  739. self.assertMultiLineEqual(message, expectedFullMessage)
  740. def testBufferSetUp(self):
  741. with captured_stdout() as stdout:
  742. result = unittest.TestResult()
  743. result.buffer = True
  744. class Foo(unittest.TestCase):
  745. def setUp(self):
  746. print('set up')
  747. 1/0
  748. def test_foo(self):
  749. pass
  750. suite = unittest.TestSuite([Foo('test_foo')])
  751. suite(result)
  752. expected_out = '\nStdout:\nset up\n'
  753. self.assertEqual(stdout.getvalue(), expected_out)
  754. self.assertEqual(len(result.errors), 1)
  755. description = f'test_foo ({strclass(Foo)}.test_foo)'
  756. test_case, formatted_exc = result.errors[0]
  757. self.assertEqual(str(test_case), description)
  758. self.assertIn('ZeroDivisionError: division by zero', formatted_exc)
  759. self.assertIn(expected_out, formatted_exc)
  760. def testBufferTearDown(self):
  761. with captured_stdout() as stdout:
  762. result = unittest.TestResult()
  763. result.buffer = True
  764. class Foo(unittest.TestCase):
  765. def tearDown(self):
  766. print('tear down')
  767. 1/0
  768. def test_foo(self):
  769. pass
  770. suite = unittest.TestSuite([Foo('test_foo')])
  771. suite(result)
  772. expected_out = '\nStdout:\ntear down\n'
  773. self.assertEqual(stdout.getvalue(), expected_out)
  774. self.assertEqual(len(result.errors), 1)
  775. description = f'test_foo ({strclass(Foo)}.test_foo)'
  776. test_case, formatted_exc = result.errors[0]
  777. self.assertEqual(str(test_case), description)
  778. self.assertIn('ZeroDivisionError: division by zero', formatted_exc)
  779. self.assertIn(expected_out, formatted_exc)
  780. def testBufferDoCleanups(self):
  781. with captured_stdout() as stdout:
  782. result = unittest.TestResult()
  783. result.buffer = True
  784. class Foo(unittest.TestCase):
  785. def setUp(self):
  786. print('set up')
  787. self.addCleanup(bad_cleanup1)
  788. self.addCleanup(bad_cleanup2)
  789. def test_foo(self):
  790. pass
  791. suite = unittest.TestSuite([Foo('test_foo')])
  792. suite(result)
  793. expected_out = '\nStdout:\nset up\ndo cleanup2\ndo cleanup1\n'
  794. self.assertEqual(stdout.getvalue(), expected_out)
  795. self.assertEqual(len(result.errors), 2)
  796. description = f'test_foo ({strclass(Foo)}.test_foo)'
  797. test_case, formatted_exc = result.errors[0]
  798. self.assertEqual(str(test_case), description)
  799. self.assertIn('ValueError: bad cleanup2', formatted_exc)
  800. self.assertNotIn('TypeError', formatted_exc)
  801. self.assertIn('\nStdout:\nset up\ndo cleanup2\n', formatted_exc)
  802. self.assertNotIn('\ndo cleanup1\n', formatted_exc)
  803. test_case, formatted_exc = result.errors[1]
  804. self.assertEqual(str(test_case), description)
  805. self.assertIn('TypeError: bad cleanup1', formatted_exc)
  806. self.assertNotIn('ValueError', formatted_exc)
  807. self.assertIn(expected_out, formatted_exc)
  808. def testBufferSetUp_DoCleanups(self):
  809. with captured_stdout() as stdout:
  810. result = unittest.TestResult()
  811. result.buffer = True
  812. class Foo(unittest.TestCase):
  813. def setUp(self):
  814. print('set up')
  815. self.addCleanup(bad_cleanup1)
  816. self.addCleanup(bad_cleanup2)
  817. 1/0
  818. def test_foo(self):
  819. pass
  820. suite = unittest.TestSuite([Foo('test_foo')])
  821. suite(result)
  822. expected_out = '\nStdout:\nset up\ndo cleanup2\ndo cleanup1\n'
  823. self.assertEqual(stdout.getvalue(), expected_out)
  824. self.assertEqual(len(result.errors), 3)
  825. description = f'test_foo ({strclass(Foo)}.test_foo)'
  826. test_case, formatted_exc = result.errors[0]
  827. self.assertEqual(str(test_case), description)
  828. self.assertIn('ZeroDivisionError: division by zero', formatted_exc)
  829. self.assertNotIn('ValueError', formatted_exc)
  830. self.assertNotIn('TypeError', formatted_exc)
  831. self.assertIn('\nStdout:\nset up\n', formatted_exc)
  832. self.assertNotIn('\ndo cleanup2\n', formatted_exc)
  833. self.assertNotIn('\ndo cleanup1\n', formatted_exc)
  834. test_case, formatted_exc = result.errors[1]
  835. self.assertEqual(str(test_case), description)
  836. self.assertIn('ValueError: bad cleanup2', formatted_exc)
  837. self.assertNotIn('ZeroDivisionError', formatted_exc)
  838. self.assertNotIn('TypeError', formatted_exc)
  839. self.assertIn('\nStdout:\nset up\ndo cleanup2\n', formatted_exc)
  840. self.assertNotIn('\ndo cleanup1\n', formatted_exc)
  841. test_case, formatted_exc = result.errors[2]
  842. self.assertEqual(str(test_case), description)
  843. self.assertIn('TypeError: bad cleanup1', formatted_exc)
  844. self.assertNotIn('ZeroDivisionError', formatted_exc)
  845. self.assertNotIn('ValueError', formatted_exc)
  846. self.assertIn(expected_out, formatted_exc)
  847. def testBufferTearDown_DoCleanups(self):
  848. with captured_stdout() as stdout:
  849. result = unittest.TestResult()
  850. result.buffer = True
  851. class Foo(unittest.TestCase):
  852. def setUp(self):
  853. print('set up')
  854. self.addCleanup(bad_cleanup1)
  855. self.addCleanup(bad_cleanup2)
  856. def tearDown(self):
  857. print('tear down')
  858. 1/0
  859. def test_foo(self):
  860. pass
  861. suite = unittest.TestSuite([Foo('test_foo')])
  862. suite(result)
  863. expected_out = '\nStdout:\nset up\ntear down\ndo cleanup2\ndo cleanup1\n'
  864. self.assertEqual(stdout.getvalue(), expected_out)
  865. self.assertEqual(len(result.errors), 3)
  866. description = f'test_foo ({strclass(Foo)}.test_foo)'
  867. test_case, formatted_exc = result.errors[0]
  868. self.assertEqual(str(test_case), description)
  869. self.assertIn('ZeroDivisionError: division by zero', formatted_exc)
  870. self.assertNotIn('ValueError', formatted_exc)
  871. self.assertNotIn('TypeError', formatted_exc)
  872. self.assertIn('\nStdout:\nset up\ntear down\n', formatted_exc)
  873. self.assertNotIn('\ndo cleanup2\n', formatted_exc)
  874. self.assertNotIn('\ndo cleanup1\n', formatted_exc)
  875. test_case, formatted_exc = result.errors[1]
  876. self.assertEqual(str(test_case), description)
  877. self.assertIn('ValueError: bad cleanup2', formatted_exc)
  878. self.assertNotIn('ZeroDivisionError', formatted_exc)
  879. self.assertNotIn('TypeError', formatted_exc)
  880. self.assertIn('\nStdout:\nset up\ntear down\ndo cleanup2\n', formatted_exc)
  881. self.assertNotIn('\ndo cleanup1\n', formatted_exc)
  882. test_case, formatted_exc = result.errors[2]
  883. self.assertEqual(str(test_case), description)
  884. self.assertIn('TypeError: bad cleanup1', formatted_exc)
  885. self.assertNotIn('ZeroDivisionError', formatted_exc)
  886. self.assertNotIn('ValueError', formatted_exc)
  887. self.assertIn(expected_out, formatted_exc)
  888. def testBufferSetupClass(self):
  889. with captured_stdout() as stdout:
  890. result = unittest.TestResult()
  891. result.buffer = True
  892. class Foo(unittest.TestCase):
  893. @classmethod
  894. def setUpClass(cls):
  895. print('set up class')
  896. 1/0
  897. def test_foo(self):
  898. pass
  899. suite = unittest.TestSuite([Foo('test_foo')])
  900. suite(result)
  901. expected_out = '\nStdout:\nset up class\n'
  902. self.assertEqual(stdout.getvalue(), expected_out)
  903. self.assertEqual(len(result.errors), 1)
  904. description = f'setUpClass ({strclass(Foo)})'
  905. test_case, formatted_exc = result.errors[0]
  906. self.assertEqual(test_case.description, description)
  907. self.assertIn('ZeroDivisionError: division by zero', formatted_exc)
  908. self.assertIn(expected_out, formatted_exc)
  909. def testBufferTearDownClass(self):
  910. with captured_stdout() as stdout:
  911. result = unittest.TestResult()
  912. result.buffer = True
  913. class Foo(unittest.TestCase):
  914. @classmethod
  915. def tearDownClass(cls):
  916. print('tear down class')
  917. 1/0
  918. def test_foo(self):
  919. pass
  920. suite = unittest.TestSuite([Foo('test_foo')])
  921. suite(result)
  922. expected_out = '\nStdout:\ntear down class\n'
  923. self.assertEqual(stdout.getvalue(), expected_out)
  924. self.assertEqual(len(result.errors), 1)
  925. description = f'tearDownClass ({strclass(Foo)})'
  926. test_case, formatted_exc = result.errors[0]
  927. self.assertEqual(test_case.description, description)
  928. self.assertIn('ZeroDivisionError: division by zero', formatted_exc)
  929. self.assertIn(expected_out, formatted_exc)
  930. def testBufferDoClassCleanups(self):
  931. with captured_stdout() as stdout:
  932. result = unittest.TestResult()
  933. result.buffer = True
  934. class Foo(unittest.TestCase):
  935. @classmethod
  936. def setUpClass(cls):
  937. print('set up class')
  938. cls.addClassCleanup(bad_cleanup1)
  939. cls.addClassCleanup(bad_cleanup2)
  940. @classmethod
  941. def tearDownClass(cls):
  942. print('tear down class')
  943. def test_foo(self):
  944. pass
  945. suite = unittest.TestSuite([Foo('test_foo')])
  946. suite(result)
  947. expected_out = '\nStdout:\ntear down class\ndo cleanup2\ndo cleanup1\n'
  948. self.assertEqual(stdout.getvalue(), expected_out)
  949. self.assertEqual(len(result.errors), 2)
  950. description = f'tearDownClass ({strclass(Foo)})'
  951. test_case, formatted_exc = result.errors[0]
  952. self.assertEqual(test_case.description, description)
  953. self.assertIn('ValueError: bad cleanup2', formatted_exc)
  954. self.assertNotIn('TypeError', formatted_exc)
  955. self.assertIn(expected_out, formatted_exc)
  956. test_case, formatted_exc = result.errors[1]
  957. self.assertEqual(test_case.description, description)
  958. self.assertIn('TypeError: bad cleanup1', formatted_exc)
  959. self.assertNotIn('ValueError', formatted_exc)
  960. self.assertIn(expected_out, formatted_exc)
  961. def testBufferSetupClass_DoClassCleanups(self):
  962. with captured_stdout() as stdout:
  963. result = unittest.TestResult()
  964. result.buffer = True
  965. class Foo(unittest.TestCase):
  966. @classmethod
  967. def setUpClass(cls):
  968. print('set up class')
  969. cls.addClassCleanup(bad_cleanup1)
  970. cls.addClassCleanup(bad_cleanup2)
  971. 1/0
  972. def test_foo(self):
  973. pass
  974. suite = unittest.TestSuite([Foo('test_foo')])
  975. suite(result)
  976. expected_out = '\nStdout:\nset up class\ndo cleanup2\ndo cleanup1\n'
  977. self.assertEqual(stdout.getvalue(), expected_out)
  978. self.assertEqual(len(result.errors), 3)
  979. description = f'setUpClass ({strclass(Foo)})'
  980. test_case, formatted_exc = result.errors[0]
  981. self.assertEqual(test_case.description, description)
  982. self.assertIn('ZeroDivisionError: division by zero', formatted_exc)
  983. self.assertNotIn('ValueError', formatted_exc)
  984. self.assertNotIn('TypeError', formatted_exc)
  985. self.assertIn('\nStdout:\nset up class\n', formatted_exc)
  986. test_case, formatted_exc = result.errors[1]
  987. self.assertEqual(test_case.description, description)
  988. self.assertIn('ValueError: bad cleanup2', formatted_exc)
  989. self.assertNotIn('ZeroDivisionError', formatted_exc)
  990. self.assertNotIn('TypeError', formatted_exc)
  991. self.assertIn(expected_out, formatted_exc)
  992. test_case, formatted_exc = result.errors[2]
  993. self.assertEqual(test_case.description, description)
  994. self.assertIn('TypeError: bad cleanup1', formatted_exc)
  995. self.assertNotIn('ZeroDivisionError', formatted_exc)
  996. self.assertNotIn('ValueError', formatted_exc)
  997. self.assertIn(expected_out, formatted_exc)
  998. def testBufferTearDownClass_DoClassCleanups(self):
  999. with captured_stdout() as stdout:
  1000. result = unittest.TestResult()
  1001. result.buffer = True
  1002. class Foo(unittest.TestCase):
  1003. @classmethod
  1004. def setUpClass(cls):
  1005. print('set up class')
  1006. cls.addClassCleanup(bad_cleanup1)
  1007. cls.addClassCleanup(bad_cleanup2)
  1008. @classmethod
  1009. def tearDownClass(cls):
  1010. print('tear down class')
  1011. 1/0
  1012. def test_foo(self):
  1013. pass
  1014. suite = unittest.TestSuite([Foo('test_foo')])
  1015. suite(result)
  1016. expected_out = '\nStdout:\ntear down class\ndo cleanup2\ndo cleanup1\n'
  1017. self.assertEqual(stdout.getvalue(), expected_out)
  1018. self.assertEqual(len(result.errors), 3)
  1019. description = f'tearDownClass ({strclass(Foo)})'
  1020. test_case, formatted_exc = result.errors[0]
  1021. self.assertEqual(test_case.description, description)
  1022. self.assertIn('ZeroDivisionError: division by zero', formatted_exc)
  1023. self.assertNotIn('ValueError', formatted_exc)
  1024. self.assertNotIn('TypeError', formatted_exc)
  1025. self.assertIn('\nStdout:\ntear down class\n', formatted_exc)
  1026. test_case, formatted_exc = result.errors[1]
  1027. self.assertEqual(test_case.description, description)
  1028. self.assertIn('ValueError: bad cleanup2', formatted_exc)
  1029. self.assertNotIn('ZeroDivisionError', formatted_exc)
  1030. self.assertNotIn('TypeError', formatted_exc)
  1031. self.assertIn(expected_out, formatted_exc)
  1032. test_case, formatted_exc = result.errors[2]
  1033. self.assertEqual(test_case.description, description)
  1034. self.assertIn('TypeError: bad cleanup1', formatted_exc)
  1035. self.assertNotIn('ZeroDivisionError', formatted_exc)
  1036. self.assertNotIn('ValueError', formatted_exc)
  1037. self.assertIn(expected_out, formatted_exc)
  1038. def testBufferSetUpModule(self):
  1039. with captured_stdout() as stdout:
  1040. result = unittest.TestResult()
  1041. result.buffer = True
  1042. class Foo(unittest.TestCase):
  1043. def test_foo(self):
  1044. pass
  1045. class Module(object):
  1046. @staticmethod
  1047. def setUpModule():
  1048. print('set up module')
  1049. 1/0
  1050. Foo.__module__ = 'Module'
  1051. sys.modules['Module'] = Module
  1052. self.addCleanup(sys.modules.pop, 'Module')
  1053. suite = unittest.TestSuite([Foo('test_foo')])
  1054. suite(result)
  1055. expected_out = '\nStdout:\nset up module\n'
  1056. self.assertEqual(stdout.getvalue(), expected_out)
  1057. self.assertEqual(len(result.errors), 1)
  1058. description = 'setUpModule (Module)'
  1059. test_case, formatted_exc = result.errors[0]
  1060. self.assertEqual(test_case.description, description)
  1061. self.assertIn('ZeroDivisionError: division by zero', formatted_exc)
  1062. self.assertIn(expected_out, formatted_exc)
  1063. def testBufferTearDownModule(self):
  1064. with captured_stdout() as stdout:
  1065. result = unittest.TestResult()
  1066. result.buffer = True
  1067. class Foo(unittest.TestCase):
  1068. def test_foo(self):
  1069. pass
  1070. class Module(object):
  1071. @staticmethod
  1072. def tearDownModule():
  1073. print('tear down module')
  1074. 1/0
  1075. Foo.__module__ = 'Module'
  1076. sys.modules['Module'] = Module
  1077. self.addCleanup(sys.modules.pop, 'Module')
  1078. suite = unittest.TestSuite([Foo('test_foo')])
  1079. suite(result)
  1080. expected_out = '\nStdout:\ntear down module\n'
  1081. self.assertEqual(stdout.getvalue(), expected_out)
  1082. self.assertEqual(len(result.errors), 1)
  1083. description = 'tearDownModule (Module)'
  1084. test_case, formatted_exc = result.errors[0]
  1085. self.assertEqual(test_case.description, description)
  1086. self.assertIn('ZeroDivisionError: division by zero', formatted_exc)
  1087. self.assertIn(expected_out, formatted_exc)
  1088. def testBufferDoModuleCleanups(self):
  1089. with captured_stdout() as stdout:
  1090. result = unittest.TestResult()
  1091. result.buffer = True
  1092. class Foo(unittest.TestCase):
  1093. def test_foo(self):
  1094. pass
  1095. class Module(object):
  1096. @staticmethod
  1097. def setUpModule():
  1098. print('set up module')
  1099. unittest.addModuleCleanup(bad_cleanup1)
  1100. unittest.addModuleCleanup(bad_cleanup2)
  1101. Foo.__module__ = 'Module'
  1102. sys.modules['Module'] = Module
  1103. self.addCleanup(sys.modules.pop, 'Module')
  1104. suite = unittest.TestSuite([Foo('test_foo')])
  1105. suite(result)
  1106. expected_out = '\nStdout:\ndo cleanup2\ndo cleanup1\n'
  1107. self.assertEqual(stdout.getvalue(), expected_out)
  1108. self.assertEqual(len(result.errors), 1)
  1109. description = 'tearDownModule (Module)'
  1110. test_case, formatted_exc = result.errors[0]
  1111. self.assertEqual(test_case.description, description)
  1112. self.assertIn('ValueError: bad cleanup2', formatted_exc)
  1113. self.assertNotIn('TypeError', formatted_exc)
  1114. self.assertIn(expected_out, formatted_exc)
  1115. def testBufferSetUpModule_DoModuleCleanups(self):
  1116. with captured_stdout() as stdout:
  1117. result = unittest.TestResult()
  1118. result.buffer = True
  1119. class Foo(unittest.TestCase):
  1120. def test_foo(self):
  1121. pass
  1122. class Module(object):
  1123. @staticmethod
  1124. def setUpModule():
  1125. print('set up module')
  1126. unittest.addModuleCleanup(bad_cleanup1)
  1127. unittest.addModuleCleanup(bad_cleanup2)
  1128. 1/0
  1129. Foo.__module__ = 'Module'
  1130. sys.modules['Module'] = Module
  1131. self.addCleanup(sys.modules.pop, 'Module')
  1132. suite = unittest.TestSuite([Foo('test_foo')])
  1133. suite(result)
  1134. expected_out = '\nStdout:\nset up module\ndo cleanup2\ndo cleanup1\n'
  1135. self.assertEqual(stdout.getvalue(), expected_out)
  1136. self.assertEqual(len(result.errors), 2)
  1137. description = 'setUpModule (Module)'
  1138. test_case, formatted_exc = result.errors[0]
  1139. self.assertEqual(test_case.description, description)
  1140. self.assertIn('ZeroDivisionError: division by zero', formatted_exc)
  1141. self.assertNotIn('ValueError', formatted_exc)
  1142. self.assertNotIn('TypeError', formatted_exc)
  1143. self.assertIn('\nStdout:\nset up module\n', formatted_exc)
  1144. test_case, formatted_exc = result.errors[1]
  1145. self.assertIn(expected_out, formatted_exc)
  1146. self.assertEqual(test_case.description, description)
  1147. self.assertIn('ValueError: bad cleanup2', formatted_exc)
  1148. self.assertNotIn('ZeroDivisionError', formatted_exc)
  1149. self.assertNotIn('TypeError', formatted_exc)
  1150. self.assertIn(expected_out, formatted_exc)
  1151. def testBufferTearDownModule_DoModuleCleanups(self):
  1152. with captured_stdout() as stdout:
  1153. result = unittest.TestResult()
  1154. result.buffer = True
  1155. class Foo(unittest.TestCase):
  1156. def test_foo(self):
  1157. pass
  1158. class Module(object):
  1159. @staticmethod
  1160. def setUpModule():
  1161. print('set up module')
  1162. unittest.addModuleCleanup(bad_cleanup1)
  1163. unittest.addModuleCleanup(bad_cleanup2)
  1164. @staticmethod
  1165. def tearDownModule():
  1166. print('tear down module')
  1167. 1/0
  1168. Foo.__module__ = 'Module'
  1169. sys.modules['Module'] = Module
  1170. self.addCleanup(sys.modules.pop, 'Module')
  1171. suite = unittest.TestSuite([Foo('test_foo')])
  1172. suite(result)
  1173. expected_out = '\nStdout:\ntear down module\ndo cleanup2\ndo cleanup1\n'
  1174. self.assertEqual(stdout.getvalue(), expected_out)
  1175. self.assertEqual(len(result.errors), 2)
  1176. description = 'tearDownModule (Module)'
  1177. test_case, formatted_exc = result.errors[0]
  1178. self.assertEqual(test_case.description, description)
  1179. self.assertIn('ZeroDivisionError: division by zero', formatted_exc)
  1180. self.assertNotIn('ValueError', formatted_exc)
  1181. self.assertNotIn('TypeError', formatted_exc)
  1182. self.assertIn('\nStdout:\ntear down module\n', formatted_exc)
  1183. test_case, formatted_exc = result.errors[1]
  1184. self.assertEqual(test_case.description, description)
  1185. self.assertIn('ValueError: bad cleanup2', formatted_exc)
  1186. self.assertNotIn('ZeroDivisionError', formatted_exc)
  1187. self.assertNotIn('TypeError', formatted_exc)
  1188. self.assertIn(expected_out, formatted_exc)
  1189. if __name__ == '__main__':
  1190. unittest.main()