aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Lib/unittest/test/test_runner.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/unittest/test/test_runner.py')
-rw-r--r--Lib/unittest/test/test_runner.py1330
1 files changed, 0 insertions, 1330 deletions
diff --git a/Lib/unittest/test/test_runner.py b/Lib/unittest/test/test_runner.py
deleted file mode 100644
index d3488b40e82..00000000000
--- a/Lib/unittest/test/test_runner.py
+++ /dev/null
@@ -1,1330 +0,0 @@
-import io
-import os
-import sys
-import pickle
-import subprocess
-from test import support
-
-import unittest
-from unittest.case import _Outcome
-
-from unittest.test.support import (LoggingResult,
- ResultWithNoStartTestRunStopTestRun)
-
-
-def resultFactory(*_):
- return unittest.TestResult()
-
-
-def getRunner():
- return unittest.TextTestRunner(resultclass=resultFactory,
- stream=io.StringIO())
-
-
-def runTests(*cases):
- suite = unittest.TestSuite()
- for case in cases:
- tests = unittest.defaultTestLoader.loadTestsFromTestCase(case)
- suite.addTests(tests)
-
- runner = getRunner()
-
- # creating a nested suite exposes some potential bugs
- realSuite = unittest.TestSuite()
- realSuite.addTest(suite)
- # adding empty suites to the end exposes potential bugs
- suite.addTest(unittest.TestSuite())
- realSuite.addTest(unittest.TestSuite())
- return runner.run(realSuite)
-
-
-def cleanup(ordering, blowUp=False):
- if not blowUp:
- ordering.append('cleanup_good')
- else:
- ordering.append('cleanup_exc')
- raise Exception('CleanUpExc')
-
-
-class TestCM:
- def __init__(self, ordering, enter_result=None):
- self.ordering = ordering
- self.enter_result = enter_result
-
- def __enter__(self):
- self.ordering.append('enter')
- return self.enter_result
-
- def __exit__(self, *exc_info):
- self.ordering.append('exit')
-
-
-class LacksEnterAndExit:
- pass
-class LacksEnter:
- def __exit__(self, *exc_info):
- pass
-class LacksExit:
- def __enter__(self):
- pass
-
-
-class TestCleanUp(unittest.TestCase):
- def testCleanUp(self):
- class TestableTest(unittest.TestCase):
- def testNothing(self):
- pass
-
- test = TestableTest('testNothing')
- self.assertEqual(test._cleanups, [])
-
- cleanups = []
-
- def cleanup1(*args, **kwargs):
- cleanups.append((1, args, kwargs))
-
- def cleanup2(*args, **kwargs):
- cleanups.append((2, args, kwargs))
-
- test.addCleanup(cleanup1, 1, 2, 3, four='hello', five='goodbye')
- test.addCleanup(cleanup2)
-
- self.assertEqual(test._cleanups,
- [(cleanup1, (1, 2, 3), dict(four='hello', five='goodbye')),
- (cleanup2, (), {})])
-
- self.assertTrue(test.doCleanups())
- self.assertEqual(cleanups, [(2, (), {}), (1, (1, 2, 3), dict(four='hello', five='goodbye'))])
-
- def testCleanUpWithErrors(self):
- class TestableTest(unittest.TestCase):
- def testNothing(self):
- pass
-
- test = TestableTest('testNothing')
- result = unittest.TestResult()
- outcome = test._outcome = _Outcome(result=result)
-
- CleanUpExc = Exception('foo')
- exc2 = Exception('bar')
- def cleanup1():
- raise CleanUpExc
-
- def cleanup2():
- raise exc2
-
- test.addCleanup(cleanup1)
- test.addCleanup(cleanup2)
-
- self.assertFalse(test.doCleanups())
- self.assertFalse(outcome.success)
-
- (_, msg2), (_, msg1) = result.errors
- self.assertIn('in cleanup1', msg1)
- self.assertIn('raise CleanUpExc', msg1)
- self.assertIn('Exception: foo', msg1)
- self.assertIn('in cleanup2', msg2)
- self.assertIn('raise exc2', msg2)
- self.assertIn('Exception: bar', msg2)
-
- def testCleanupInRun(self):
- blowUp = False
- ordering = []
-
- class TestableTest(unittest.TestCase):
- def setUp(self):
- ordering.append('setUp')
- if blowUp:
- raise Exception('foo')
-
- def testNothing(self):
- ordering.append('test')
-
- def tearDown(self):
- ordering.append('tearDown')
-
- test = TestableTest('testNothing')
-
- def cleanup1():
- ordering.append('cleanup1')
- def cleanup2():
- ordering.append('cleanup2')
- test.addCleanup(cleanup1)
- test.addCleanup(cleanup2)
-
- def success(some_test):
- self.assertEqual(some_test, test)
- ordering.append('success')
-
- result = unittest.TestResult()
- result.addSuccess = success
-
- test.run(result)
- self.assertEqual(ordering, ['setUp', 'test', 'tearDown',
- 'cleanup2', 'cleanup1', 'success'])
-
- blowUp = True
- ordering = []
- test = TestableTest('testNothing')
- test.addCleanup(cleanup1)
- test.run(result)
- self.assertEqual(ordering, ['setUp', 'cleanup1'])
-
- def testTestCaseDebugExecutesCleanups(self):
- ordering = []
-
- class TestableTest(unittest.TestCase):
- def setUp(self):
- ordering.append('setUp')
- self.addCleanup(cleanup1)
-
- def testNothing(self):
- ordering.append('test')
-
- def tearDown(self):
- ordering.append('tearDown')
-
- test = TestableTest('testNothing')
-
- def cleanup1():
- ordering.append('cleanup1')
- test.addCleanup(cleanup2)
- def cleanup2():
- ordering.append('cleanup2')
-
- test.debug()
- self.assertEqual(ordering, ['setUp', 'test', 'tearDown', 'cleanup1', 'cleanup2'])
-
-
- def test_enterContext(self):
- class TestableTest(unittest.TestCase):
- def testNothing(self):
- pass
-
- test = TestableTest('testNothing')
- cleanups = []
-
- test.addCleanup(cleanups.append, 'cleanup1')
- cm = TestCM(cleanups, 42)
- self.assertEqual(test.enterContext(cm), 42)
- test.addCleanup(cleanups.append, 'cleanup2')
-
- self.assertTrue(test.doCleanups())
- self.assertEqual(cleanups, ['enter', 'cleanup2', 'exit', 'cleanup1'])
-
- def test_enterContext_arg_errors(self):
- class TestableTest(unittest.TestCase):
- def testNothing(self):
- pass
-
- test = TestableTest('testNothing')
-
- with self.assertRaisesRegex(TypeError, 'the context manager'):
- test.enterContext(LacksEnterAndExit())
- with self.assertRaisesRegex(TypeError, 'the context manager'):
- test.enterContext(LacksEnter())
- with self.assertRaisesRegex(TypeError, 'the context manager'):
- test.enterContext(LacksExit())
-
- self.assertEqual(test._cleanups, [])
-
-
-class TestClassCleanup(unittest.TestCase):
- def test_addClassCleanUp(self):
- class TestableTest(unittest.TestCase):
- def testNothing(self):
- pass
- test = TestableTest('testNothing')
- self.assertEqual(test._class_cleanups, [])
- class_cleanups = []
-
- def class_cleanup1(*args, **kwargs):
- class_cleanups.append((3, args, kwargs))
-
- def class_cleanup2(*args, **kwargs):
- class_cleanups.append((4, args, kwargs))
-
- TestableTest.addClassCleanup(class_cleanup1, 1, 2, 3,
- four='hello', five='goodbye')
- TestableTest.addClassCleanup(class_cleanup2)
-
- self.assertEqual(test._class_cleanups,
- [(class_cleanup1, (1, 2, 3),
- dict(four='hello', five='goodbye')),
- (class_cleanup2, (), {})])
-
- TestableTest.doClassCleanups()
- self.assertEqual(class_cleanups, [(4, (), {}), (3, (1, 2, 3),
- dict(four='hello', five='goodbye'))])
-
- def test_run_class_cleanUp(self):
- ordering = []
- blowUp = True
-
- class TestableTest(unittest.TestCase):
- @classmethod
- def setUpClass(cls):
- ordering.append('setUpClass')
- cls.addClassCleanup(cleanup, ordering)
- if blowUp:
- raise Exception()
- def testNothing(self):
- ordering.append('test')
- @classmethod
- def tearDownClass(cls):
- ordering.append('tearDownClass')
-
- runTests(TestableTest)
- self.assertEqual(ordering, ['setUpClass', 'cleanup_good'])
-
- ordering = []
- blowUp = False
- runTests(TestableTest)
- self.assertEqual(ordering,
- ['setUpClass', 'test', 'tearDownClass', 'cleanup_good'])
-
- def test_run_class_cleanUp_without_tearDownClass(self):
- ordering = []
- blowUp = True
-
- class TestableTest(unittest.TestCase):
- @classmethod
- def setUpClass(cls):
- ordering.append('setUpClass')
- cls.addClassCleanup(cleanup, ordering)
- if blowUp:
- raise Exception()
- def testNothing(self):
- ordering.append('test')
- @classmethod
- @property
- def tearDownClass(cls):
- raise AttributeError
-
- runTests(TestableTest)
- self.assertEqual(ordering, ['setUpClass', 'cleanup_good'])
-
- ordering = []
- blowUp = False
- runTests(TestableTest)
- self.assertEqual(ordering,
- ['setUpClass', 'test', 'cleanup_good'])
-
- def test_debug_executes_classCleanUp(self):
- ordering = []
- blowUp = False
-
- class TestableTest(unittest.TestCase):
- @classmethod
- def setUpClass(cls):
- ordering.append('setUpClass')
- cls.addClassCleanup(cleanup, ordering, blowUp=blowUp)
- def testNothing(self):
- ordering.append('test')
- @classmethod
- def tearDownClass(cls):
- ordering.append('tearDownClass')
-
- suite = unittest.defaultTestLoader.loadTestsFromTestCase(TestableTest)
- suite.debug()
- self.assertEqual(ordering,
- ['setUpClass', 'test', 'tearDownClass', 'cleanup_good'])
-
- ordering = []
- blowUp = True
- suite = unittest.defaultTestLoader.loadTestsFromTestCase(TestableTest)
- with self.assertRaises(Exception) as cm:
- suite.debug()
- self.assertEqual(str(cm.exception), 'CleanUpExc')
- self.assertEqual(ordering,
- ['setUpClass', 'test', 'tearDownClass', 'cleanup_exc'])
-
- def test_debug_executes_classCleanUp_when_teardown_exception(self):
- ordering = []
- blowUp = False
-
- class TestableTest(unittest.TestCase):
- @classmethod
- def setUpClass(cls):
- ordering.append('setUpClass')
- cls.addClassCleanup(cleanup, ordering, blowUp=blowUp)
- def testNothing(self):
- ordering.append('test')
- @classmethod
- def tearDownClass(cls):
- raise Exception('TearDownClassExc')
-
- suite = unittest.defaultTestLoader.loadTestsFromTestCase(TestableTest)
- with self.assertRaises(Exception) as cm:
- suite.debug()
- self.assertEqual(str(cm.exception), 'TearDownClassExc')
- self.assertEqual(ordering, ['setUpClass', 'test'])
- self.assertTrue(TestableTest._class_cleanups)
- TestableTest._class_cleanups.clear()
-
- ordering = []
- blowUp = True
- suite = unittest.defaultTestLoader.loadTestsFromTestCase(TestableTest)
- with self.assertRaises(Exception) as cm:
- suite.debug()
- self.assertEqual(str(cm.exception), 'TearDownClassExc')
- self.assertEqual(ordering, ['setUpClass', 'test'])
- self.assertTrue(TestableTest._class_cleanups)
- TestableTest._class_cleanups.clear()
-
- def test_doClassCleanups_with_errors_addClassCleanUp(self):
- class TestableTest(unittest.TestCase):
- def testNothing(self):
- pass
-
- def cleanup1():
- raise Exception('cleanup1')
-
- def cleanup2():
- raise Exception('cleanup2')
-
- TestableTest.addClassCleanup(cleanup1)
- TestableTest.addClassCleanup(cleanup2)
- with self.assertRaises(Exception) as e:
- TestableTest.doClassCleanups()
- self.assertEqual(e, 'cleanup1')
-
- def test_with_errors_addCleanUp(self):
- ordering = []
- class TestableTest(unittest.TestCase):
- @classmethod
- def setUpClass(cls):
- ordering.append('setUpClass')
- cls.addClassCleanup(cleanup, ordering)
- def setUp(self):
- ordering.append('setUp')
- self.addCleanup(cleanup, ordering, blowUp=True)
- def testNothing(self):
- pass
- @classmethod
- def tearDownClass(cls):
- ordering.append('tearDownClass')
-
- result = runTests(TestableTest)
- self.assertEqual(result.errors[0][1].splitlines()[-1],
- 'Exception: CleanUpExc')
- self.assertEqual(ordering,
- ['setUpClass', 'setUp', 'cleanup_exc',
- 'tearDownClass', 'cleanup_good'])
-
- def test_run_with_errors_addClassCleanUp(self):
- ordering = []
- class TestableTest(unittest.TestCase):
- @classmethod
- def setUpClass(cls):
- ordering.append('setUpClass')
- cls.addClassCleanup(cleanup, ordering, blowUp=True)
- def setUp(self):
- ordering.append('setUp')
- self.addCleanup(cleanup, ordering)
- def testNothing(self):
- ordering.append('test')
- @classmethod
- def tearDownClass(cls):
- ordering.append('tearDownClass')
-
- result = runTests(TestableTest)
- self.assertEqual(result.errors[0][1].splitlines()[-1],
- 'Exception: CleanUpExc')
- self.assertEqual(ordering,
- ['setUpClass', 'setUp', 'test', 'cleanup_good',
- 'tearDownClass', 'cleanup_exc'])
-
- def test_with_errors_in_addClassCleanup_and_setUps(self):
- ordering = []
- class_blow_up = False
- method_blow_up = False
-
- class TestableTest(unittest.TestCase):
- @classmethod
- def setUpClass(cls):
- ordering.append('setUpClass')
- cls.addClassCleanup(cleanup, ordering, blowUp=True)
- if class_blow_up:
- raise Exception('ClassExc')
- def setUp(self):
- ordering.append('setUp')
- if method_blow_up:
- raise Exception('MethodExc')
- def testNothing(self):
- ordering.append('test')
- @classmethod
- def tearDownClass(cls):
- ordering.append('tearDownClass')
-
- result = runTests(TestableTest)
- self.assertEqual(result.errors[0][1].splitlines()[-1],
- 'Exception: CleanUpExc')
- self.assertEqual(ordering,
- ['setUpClass', 'setUp', 'test',
- 'tearDownClass', 'cleanup_exc'])
-
- ordering = []
- class_blow_up = True
- method_blow_up = False
- result = runTests(TestableTest)
- self.assertEqual(result.errors[0][1].splitlines()[-1],
- 'Exception: ClassExc')
- self.assertEqual(result.errors[1][1].splitlines()[-1],
- 'Exception: CleanUpExc')
- self.assertEqual(ordering,
- ['setUpClass', 'cleanup_exc'])
-
- ordering = []
- class_blow_up = False
- method_blow_up = True
- result = runTests(TestableTest)
- self.assertEqual(result.errors[0][1].splitlines()[-1],
- 'Exception: MethodExc')
- self.assertEqual(result.errors[1][1].splitlines()[-1],
- 'Exception: CleanUpExc')
- self.assertEqual(ordering,
- ['setUpClass', 'setUp', 'tearDownClass',
- 'cleanup_exc'])
-
- def test_with_errors_in_tearDownClass(self):
- ordering = []
- class TestableTest(unittest.TestCase):
- @classmethod
- def setUpClass(cls):
- ordering.append('setUpClass')
- cls.addClassCleanup(cleanup, ordering)
- def testNothing(self):
- ordering.append('test')
- @classmethod
- def tearDownClass(cls):
- ordering.append('tearDownClass')
- raise Exception('TearDownExc')
-
- result = runTests(TestableTest)
- self.assertEqual(result.errors[0][1].splitlines()[-1],
- 'Exception: TearDownExc')
- self.assertEqual(ordering,
- ['setUpClass', 'test', 'tearDownClass', 'cleanup_good'])
-
- def test_enterClassContext(self):
- class TestableTest(unittest.TestCase):
- def testNothing(self):
- pass
-
- cleanups = []
-
- TestableTest.addClassCleanup(cleanups.append, 'cleanup1')
- cm = TestCM(cleanups, 42)
- self.assertEqual(TestableTest.enterClassContext(cm), 42)
- TestableTest.addClassCleanup(cleanups.append, 'cleanup2')
-
- TestableTest.doClassCleanups()
- self.assertEqual(cleanups, ['enter', 'cleanup2', 'exit', 'cleanup1'])
-
- def test_enterClassContext_arg_errors(self):
- class TestableTest(unittest.TestCase):
- def testNothing(self):
- pass
-
- with self.assertRaisesRegex(TypeError, 'the context manager'):
- TestableTest.enterClassContext(LacksEnterAndExit())
- with self.assertRaisesRegex(TypeError, 'the context manager'):
- TestableTest.enterClassContext(LacksEnter())
- with self.assertRaisesRegex(TypeError, 'the context manager'):
- TestableTest.enterClassContext(LacksExit())
-
- self.assertEqual(TestableTest._class_cleanups, [])
-
-
-class TestModuleCleanUp(unittest.TestCase):
- def test_add_and_do_ModuleCleanup(self):
- module_cleanups = []
-
- def module_cleanup1(*args, **kwargs):
- module_cleanups.append((3, args, kwargs))
-
- def module_cleanup2(*args, **kwargs):
- module_cleanups.append((4, args, kwargs))
-
- class Module(object):
- unittest.addModuleCleanup(module_cleanup1, 1, 2, 3,
- four='hello', five='goodbye')
- unittest.addModuleCleanup(module_cleanup2)
-
- self.assertEqual(unittest.case._module_cleanups,
- [(module_cleanup1, (1, 2, 3),
- dict(four='hello', five='goodbye')),
- (module_cleanup2, (), {})])
-
- unittest.case.doModuleCleanups()
- self.assertEqual(module_cleanups, [(4, (), {}), (3, (1, 2, 3),
- dict(four='hello', five='goodbye'))])
- self.assertEqual(unittest.case._module_cleanups, [])
-
- def test_doModuleCleanup_with_errors_in_addModuleCleanup(self):
- module_cleanups = []
-
- def module_cleanup_good(*args, **kwargs):
- module_cleanups.append((3, args, kwargs))
-
- def module_cleanup_bad(*args, **kwargs):
- raise Exception('CleanUpExc')
-
- class Module(object):
- unittest.addModuleCleanup(module_cleanup_good, 1, 2, 3,
- four='hello', five='goodbye')
- unittest.addModuleCleanup(module_cleanup_bad)
- self.assertEqual(unittest.case._module_cleanups,
- [(module_cleanup_good, (1, 2, 3),
- dict(four='hello', five='goodbye')),
- (module_cleanup_bad, (), {})])
- with self.assertRaises(Exception) as e:
- unittest.case.doModuleCleanups()
- self.assertEqual(str(e.exception), 'CleanUpExc')
- self.assertEqual(unittest.case._module_cleanups, [])
-
- def test_addModuleCleanup_arg_errors(self):
- cleanups = []
- def cleanup(*args, **kwargs):
- cleanups.append((args, kwargs))
-
- class Module(object):
- unittest.addModuleCleanup(cleanup, 1, 2, function='hello')
- with self.assertRaises(TypeError):
- unittest.addModuleCleanup(function=cleanup, arg='hello')
- with self.assertRaises(TypeError):
- unittest.addModuleCleanup()
- unittest.case.doModuleCleanups()
- self.assertEqual(cleanups,
- [((1, 2), {'function': 'hello'})])
-
- def test_run_module_cleanUp(self):
- blowUp = True
- ordering = []
- class Module(object):
- @staticmethod
- def setUpModule():
- ordering.append('setUpModule')
- unittest.addModuleCleanup(cleanup, ordering)
- if blowUp:
- raise Exception('setUpModule Exc')
- @staticmethod
- def tearDownModule():
- ordering.append('tearDownModule')
-
- class TestableTest(unittest.TestCase):
- @classmethod
- def setUpClass(cls):
- ordering.append('setUpClass')
- def testNothing(self):
- ordering.append('test')
- @classmethod
- def tearDownClass(cls):
- ordering.append('tearDownClass')
-
- TestableTest.__module__ = 'Module'
- sys.modules['Module'] = Module
- result = runTests(TestableTest)
- self.assertEqual(ordering, ['setUpModule', 'cleanup_good'])
- self.assertEqual(result.errors[0][1].splitlines()[-1],
- 'Exception: setUpModule Exc')
-
- ordering = []
- blowUp = False
- runTests(TestableTest)
- self.assertEqual(ordering,
- ['setUpModule', 'setUpClass', 'test', 'tearDownClass',
- 'tearDownModule', 'cleanup_good'])
- self.assertEqual(unittest.case._module_cleanups, [])
-
- def test_run_multiple_module_cleanUp(self):
- blowUp = True
- blowUp2 = False
- ordering = []
- class Module1(object):
- @staticmethod
- def setUpModule():
- ordering.append('setUpModule')
- unittest.addModuleCleanup(cleanup, ordering)
- if blowUp:
- raise Exception()
- @staticmethod
- def tearDownModule():
- ordering.append('tearDownModule')
-
- class Module2(object):
- @staticmethod
- def setUpModule():
- ordering.append('setUpModule2')
- unittest.addModuleCleanup(cleanup, ordering)
- if blowUp2:
- raise Exception()
- @staticmethod
- def tearDownModule():
- ordering.append('tearDownModule2')
-
- class TestableTest(unittest.TestCase):
- @classmethod
- def setUpClass(cls):
- ordering.append('setUpClass')
- def testNothing(self):
- ordering.append('test')
- @classmethod
- def tearDownClass(cls):
- ordering.append('tearDownClass')
-
- class TestableTest2(unittest.TestCase):
- @classmethod
- def setUpClass(cls):
- ordering.append('setUpClass2')
- def testNothing(self):
- ordering.append('test2')
- @classmethod
- def tearDownClass(cls):
- ordering.append('tearDownClass2')
-
- TestableTest.__module__ = 'Module1'
- sys.modules['Module1'] = Module1
- TestableTest2.__module__ = 'Module2'
- sys.modules['Module2'] = Module2
- runTests(TestableTest, TestableTest2)
- self.assertEqual(ordering, ['setUpModule', 'cleanup_good',
- 'setUpModule2', 'setUpClass2', 'test2',
- 'tearDownClass2', 'tearDownModule2',
- 'cleanup_good'])
- ordering = []
- blowUp = False
- blowUp2 = True
- runTests(TestableTest, TestableTest2)
- self.assertEqual(ordering, ['setUpModule', 'setUpClass', 'test',
- 'tearDownClass', 'tearDownModule',
- 'cleanup_good', 'setUpModule2',
- 'cleanup_good'])
-
- ordering = []
- blowUp = False
- blowUp2 = False
- runTests(TestableTest, TestableTest2)
- self.assertEqual(ordering,
- ['setUpModule', 'setUpClass', 'test', 'tearDownClass',
- 'tearDownModule', 'cleanup_good', 'setUpModule2',
- 'setUpClass2', 'test2', 'tearDownClass2',
- 'tearDownModule2', 'cleanup_good'])
- self.assertEqual(unittest.case._module_cleanups, [])
-
- def test_run_module_cleanUp_without_teardown(self):
- ordering = []
- class Module(object):
- @staticmethod
- def setUpModule():
- ordering.append('setUpModule')
- unittest.addModuleCleanup(cleanup, ordering)
-
- class TestableTest(unittest.TestCase):
- @classmethod
- def setUpClass(cls):
- ordering.append('setUpClass')
- def testNothing(self):
- ordering.append('test')
- @classmethod
- def tearDownClass(cls):
- ordering.append('tearDownClass')
-
- TestableTest.__module__ = 'Module'
- sys.modules['Module'] = Module
- runTests(TestableTest)
- self.assertEqual(ordering, ['setUpModule', 'setUpClass', 'test',
- 'tearDownClass', 'cleanup_good'])
- self.assertEqual(unittest.case._module_cleanups, [])
-
- def test_run_module_cleanUp_when_teardown_exception(self):
- ordering = []
- class Module(object):
- @staticmethod
- def setUpModule():
- ordering.append('setUpModule')
- unittest.addModuleCleanup(cleanup, ordering)
- @staticmethod
- def tearDownModule():
- raise Exception('CleanUpExc')
-
- class TestableTest(unittest.TestCase):
- @classmethod
- def setUpClass(cls):
- ordering.append('setUpClass')
- def testNothing(self):
- ordering.append('test')
- @classmethod
- def tearDownClass(cls):
- ordering.append('tearDownClass')
-
- TestableTest.__module__ = 'Module'
- sys.modules['Module'] = Module
- result = runTests(TestableTest)
- self.assertEqual(result.errors[0][1].splitlines()[-1],
- 'Exception: CleanUpExc')
- self.assertEqual(ordering, ['setUpModule', 'setUpClass', 'test',
- 'tearDownClass', 'cleanup_good'])
- self.assertEqual(unittest.case._module_cleanups, [])
-
- def test_debug_module_executes_cleanUp(self):
- ordering = []
- blowUp = False
- class Module(object):
- @staticmethod
- def setUpModule():
- ordering.append('setUpModule')
- unittest.addModuleCleanup(cleanup, ordering, blowUp=blowUp)
- @staticmethod
- def tearDownModule():
- ordering.append('tearDownModule')
-
- class TestableTest(unittest.TestCase):
- @classmethod
- def setUpClass(cls):
- ordering.append('setUpClass')
- def testNothing(self):
- ordering.append('test')
- @classmethod
- def tearDownClass(cls):
- ordering.append('tearDownClass')
-
- TestableTest.__module__ = 'Module'
- sys.modules['Module'] = Module
- suite = unittest.defaultTestLoader.loadTestsFromTestCase(TestableTest)
- suite.debug()
- self.assertEqual(ordering,
- ['setUpModule', 'setUpClass', 'test', 'tearDownClass',
- 'tearDownModule', 'cleanup_good'])
- self.assertEqual(unittest.case._module_cleanups, [])
-
- ordering = []
- blowUp = True
- suite = unittest.defaultTestLoader.loadTestsFromTestCase(TestableTest)
- with self.assertRaises(Exception) as cm:
- suite.debug()
- self.assertEqual(str(cm.exception), 'CleanUpExc')
- self.assertEqual(ordering, ['setUpModule', 'setUpClass', 'test',
- 'tearDownClass', 'tearDownModule', 'cleanup_exc'])
- self.assertEqual(unittest.case._module_cleanups, [])
-
- def test_debug_module_cleanUp_when_teardown_exception(self):
- ordering = []
- blowUp = False
- class Module(object):
- @staticmethod
- def setUpModule():
- ordering.append('setUpModule')
- unittest.addModuleCleanup(cleanup, ordering, blowUp=blowUp)
- @staticmethod
- def tearDownModule():
- raise Exception('TearDownModuleExc')
-
- class TestableTest(unittest.TestCase):
- @classmethod
- def setUpClass(cls):
- ordering.append('setUpClass')
- def testNothing(self):
- ordering.append('test')
- @classmethod
- def tearDownClass(cls):
- ordering.append('tearDownClass')
-
- TestableTest.__module__ = 'Module'
- sys.modules['Module'] = Module
- suite = unittest.defaultTestLoader.loadTestsFromTestCase(TestableTest)
- with self.assertRaises(Exception) as cm:
- suite.debug()
- self.assertEqual(str(cm.exception), 'TearDownModuleExc')
- self.assertEqual(ordering, ['setUpModule', 'setUpClass', 'test',
- 'tearDownClass'])
- self.assertTrue(unittest.case._module_cleanups)
- unittest.case._module_cleanups.clear()
-
- ordering = []
- blowUp = True
- suite = unittest.defaultTestLoader.loadTestsFromTestCase(TestableTest)
- with self.assertRaises(Exception) as cm:
- suite.debug()
- self.assertEqual(str(cm.exception), 'TearDownModuleExc')
- self.assertEqual(ordering, ['setUpModule', 'setUpClass', 'test',
- 'tearDownClass'])
- self.assertTrue(unittest.case._module_cleanups)
- unittest.case._module_cleanups.clear()
-
- def test_addClassCleanup_arg_errors(self):
- cleanups = []
- def cleanup(*args, **kwargs):
- cleanups.append((args, kwargs))
-
- class TestableTest(unittest.TestCase):
- @classmethod
- def setUpClass(cls):
- cls.addClassCleanup(cleanup, 1, 2, function=3, cls=4)
- with self.assertRaises(TypeError):
- cls.addClassCleanup(function=cleanup, arg='hello')
- def testNothing(self):
- pass
-
- with self.assertRaises(TypeError):
- TestableTest.addClassCleanup()
- with self.assertRaises(TypeError):
- unittest.TestCase.addCleanup(cls=TestableTest(), function=cleanup)
- runTests(TestableTest)
- self.assertEqual(cleanups,
- [((1, 2), {'function': 3, 'cls': 4})])
-
- def test_addCleanup_arg_errors(self):
- cleanups = []
- def cleanup(*args, **kwargs):
- cleanups.append((args, kwargs))
-
- class TestableTest(unittest.TestCase):
- def setUp(self2):
- self2.addCleanup(cleanup, 1, 2, function=3, self=4)
- with self.assertRaises(TypeError):
- self2.addCleanup(function=cleanup, arg='hello')
- def testNothing(self):
- pass
-
- with self.assertRaises(TypeError):
- TestableTest().addCleanup()
- with self.assertRaises(TypeError):
- unittest.TestCase.addCleanup(self=TestableTest(), function=cleanup)
- runTests(TestableTest)
- self.assertEqual(cleanups,
- [((1, 2), {'function': 3, 'self': 4})])
-
- def test_with_errors_in_addClassCleanup(self):
- ordering = []
-
- class Module(object):
- @staticmethod
- def setUpModule():
- ordering.append('setUpModule')
- unittest.addModuleCleanup(cleanup, ordering)
- @staticmethod
- def tearDownModule():
- ordering.append('tearDownModule')
-
- class TestableTest(unittest.TestCase):
- @classmethod
- def setUpClass(cls):
- ordering.append('setUpClass')
- cls.addClassCleanup(cleanup, ordering, blowUp=True)
- def testNothing(self):
- ordering.append('test')
- @classmethod
- def tearDownClass(cls):
- ordering.append('tearDownClass')
-
- TestableTest.__module__ = 'Module'
- sys.modules['Module'] = Module
-
- result = runTests(TestableTest)
- self.assertEqual(result.errors[0][1].splitlines()[-1],
- 'Exception: CleanUpExc')
- self.assertEqual(ordering,
- ['setUpModule', 'setUpClass', 'test', 'tearDownClass',
- 'cleanup_exc', 'tearDownModule', 'cleanup_good'])
-
- def test_with_errors_in_addCleanup(self):
- ordering = []
- class Module(object):
- @staticmethod
- def setUpModule():
- ordering.append('setUpModule')
- unittest.addModuleCleanup(cleanup, ordering)
- @staticmethod
- def tearDownModule():
- ordering.append('tearDownModule')
-
- class TestableTest(unittest.TestCase):
- def setUp(self):
- ordering.append('setUp')
- self.addCleanup(cleanup, ordering, blowUp=True)
- def testNothing(self):
- ordering.append('test')
- def tearDown(self):
- ordering.append('tearDown')
-
- TestableTest.__module__ = 'Module'
- sys.modules['Module'] = Module
-
- result = runTests(TestableTest)
- self.assertEqual(result.errors[0][1].splitlines()[-1],
- 'Exception: CleanUpExc')
- self.assertEqual(ordering,
- ['setUpModule', 'setUp', 'test', 'tearDown',
- 'cleanup_exc', 'tearDownModule', 'cleanup_good'])
-
- def test_with_errors_in_addModuleCleanup_and_setUps(self):
- ordering = []
- module_blow_up = False
- class_blow_up = False
- method_blow_up = False
- class Module(object):
- @staticmethod
- def setUpModule():
- ordering.append('setUpModule')
- unittest.addModuleCleanup(cleanup, ordering, blowUp=True)
- if module_blow_up:
- raise Exception('ModuleExc')
- @staticmethod
- def tearDownModule():
- ordering.append('tearDownModule')
-
- class TestableTest(unittest.TestCase):
- @classmethod
- def setUpClass(cls):
- ordering.append('setUpClass')
- if class_blow_up:
- raise Exception('ClassExc')
- def setUp(self):
- ordering.append('setUp')
- if method_blow_up:
- raise Exception('MethodExc')
- def testNothing(self):
- ordering.append('test')
- @classmethod
- def tearDownClass(cls):
- ordering.append('tearDownClass')
-
- TestableTest.__module__ = 'Module'
- sys.modules['Module'] = Module
-
- result = runTests(TestableTest)
- self.assertEqual(result.errors[0][1].splitlines()[-1],
- 'Exception: CleanUpExc')
- self.assertEqual(ordering,
- ['setUpModule', 'setUpClass', 'setUp', 'test',
- 'tearDownClass', 'tearDownModule',
- 'cleanup_exc'])
-
- ordering = []
- module_blow_up = True
- class_blow_up = False
- method_blow_up = False
- result = runTests(TestableTest)
- self.assertEqual(result.errors[0][1].splitlines()[-1],
- 'Exception: ModuleExc')
- self.assertEqual(result.errors[1][1].splitlines()[-1],
- 'Exception: CleanUpExc')
- self.assertEqual(ordering, ['setUpModule', 'cleanup_exc'])
-
- ordering = []
- module_blow_up = False
- class_blow_up = True
- method_blow_up = False
- result = runTests(TestableTest)
- self.assertEqual(result.errors[0][1].splitlines()[-1],
- 'Exception: ClassExc')
- self.assertEqual(result.errors[1][1].splitlines()[-1],
- 'Exception: CleanUpExc')
- self.assertEqual(ordering, ['setUpModule', 'setUpClass',
- 'tearDownModule', 'cleanup_exc'])
-
- ordering = []
- module_blow_up = False
- class_blow_up = False
- method_blow_up = True
- result = runTests(TestableTest)
- self.assertEqual(result.errors[0][1].splitlines()[-1],
- 'Exception: MethodExc')
- self.assertEqual(result.errors[1][1].splitlines()[-1],
- 'Exception: CleanUpExc')
- self.assertEqual(ordering, ['setUpModule', 'setUpClass', 'setUp',
- 'tearDownClass', 'tearDownModule',
- 'cleanup_exc'])
-
- def test_module_cleanUp_with_multiple_classes(self):
- ordering =[]
- def cleanup1():
- ordering.append('cleanup1')
-
- def cleanup2():
- ordering.append('cleanup2')
-
- def cleanup3():
- ordering.append('cleanup3')
-
- class Module(object):
- @staticmethod
- def setUpModule():
- ordering.append('setUpModule')
- unittest.addModuleCleanup(cleanup1)
- @staticmethod
- def tearDownModule():
- ordering.append('tearDownModule')
-
- class TestableTest(unittest.TestCase):
- def setUp(self):
- ordering.append('setUp')
- self.addCleanup(cleanup2)
- def testNothing(self):
- ordering.append('test')
- def tearDown(self):
- ordering.append('tearDown')
-
- class OtherTestableTest(unittest.TestCase):
- def setUp(self):
- ordering.append('setUp2')
- self.addCleanup(cleanup3)
- def testNothing(self):
- ordering.append('test2')
- def tearDown(self):
- ordering.append('tearDown2')
-
- TestableTest.__module__ = 'Module'
- OtherTestableTest.__module__ = 'Module'
- sys.modules['Module'] = Module
- runTests(TestableTest, OtherTestableTest)
- self.assertEqual(ordering,
- ['setUpModule', 'setUp', 'test', 'tearDown',
- 'cleanup2', 'setUp2', 'test2', 'tearDown2',
- 'cleanup3', 'tearDownModule', 'cleanup1'])
-
- def test_enterModuleContext(self):
- cleanups = []
-
- unittest.addModuleCleanup(cleanups.append, 'cleanup1')
- cm = TestCM(cleanups, 42)
- self.assertEqual(unittest.enterModuleContext(cm), 42)
- unittest.addModuleCleanup(cleanups.append, 'cleanup2')
-
- unittest.case.doModuleCleanups()
- self.assertEqual(cleanups, ['enter', 'cleanup2', 'exit', 'cleanup1'])
-
- def test_enterModuleContext_arg_errors(self):
- class TestableTest(unittest.TestCase):
- def testNothing(self):
- pass
-
- with self.assertRaisesRegex(TypeError, 'the context manager'):
- unittest.enterModuleContext(LacksEnterAndExit())
- with self.assertRaisesRegex(TypeError, 'the context manager'):
- unittest.enterModuleContext(LacksEnter())
- with self.assertRaisesRegex(TypeError, 'the context manager'):
- unittest.enterModuleContext(LacksExit())
-
- self.assertEqual(unittest.case._module_cleanups, [])
-
-
-class Test_TextTestRunner(unittest.TestCase):
- """Tests for TextTestRunner."""
-
- def setUp(self):
- # clean the environment from pre-existing PYTHONWARNINGS to make
- # test_warnings results consistent
- self.pythonwarnings = os.environ.get('PYTHONWARNINGS')
- if self.pythonwarnings:
- del os.environ['PYTHONWARNINGS']
-
- def tearDown(self):
- # bring back pre-existing PYTHONWARNINGS if present
- if self.pythonwarnings:
- os.environ['PYTHONWARNINGS'] = self.pythonwarnings
-
- def test_init(self):
- runner = unittest.TextTestRunner()
- self.assertFalse(runner.failfast)
- self.assertFalse(runner.buffer)
- self.assertEqual(runner.verbosity, 1)
- self.assertEqual(runner.warnings, None)
- self.assertTrue(runner.descriptions)
- self.assertEqual(runner.resultclass, unittest.TextTestResult)
- self.assertFalse(runner.tb_locals)
-
- def test_multiple_inheritance(self):
- class AResult(unittest.TestResult):
- def __init__(self, stream, descriptions, verbosity):
- super(AResult, self).__init__(stream, descriptions, verbosity)
-
- class ATextResult(unittest.TextTestResult, AResult):
- pass
-
- # This used to raise an exception due to TextTestResult not passing
- # on arguments in its __init__ super call
- ATextResult(None, None, 1)
-
- def testBufferAndFailfast(self):
- class Test(unittest.TestCase):
- def testFoo(self):
- pass
- result = unittest.TestResult()
- runner = unittest.TextTestRunner(stream=io.StringIO(), failfast=True,
- buffer=True)
- # Use our result object
- runner._makeResult = lambda: result
- runner.run(Test('testFoo'))
-
- self.assertTrue(result.failfast)
- self.assertTrue(result.buffer)
-
- def test_locals(self):
- runner = unittest.TextTestRunner(stream=io.StringIO(), tb_locals=True)
- result = runner.run(unittest.TestSuite())
- self.assertEqual(True, result.tb_locals)
-
- def testRunnerRegistersResult(self):
- class Test(unittest.TestCase):
- def testFoo(self):
- pass
- originalRegisterResult = unittest.runner.registerResult
- def cleanup():
- unittest.runner.registerResult = originalRegisterResult
- self.addCleanup(cleanup)
-
- result = unittest.TestResult()
- runner = unittest.TextTestRunner(stream=io.StringIO())
- # Use our result object
- runner._makeResult = lambda: result
-
- self.wasRegistered = 0
- def fakeRegisterResult(thisResult):
- self.wasRegistered += 1
- self.assertEqual(thisResult, result)
- unittest.runner.registerResult = fakeRegisterResult
-
- runner.run(unittest.TestSuite())
- self.assertEqual(self.wasRegistered, 1)
-
- def test_works_with_result_without_startTestRun_stopTestRun(self):
- class OldTextResult(ResultWithNoStartTestRunStopTestRun):
- separator2 = ''
- def printErrors(self):
- pass
-
- class Runner(unittest.TextTestRunner):
- def __init__(self):
- super(Runner, self).__init__(io.StringIO())
-
- def _makeResult(self):
- return OldTextResult()
-
- runner = Runner()
- runner.run(unittest.TestSuite())
-
- def test_startTestRun_stopTestRun_called(self):
- class LoggingTextResult(LoggingResult):
- separator2 = ''
- def printErrors(self):
- pass
-
- class LoggingRunner(unittest.TextTestRunner):
- def __init__(self, events):
- super(LoggingRunner, self).__init__(io.StringIO())
- self._events = events
-
- def _makeResult(self):
- return LoggingTextResult(self._events)
-
- events = []
- runner = LoggingRunner(events)
- runner.run(unittest.TestSuite())
- expected = ['startTestRun', 'stopTestRun']
- self.assertEqual(events, expected)
-
- def test_pickle_unpickle(self):
- # Issue #7197: a TextTestRunner should be (un)pickleable. This is
- # required by test_multiprocessing under Windows (in verbose mode).
- stream = io.StringIO("foo")
- runner = unittest.TextTestRunner(stream)
- for protocol in range(2, pickle.HIGHEST_PROTOCOL + 1):
- s = pickle.dumps(runner, protocol)
- obj = pickle.loads(s)
- # StringIO objects never compare equal, a cheap test instead.
- self.assertEqual(obj.stream.getvalue(), stream.getvalue())
-
- def test_resultclass(self):
- def MockResultClass(*args):
- return args
- STREAM = object()
- DESCRIPTIONS = object()
- VERBOSITY = object()
- runner = unittest.TextTestRunner(STREAM, DESCRIPTIONS, VERBOSITY,
- resultclass=MockResultClass)
- self.assertEqual(runner.resultclass, MockResultClass)
-
- expectedresult = (runner.stream, DESCRIPTIONS, VERBOSITY)
- self.assertEqual(runner._makeResult(), expectedresult)
-
- @support.requires_subprocess()
- def test_warnings(self):
- """
- Check that warnings argument of TextTestRunner correctly affects the
- behavior of the warnings.
- """
- # see #10535 and the _test_warnings file for more information
-
- def get_parse_out_err(p):
- return [b.splitlines() for b in p.communicate()]
- opts = dict(stdout=subprocess.PIPE, stderr=subprocess.PIPE,
- cwd=os.path.dirname(__file__))
- ae_msg = b'Please use assertEqual instead.'
- at_msg = b'Please use assertTrue instead.'
-
- # no args -> all the warnings are printed, unittest warnings only once
- p = subprocess.Popen([sys.executable, '-E', '_test_warnings.py'], **opts)
- with p:
- out, err = get_parse_out_err(p)
- self.assertIn(b'OK', err)
- # check that the total number of warnings in the output is correct
- self.assertEqual(len(out), 12)
- # check that the numbers of the different kind of warnings is correct
- for msg in [b'dw', b'iw', b'uw']:
- self.assertEqual(out.count(msg), 3)
- for msg in [ae_msg, at_msg, b'rw']:
- self.assertEqual(out.count(msg), 1)
-
- args_list = (
- # passing 'ignore' as warnings arg -> no warnings
- [sys.executable, '_test_warnings.py', 'ignore'],
- # -W doesn't affect the result if the arg is passed
- [sys.executable, '-Wa', '_test_warnings.py', 'ignore'],
- # -W affects the result if the arg is not passed
- [sys.executable, '-Wi', '_test_warnings.py']
- )
- # in all these cases no warnings are printed
- for args in args_list:
- p = subprocess.Popen(args, **opts)
- with p:
- out, err = get_parse_out_err(p)
- self.assertIn(b'OK', err)
- self.assertEqual(len(out), 0)
-
-
- # passing 'always' as warnings arg -> all the warnings printed,
- # unittest warnings only once
- p = subprocess.Popen([sys.executable, '_test_warnings.py', 'always'],
- **opts)
- with p:
- out, err = get_parse_out_err(p)
- self.assertIn(b'OK', err)
- self.assertEqual(len(out), 14)
- for msg in [b'dw', b'iw', b'uw', b'rw']:
- self.assertEqual(out.count(msg), 3)
- for msg in [ae_msg, at_msg]:
- self.assertEqual(out.count(msg), 1)
-
- def testStdErrLookedUpAtInstantiationTime(self):
- # see issue 10786
- old_stderr = sys.stderr
- f = io.StringIO()
- sys.stderr = f
- try:
- runner = unittest.TextTestRunner()
- self.assertTrue(runner.stream.stream is f)
- finally:
- sys.stderr = old_stderr
-
- def testSpecifiedStreamUsed(self):
- # see issue 10786
- f = io.StringIO()
- runner = unittest.TextTestRunner(f)
- self.assertTrue(runner.stream.stream is f)
-
-
-if __name__ == "__main__":
- unittest.main()