gh-106300: Improve errors testing in test_unittest.test_runner (GH-106737)

Use a custom exception to prevent unintentional silence of actual errors.
This commit is contained in:
Nikita Sobolev 2023-08-16 12:20:42 +03:00 committed by GitHub
parent f6099871fa
commit fd9d70a94d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -24,6 +24,13 @@ def getRunner():
stream=io.StringIO()) stream=io.StringIO())
class CustomError(Exception):
pass
# For test output compat:
CustomErrorRepr = f"{__name__ + '.' if __name__ != '__main__' else ''}CustomError"
def runTests(*cases): def runTests(*cases):
suite = unittest.TestSuite() suite = unittest.TestSuite()
for case in cases: for case in cases:
@ -46,7 +53,7 @@ def cleanup(ordering, blowUp=False):
ordering.append('cleanup_good') ordering.append('cleanup_good')
else: else:
ordering.append('cleanup_exc') ordering.append('cleanup_exc')
raise Exception('CleanUpExc') raise CustomError('CleanUpExc')
class TestCM: class TestCM:
@ -108,8 +115,8 @@ class TestCleanUp(unittest.TestCase):
result = unittest.TestResult() result = unittest.TestResult()
outcome = test._outcome = _Outcome(result=result) outcome = test._outcome = _Outcome(result=result)
CleanUpExc = Exception('foo') CleanUpExc = CustomError('foo')
exc2 = Exception('bar') exc2 = CustomError('bar')
def cleanup1(): def cleanup1():
raise CleanUpExc raise CleanUpExc
@ -125,10 +132,10 @@ class TestCleanUp(unittest.TestCase):
(_, msg2), (_, msg1) = result.errors (_, msg2), (_, msg1) = result.errors
self.assertIn('in cleanup1', msg1) self.assertIn('in cleanup1', msg1)
self.assertIn('raise CleanUpExc', msg1) self.assertIn('raise CleanUpExc', msg1)
self.assertIn('Exception: foo', msg1) self.assertIn(f'{CustomErrorRepr}: foo', msg1)
self.assertIn('in cleanup2', msg2) self.assertIn('in cleanup2', msg2)
self.assertIn('raise exc2', msg2) self.assertIn('raise exc2', msg2)
self.assertIn('Exception: bar', msg2) self.assertIn(f'{CustomErrorRepr}: bar', msg2)
def testCleanupInRun(self): def testCleanupInRun(self):
blowUp = False blowUp = False
@ -139,7 +146,7 @@ class TestCleanUp(unittest.TestCase):
ordering.append('setUp') ordering.append('setUp')
test.addCleanup(cleanup2) test.addCleanup(cleanup2)
if blowUp: if blowUp:
raise Exception('foo') raise CustomError('foo')
def testNothing(self): def testNothing(self):
ordering.append('test') ordering.append('test')
@ -280,7 +287,7 @@ class TestClassCleanup(unittest.TestCase):
ordering.append('setUpClass') ordering.append('setUpClass')
cls.addClassCleanup(cleanup, ordering) cls.addClassCleanup(cleanup, ordering)
if blowUp: if blowUp:
raise Exception() raise CustomError()
def testNothing(self): def testNothing(self):
ordering.append('test') ordering.append('test')
@classmethod @classmethod
@ -306,7 +313,7 @@ class TestClassCleanup(unittest.TestCase):
ordering.append('setUpClass') ordering.append('setUpClass')
cls.addClassCleanup(cleanup, ordering) cls.addClassCleanup(cleanup, ordering)
if blowUp: if blowUp:
raise Exception() raise CustomError()
def testNothing(self): def testNothing(self):
ordering.append('test') ordering.append('test')
@classmethod @classmethod
@ -346,7 +353,7 @@ class TestClassCleanup(unittest.TestCase):
ordering = [] ordering = []
blowUp = True blowUp = True
suite = unittest.defaultTestLoader.loadTestsFromTestCase(TestableTest) suite = unittest.defaultTestLoader.loadTestsFromTestCase(TestableTest)
with self.assertRaises(Exception) as cm: with self.assertRaises(CustomError) as cm:
suite.debug() suite.debug()
self.assertEqual(str(cm.exception), 'CleanUpExc') self.assertEqual(str(cm.exception), 'CleanUpExc')
self.assertEqual(ordering, self.assertEqual(ordering,
@ -366,10 +373,10 @@ class TestClassCleanup(unittest.TestCase):
@classmethod @classmethod
def tearDownClass(cls): def tearDownClass(cls):
ordering.append('tearDownClass') ordering.append('tearDownClass')
raise Exception('TearDownClassExc') raise CustomError('TearDownClassExc')
suite = unittest.defaultTestLoader.loadTestsFromTestCase(TestableTest) suite = unittest.defaultTestLoader.loadTestsFromTestCase(TestableTest)
with self.assertRaises(Exception) as cm: with self.assertRaises(CustomError) as cm:
suite.debug() suite.debug()
self.assertEqual(str(cm.exception), 'TearDownClassExc') self.assertEqual(str(cm.exception), 'TearDownClassExc')
self.assertEqual(ordering, ['setUpClass', 'test', 'tearDownClass']) self.assertEqual(ordering, ['setUpClass', 'test', 'tearDownClass'])
@ -379,7 +386,7 @@ class TestClassCleanup(unittest.TestCase):
ordering = [] ordering = []
blowUp = True blowUp = True
suite = unittest.defaultTestLoader.loadTestsFromTestCase(TestableTest) suite = unittest.defaultTestLoader.loadTestsFromTestCase(TestableTest)
with self.assertRaises(Exception) as cm: with self.assertRaises(CustomError) as cm:
suite.debug() suite.debug()
self.assertEqual(str(cm.exception), 'TearDownClassExc') self.assertEqual(str(cm.exception), 'TearDownClassExc')
self.assertEqual(ordering, ['setUpClass', 'test', 'tearDownClass']) self.assertEqual(ordering, ['setUpClass', 'test', 'tearDownClass'])
@ -392,16 +399,22 @@ class TestClassCleanup(unittest.TestCase):
pass pass
def cleanup1(): def cleanup1():
raise Exception('cleanup1') raise CustomError('cleanup1')
def cleanup2(): def cleanup2():
raise Exception('cleanup2') raise CustomError('cleanup2')
TestableTest.addClassCleanup(cleanup1) TestableTest.addClassCleanup(cleanup1)
TestableTest.addClassCleanup(cleanup2) TestableTest.addClassCleanup(cleanup2)
with self.assertRaises(Exception) as e:
TestableTest.doClassCleanups() TestableTest.doClassCleanups()
self.assertEqual(e, 'cleanup1')
self.assertEqual(len(TestableTest.tearDown_exceptions), 2)
e1, e2 = TestableTest.tearDown_exceptions
self.assertIsInstance(e1[1], CustomError)
self.assertEqual(str(e1[1]), 'cleanup2')
self.assertIsInstance(e2[1], CustomError)
self.assertEqual(str(e2[1]), 'cleanup1')
def test_with_errors_addCleanUp(self): def test_with_errors_addCleanUp(self):
ordering = [] ordering = []
@ -421,7 +434,7 @@ class TestClassCleanup(unittest.TestCase):
result = runTests(TestableTest) result = runTests(TestableTest)
self.assertEqual(result.errors[0][1].splitlines()[-1], self.assertEqual(result.errors[0][1].splitlines()[-1],
'Exception: CleanUpExc') f'{CustomErrorRepr}: CleanUpExc')
self.assertEqual(ordering, self.assertEqual(ordering,
['setUpClass', 'setUp', 'cleanup_exc', ['setUpClass', 'setUp', 'cleanup_exc',
'tearDownClass', 'cleanup_good']) 'tearDownClass', 'cleanup_good'])
@ -444,7 +457,7 @@ class TestClassCleanup(unittest.TestCase):
result = runTests(TestableTest) result = runTests(TestableTest)
self.assertEqual(result.errors[0][1].splitlines()[-1], self.assertEqual(result.errors[0][1].splitlines()[-1],
'Exception: CleanUpExc') f'{CustomErrorRepr}: CleanUpExc')
self.assertEqual(ordering, self.assertEqual(ordering,
['setUpClass', 'setUp', 'test', 'cleanup_good', ['setUpClass', 'setUp', 'test', 'cleanup_good',
'tearDownClass', 'cleanup_exc']) 'tearDownClass', 'cleanup_exc'])
@ -460,11 +473,11 @@ class TestClassCleanup(unittest.TestCase):
ordering.append('setUpClass') ordering.append('setUpClass')
cls.addClassCleanup(cleanup, ordering, blowUp=True) cls.addClassCleanup(cleanup, ordering, blowUp=True)
if class_blow_up: if class_blow_up:
raise Exception('ClassExc') raise CustomError('ClassExc')
def setUp(self): def setUp(self):
ordering.append('setUp') ordering.append('setUp')
if method_blow_up: if method_blow_up:
raise Exception('MethodExc') raise CustomError('MethodExc')
def testNothing(self): def testNothing(self):
ordering.append('test') ordering.append('test')
@classmethod @classmethod
@ -473,7 +486,7 @@ class TestClassCleanup(unittest.TestCase):
result = runTests(TestableTest) result = runTests(TestableTest)
self.assertEqual(result.errors[0][1].splitlines()[-1], self.assertEqual(result.errors[0][1].splitlines()[-1],
'Exception: CleanUpExc') f'{CustomErrorRepr}: CleanUpExc')
self.assertEqual(ordering, self.assertEqual(ordering,
['setUpClass', 'setUp', 'test', ['setUpClass', 'setUp', 'test',
'tearDownClass', 'cleanup_exc']) 'tearDownClass', 'cleanup_exc'])
@ -483,9 +496,9 @@ class TestClassCleanup(unittest.TestCase):
method_blow_up = False method_blow_up = False
result = runTests(TestableTest) result = runTests(TestableTest)
self.assertEqual(result.errors[0][1].splitlines()[-1], self.assertEqual(result.errors[0][1].splitlines()[-1],
'Exception: ClassExc') f'{CustomErrorRepr}: ClassExc')
self.assertEqual(result.errors[1][1].splitlines()[-1], self.assertEqual(result.errors[1][1].splitlines()[-1],
'Exception: CleanUpExc') f'{CustomErrorRepr}: CleanUpExc')
self.assertEqual(ordering, self.assertEqual(ordering,
['setUpClass', 'cleanup_exc']) ['setUpClass', 'cleanup_exc'])
@ -494,9 +507,9 @@ class TestClassCleanup(unittest.TestCase):
method_blow_up = True method_blow_up = True
result = runTests(TestableTest) result = runTests(TestableTest)
self.assertEqual(result.errors[0][1].splitlines()[-1], self.assertEqual(result.errors[0][1].splitlines()[-1],
'Exception: MethodExc') f'{CustomErrorRepr}: MethodExc')
self.assertEqual(result.errors[1][1].splitlines()[-1], self.assertEqual(result.errors[1][1].splitlines()[-1],
'Exception: CleanUpExc') f'{CustomErrorRepr}: CleanUpExc')
self.assertEqual(ordering, self.assertEqual(ordering,
['setUpClass', 'setUp', 'tearDownClass', ['setUpClass', 'setUp', 'tearDownClass',
'cleanup_exc']) 'cleanup_exc'])
@ -513,11 +526,11 @@ class TestClassCleanup(unittest.TestCase):
@classmethod @classmethod
def tearDownClass(cls): def tearDownClass(cls):
ordering.append('tearDownClass') ordering.append('tearDownClass')
raise Exception('TearDownExc') raise CustomError('TearDownExc')
result = runTests(TestableTest) result = runTests(TestableTest)
self.assertEqual(result.errors[0][1].splitlines()[-1], self.assertEqual(result.errors[0][1].splitlines()[-1],
'Exception: TearDownExc') f'{CustomErrorRepr}: TearDownExc')
self.assertEqual(ordering, self.assertEqual(ordering,
['setUpClass', 'test', 'tearDownClass', 'cleanup_good']) ['setUpClass', 'test', 'tearDownClass', 'cleanup_good'])
@ -620,7 +633,7 @@ class TestModuleCleanUp(unittest.TestCase):
module_cleanups.append((3, args, kwargs)) module_cleanups.append((3, args, kwargs))
def module_cleanup_bad(*args, **kwargs): def module_cleanup_bad(*args, **kwargs):
raise Exception('CleanUpExc') raise CustomError('CleanUpExc')
class Module(object): class Module(object):
unittest.addModuleCleanup(module_cleanup_good, 1, 2, 3, unittest.addModuleCleanup(module_cleanup_good, 1, 2, 3,
@ -630,7 +643,7 @@ class TestModuleCleanUp(unittest.TestCase):
[(module_cleanup_good, (1, 2, 3), [(module_cleanup_good, (1, 2, 3),
dict(four='hello', five='goodbye')), dict(four='hello', five='goodbye')),
(module_cleanup_bad, (), {})]) (module_cleanup_bad, (), {})])
with self.assertRaises(Exception) as e: with self.assertRaises(CustomError) as e:
unittest.case.doModuleCleanups() unittest.case.doModuleCleanups()
self.assertEqual(str(e.exception), 'CleanUpExc') self.assertEqual(str(e.exception), 'CleanUpExc')
self.assertEqual(unittest.case._module_cleanups, []) self.assertEqual(unittest.case._module_cleanups, [])
@ -659,7 +672,7 @@ class TestModuleCleanUp(unittest.TestCase):
ordering.append('setUpModule') ordering.append('setUpModule')
unittest.addModuleCleanup(cleanup, ordering) unittest.addModuleCleanup(cleanup, ordering)
if blowUp: if blowUp:
raise Exception('setUpModule Exc') raise CustomError('setUpModule Exc')
@staticmethod @staticmethod
def tearDownModule(): def tearDownModule():
ordering.append('tearDownModule') ordering.append('tearDownModule')
@ -679,7 +692,7 @@ class TestModuleCleanUp(unittest.TestCase):
result = runTests(TestableTest) result = runTests(TestableTest)
self.assertEqual(ordering, ['setUpModule', 'cleanup_good']) self.assertEqual(ordering, ['setUpModule', 'cleanup_good'])
self.assertEqual(result.errors[0][1].splitlines()[-1], self.assertEqual(result.errors[0][1].splitlines()[-1],
'Exception: setUpModule Exc') f'{CustomErrorRepr}: setUpModule Exc')
ordering = [] ordering = []
blowUp = False blowUp = False
@ -699,7 +712,7 @@ class TestModuleCleanUp(unittest.TestCase):
ordering.append('setUpModule') ordering.append('setUpModule')
unittest.addModuleCleanup(cleanup, ordering) unittest.addModuleCleanup(cleanup, ordering)
if blowUp: if blowUp:
raise Exception() raise CustomError()
@staticmethod @staticmethod
def tearDownModule(): def tearDownModule():
ordering.append('tearDownModule') ordering.append('tearDownModule')
@ -710,7 +723,7 @@ class TestModuleCleanUp(unittest.TestCase):
ordering.append('setUpModule2') ordering.append('setUpModule2')
unittest.addModuleCleanup(cleanup, ordering) unittest.addModuleCleanup(cleanup, ordering)
if blowUp2: if blowUp2:
raise Exception() raise CustomError()
@staticmethod @staticmethod
def tearDownModule(): def tearDownModule():
ordering.append('tearDownModule2') ordering.append('tearDownModule2')
@ -799,7 +812,7 @@ class TestModuleCleanUp(unittest.TestCase):
@staticmethod @staticmethod
def tearDownModule(): def tearDownModule():
ordering.append('tearDownModule') ordering.append('tearDownModule')
raise Exception('CleanUpExc') raise CustomError('CleanUpExc')
class TestableTest(unittest.TestCase): class TestableTest(unittest.TestCase):
@classmethod @classmethod
@ -815,7 +828,7 @@ class TestModuleCleanUp(unittest.TestCase):
sys.modules['Module'] = Module sys.modules['Module'] = Module
result = runTests(TestableTest) result = runTests(TestableTest)
self.assertEqual(result.errors[0][1].splitlines()[-1], self.assertEqual(result.errors[0][1].splitlines()[-1],
'Exception: CleanUpExc') f'{CustomErrorRepr}: CleanUpExc')
self.assertEqual(ordering, ['setUpModule', 'setUpClass', 'test', self.assertEqual(ordering, ['setUpModule', 'setUpClass', 'test',
'tearDownClass', 'tearDownModule', 'tearDownClass', 'tearDownModule',
'cleanup_good']) 'cleanup_good'])
@ -855,7 +868,7 @@ class TestModuleCleanUp(unittest.TestCase):
ordering = [] ordering = []
blowUp = True blowUp = True
suite = unittest.defaultTestLoader.loadTestsFromTestCase(TestableTest) suite = unittest.defaultTestLoader.loadTestsFromTestCase(TestableTest)
with self.assertRaises(Exception) as cm: with self.assertRaises(CustomError) as cm:
suite.debug() suite.debug()
self.assertEqual(str(cm.exception), 'CleanUpExc') self.assertEqual(str(cm.exception), 'CleanUpExc')
self.assertEqual(ordering, ['setUpModule', 'setUpClass', 'test', self.assertEqual(ordering, ['setUpModule', 'setUpClass', 'test',
@ -873,7 +886,7 @@ class TestModuleCleanUp(unittest.TestCase):
@staticmethod @staticmethod
def tearDownModule(): def tearDownModule():
ordering.append('tearDownModule') ordering.append('tearDownModule')
raise Exception('TearDownModuleExc') raise CustomError('TearDownModuleExc')
class TestableTest(unittest.TestCase): class TestableTest(unittest.TestCase):
@classmethod @classmethod
@ -888,7 +901,7 @@ class TestModuleCleanUp(unittest.TestCase):
TestableTest.__module__ = 'Module' TestableTest.__module__ = 'Module'
sys.modules['Module'] = Module sys.modules['Module'] = Module
suite = unittest.defaultTestLoader.loadTestsFromTestCase(TestableTest) suite = unittest.defaultTestLoader.loadTestsFromTestCase(TestableTest)
with self.assertRaises(Exception) as cm: with self.assertRaises(CustomError) as cm:
suite.debug() suite.debug()
self.assertEqual(str(cm.exception), 'TearDownModuleExc') self.assertEqual(str(cm.exception), 'TearDownModuleExc')
self.assertEqual(ordering, ['setUpModule', 'setUpClass', 'test', self.assertEqual(ordering, ['setUpModule', 'setUpClass', 'test',
@ -899,7 +912,7 @@ class TestModuleCleanUp(unittest.TestCase):
ordering = [] ordering = []
blowUp = True blowUp = True
suite = unittest.defaultTestLoader.loadTestsFromTestCase(TestableTest) suite = unittest.defaultTestLoader.loadTestsFromTestCase(TestableTest)
with self.assertRaises(Exception) as cm: with self.assertRaises(CustomError) as cm:
suite.debug() suite.debug()
self.assertEqual(str(cm.exception), 'TearDownModuleExc') self.assertEqual(str(cm.exception), 'TearDownModuleExc')
self.assertEqual(ordering, ['setUpModule', 'setUpClass', 'test', self.assertEqual(ordering, ['setUpModule', 'setUpClass', 'test',
@ -978,7 +991,7 @@ class TestModuleCleanUp(unittest.TestCase):
result = runTests(TestableTest) result = runTests(TestableTest)
self.assertEqual(result.errors[0][1].splitlines()[-1], self.assertEqual(result.errors[0][1].splitlines()[-1],
'Exception: CleanUpExc') f'{CustomErrorRepr}: CleanUpExc')
self.assertEqual(ordering, self.assertEqual(ordering,
['setUpModule', 'setUpClass', 'test', 'tearDownClass', ['setUpModule', 'setUpClass', 'test', 'tearDownClass',
'cleanup_exc', 'tearDownModule', 'cleanup_good']) 'cleanup_exc', 'tearDownModule', 'cleanup_good'])
@ -1008,7 +1021,7 @@ class TestModuleCleanUp(unittest.TestCase):
result = runTests(TestableTest) result = runTests(TestableTest)
self.assertEqual(result.errors[0][1].splitlines()[-1], self.assertEqual(result.errors[0][1].splitlines()[-1],
'Exception: CleanUpExc') f'{CustomErrorRepr}: CleanUpExc')
self.assertEqual(ordering, self.assertEqual(ordering,
['setUpModule', 'setUp', 'test', 'tearDown', ['setUpModule', 'setUp', 'test', 'tearDown',
'cleanup_exc', 'tearDownModule', 'cleanup_good']) 'cleanup_exc', 'tearDownModule', 'cleanup_good'])
@ -1024,7 +1037,7 @@ class TestModuleCleanUp(unittest.TestCase):
ordering.append('setUpModule') ordering.append('setUpModule')
unittest.addModuleCleanup(cleanup, ordering, blowUp=True) unittest.addModuleCleanup(cleanup, ordering, blowUp=True)
if module_blow_up: if module_blow_up:
raise Exception('ModuleExc') raise CustomError('ModuleExc')
@staticmethod @staticmethod
def tearDownModule(): def tearDownModule():
ordering.append('tearDownModule') ordering.append('tearDownModule')
@ -1034,11 +1047,11 @@ class TestModuleCleanUp(unittest.TestCase):
def setUpClass(cls): def setUpClass(cls):
ordering.append('setUpClass') ordering.append('setUpClass')
if class_blow_up: if class_blow_up:
raise Exception('ClassExc') raise CustomError('ClassExc')
def setUp(self): def setUp(self):
ordering.append('setUp') ordering.append('setUp')
if method_blow_up: if method_blow_up:
raise Exception('MethodExc') raise CustomError('MethodExc')
def testNothing(self): def testNothing(self):
ordering.append('test') ordering.append('test')
@classmethod @classmethod
@ -1050,7 +1063,7 @@ class TestModuleCleanUp(unittest.TestCase):
result = runTests(TestableTest) result = runTests(TestableTest)
self.assertEqual(result.errors[0][1].splitlines()[-1], self.assertEqual(result.errors[0][1].splitlines()[-1],
'Exception: CleanUpExc') f'{CustomErrorRepr}: CleanUpExc')
self.assertEqual(ordering, self.assertEqual(ordering,
['setUpModule', 'setUpClass', 'setUp', 'test', ['setUpModule', 'setUpClass', 'setUp', 'test',
'tearDownClass', 'tearDownModule', 'tearDownClass', 'tearDownModule',
@ -1062,9 +1075,9 @@ class TestModuleCleanUp(unittest.TestCase):
method_blow_up = False method_blow_up = False
result = runTests(TestableTest) result = runTests(TestableTest)
self.assertEqual(result.errors[0][1].splitlines()[-1], self.assertEqual(result.errors[0][1].splitlines()[-1],
'Exception: ModuleExc') f'{CustomErrorRepr}: ModuleExc')
self.assertEqual(result.errors[1][1].splitlines()[-1], self.assertEqual(result.errors[1][1].splitlines()[-1],
'Exception: CleanUpExc') f'{CustomErrorRepr}: CleanUpExc')
self.assertEqual(ordering, ['setUpModule', 'cleanup_exc']) self.assertEqual(ordering, ['setUpModule', 'cleanup_exc'])
ordering = [] ordering = []
@ -1073,9 +1086,9 @@ class TestModuleCleanUp(unittest.TestCase):
method_blow_up = False method_blow_up = False
result = runTests(TestableTest) result = runTests(TestableTest)
self.assertEqual(result.errors[0][1].splitlines()[-1], self.assertEqual(result.errors[0][1].splitlines()[-1],
'Exception: ClassExc') f'{CustomErrorRepr}: ClassExc')
self.assertEqual(result.errors[1][1].splitlines()[-1], self.assertEqual(result.errors[1][1].splitlines()[-1],
'Exception: CleanUpExc') f'{CustomErrorRepr}: CleanUpExc')
self.assertEqual(ordering, ['setUpModule', 'setUpClass', self.assertEqual(ordering, ['setUpModule', 'setUpClass',
'tearDownModule', 'cleanup_exc']) 'tearDownModule', 'cleanup_exc'])
@ -1085,9 +1098,9 @@ class TestModuleCleanUp(unittest.TestCase):
method_blow_up = True method_blow_up = True
result = runTests(TestableTest) result = runTests(TestableTest)
self.assertEqual(result.errors[0][1].splitlines()[-1], self.assertEqual(result.errors[0][1].splitlines()[-1],
'Exception: MethodExc') f'{CustomErrorRepr}: MethodExc')
self.assertEqual(result.errors[1][1].splitlines()[-1], self.assertEqual(result.errors[1][1].splitlines()[-1],
'Exception: CleanUpExc') f'{CustomErrorRepr}: CleanUpExc')
self.assertEqual(ordering, ['setUpModule', 'setUpClass', 'setUp', self.assertEqual(ordering, ['setUpModule', 'setUpClass', 'setUp',
'tearDownClass', 'tearDownModule', 'tearDownClass', 'tearDownModule',
'cleanup_exc']) 'cleanup_exc'])