123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267 |
- import unittest
- from cStringIO import StringIO
- import pickle
- from unittest.test.support import (LoggingResult,
- ResultWithNoStartTestRunStopTestRun)
- 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, (), {})])
- result = test.doCleanups()
- self.assertTrue(result)
- self.assertEqual(cleanups, [(2, (), {}), (1, (1, 2, 3),
- dict(four='hello', five='goodbye'))])
- def testCleanUpWithErrors(self):
- class TestableTest(unittest.TestCase):
- def testNothing(self):
- pass
- class MockResult(object):
- errors = []
- def addError(self, test, exc_info):
- self.errors.append((test, exc_info))
- result = MockResult()
- test = TestableTest('testNothing')
- test._resultForDoCleanups = result
- exc1 = Exception('foo')
- exc2 = Exception('bar')
- def cleanup1():
- raise exc1
- def cleanup2():
- raise exc2
- test.addCleanup(cleanup1)
- test.addCleanup(cleanup2)
- self.assertFalse(test.doCleanups())
- (test1, (Type1, instance1, _)), (test2, (Type2, instance2, _)) = reversed(MockResult.errors)
- self.assertEqual((test1, Type1, instance1), (test, Exception, exc1))
- self.assertEqual((test2, Type2, instance2), (test, Exception, exc2))
- 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'])
- class Test_TextTestRunner(unittest.TestCase):
- """Tests for TextTestRunner."""
- def test_init(self):
- runner = unittest.TextTestRunner()
- self.assertFalse(runner.failfast)
- self.assertFalse(runner.buffer)
- self.assertEqual(runner.verbosity, 1)
- self.assertTrue(runner.descriptions)
- self.assertEqual(runner.resultclass, unittest.TextTestResult)
- 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=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 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=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__(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__(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).
- from StringIO import StringIO as PickleableIO
- # cStringIO objects are not pickleable, but StringIO objects are.
- stream = PickleableIO("foo")
- runner = unittest.TextTestRunner(stream)
- for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
- s = pickle.dumps(runner, protocol=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)
- if __name__ == '__main__':
- unittest.main()
|