mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 07:31:38 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			228 lines
		
	
	
	
		
			7.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			228 lines
		
	
	
	
		
			7.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
import unittest
 | 
						|
 | 
						|
from cStringIO import StringIO
 | 
						|
import pickle
 | 
						|
 | 
						|
from .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'])
 | 
						|
 | 
						|
 | 
						|
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 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()
 |