Home | History | Annotate | Download | only in test
      1 import unittest
      2 
      3 from cStringIO import StringIO
      4 import pickle
      5 
      6 from .support import LoggingResult, ResultWithNoStartTestRunStopTestRun
      7 
      8 
      9 class TestCleanUp(unittest.TestCase):
     10 
     11     def testCleanUp(self):
     12         class TestableTest(unittest.TestCase):
     13             def testNothing(self):
     14                 pass
     15 
     16         test = TestableTest('testNothing')
     17         self.assertEqual(test._cleanups, [])
     18 
     19         cleanups = []
     20 
     21         def cleanup1(*args, **kwargs):
     22             cleanups.append((1, args, kwargs))
     23 
     24         def cleanup2(*args, **kwargs):
     25             cleanups.append((2, args, kwargs))
     26 
     27         test.addCleanup(cleanup1, 1, 2, 3, four='hello', five='goodbye')
     28         test.addCleanup(cleanup2)
     29 
     30         self.assertEqual(test._cleanups,
     31                          [(cleanup1, (1, 2, 3), dict(four='hello', five='goodbye')),
     32                           (cleanup2, (), {})])
     33 
     34         result = test.doCleanups()
     35         self.assertTrue(result)
     36 
     37         self.assertEqual(cleanups, [(2, (), {}), (1, (1, 2, 3),
     38                                     dict(four='hello', five='goodbye'))])
     39 
     40     def testCleanUpWithErrors(self):
     41         class TestableTest(unittest.TestCase):
     42             def testNothing(self):
     43                 pass
     44 
     45         class MockResult(object):
     46             errors = []
     47             def addError(self, test, exc_info):
     48                 self.errors.append((test, exc_info))
     49 
     50         result = MockResult()
     51         test = TestableTest('testNothing')
     52         test._resultForDoCleanups = result
     53 
     54         exc1 = Exception('foo')
     55         exc2 = Exception('bar')
     56         def cleanup1():
     57             raise exc1
     58 
     59         def cleanup2():
     60             raise exc2
     61 
     62         test.addCleanup(cleanup1)
     63         test.addCleanup(cleanup2)
     64 
     65         self.assertFalse(test.doCleanups())
     66 
     67         (test1, (Type1, instance1, _)), (test2, (Type2, instance2, _)) = reversed(MockResult.errors)
     68         self.assertEqual((test1, Type1, instance1), (test, Exception, exc1))
     69         self.assertEqual((test2, Type2, instance2), (test, Exception, exc2))
     70 
     71     def testCleanupInRun(self):
     72         blowUp = False
     73         ordering = []
     74 
     75         class TestableTest(unittest.TestCase):
     76             def setUp(self):
     77                 ordering.append('setUp')
     78                 if blowUp:
     79                     raise Exception('foo')
     80 
     81             def testNothing(self):
     82                 ordering.append('test')
     83 
     84             def tearDown(self):
     85                 ordering.append('tearDown')
     86 
     87         test = TestableTest('testNothing')
     88 
     89         def cleanup1():
     90             ordering.append('cleanup1')
     91         def cleanup2():
     92             ordering.append('cleanup2')
     93         test.addCleanup(cleanup1)
     94         test.addCleanup(cleanup2)
     95 
     96         def success(some_test):
     97             self.assertEqual(some_test, test)
     98             ordering.append('success')
     99 
    100         result = unittest.TestResult()
    101         result.addSuccess = success
    102 
    103         test.run(result)
    104         self.assertEqual(ordering, ['setUp', 'test', 'tearDown',
    105                                     'cleanup2', 'cleanup1', 'success'])
    106 
    107         blowUp = True
    108         ordering = []
    109         test = TestableTest('testNothing')
    110         test.addCleanup(cleanup1)
    111         test.run(result)
    112         self.assertEqual(ordering, ['setUp', 'cleanup1'])
    113 
    114     def testTestCaseDebugExecutesCleanups(self):
    115         ordering = []
    116 
    117         class TestableTest(unittest.TestCase):
    118             def setUp(self):
    119                 ordering.append('setUp')
    120                 self.addCleanup(cleanup1)
    121 
    122             def testNothing(self):
    123                 ordering.append('test')
    124 
    125             def tearDown(self):
    126                 ordering.append('tearDown')
    127 
    128         test = TestableTest('testNothing')
    129 
    130         def cleanup1():
    131             ordering.append('cleanup1')
    132             test.addCleanup(cleanup2)
    133         def cleanup2():
    134             ordering.append('cleanup2')
    135 
    136         test.debug()
    137         self.assertEqual(ordering, ['setUp', 'test', 'tearDown', 'cleanup1', 'cleanup2'])
    138 
    139 
    140 class Test_TextTestRunner(unittest.TestCase):
    141     """Tests for TextTestRunner."""
    142 
    143     def test_init(self):
    144         runner = unittest.TextTestRunner()
    145         self.assertFalse(runner.failfast)
    146         self.assertFalse(runner.buffer)
    147         self.assertEqual(runner.verbosity, 1)
    148         self.assertTrue(runner.descriptions)
    149         self.assertEqual(runner.resultclass, unittest.TextTestResult)
    150 
    151 
    152     def testBufferAndFailfast(self):
    153         class Test(unittest.TestCase):
    154             def testFoo(self):
    155                 pass
    156         result = unittest.TestResult()
    157         runner = unittest.TextTestRunner(stream=StringIO(), failfast=True,
    158                                            buffer=True)
    159         # Use our result object

    160         runner._makeResult = lambda: result
    161         runner.run(Test('testFoo'))
    162 
    163         self.assertTrue(result.failfast)
    164         self.assertTrue(result.buffer)
    165 
    166     def testRunnerRegistersResult(self):
    167         class Test(unittest.TestCase):
    168             def testFoo(self):
    169                 pass
    170         originalRegisterResult = unittest.runner.registerResult
    171         def cleanup():
    172             unittest.runner.registerResult = originalRegisterResult
    173         self.addCleanup(cleanup)
    174 
    175         result = unittest.TestResult()
    176         runner = unittest.TextTestRunner(stream=StringIO())
    177         # Use our result object

    178         runner._makeResult = lambda: result
    179 
    180         self.wasRegistered = 0
    181         def fakeRegisterResult(thisResult):
    182             self.wasRegistered += 1
    183             self.assertEqual(thisResult, result)
    184         unittest.runner.registerResult = fakeRegisterResult
    185 
    186         runner.run(unittest.TestSuite())
    187         self.assertEqual(self.wasRegistered, 1)
    188 
    189     def test_works_with_result_without_startTestRun_stopTestRun(self):
    190         class OldTextResult(ResultWithNoStartTestRunStopTestRun):
    191             separator2 = ''
    192             def printErrors(self):
    193                 pass
    194 
    195         class Runner(unittest.TextTestRunner):
    196             def __init__(self):
    197                 super(Runner, self).__init__(StringIO())
    198 
    199             def _makeResult(self):
    200                 return OldTextResult()
    201 
    202         runner = Runner()
    203         runner.run(unittest.TestSuite())
    204 
    205     def test_startTestRun_stopTestRun_called(self):
    206         class LoggingTextResult(LoggingResult):
    207             separator2 = ''
    208             def printErrors(self):
    209                 pass
    210 
    211         class LoggingRunner(unittest.TextTestRunner):
    212             def __init__(self, events):
    213                 super(LoggingRunner, self).__init__(StringIO())
    214                 self._events = events
    215 
    216             def _makeResult(self):
    217                 return LoggingTextResult(self._events)
    218 
    219         events = []
    220         runner = LoggingRunner(events)
    221         runner.run(unittest.TestSuite())
    222         expected = ['startTestRun', 'stopTestRun']
    223         self.assertEqual(events, expected)
    224 
    225     def test_pickle_unpickle(self):
    226         # Issue #7197: a TextTestRunner should be (un)pickleable. This is

    227         # required by test_multiprocessing under Windows (in verbose mode).

    228         from StringIO import StringIO as PickleableIO
    229         # cStringIO objects are not pickleable, but StringIO objects are.

    230         stream = PickleableIO("foo")
    231         runner = unittest.TextTestRunner(stream)
    232         for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
    233             s = pickle.dumps(runner, protocol=protocol)
    234             obj = pickle.loads(s)
    235             # StringIO objects never compare equal, a cheap test instead.

    236             self.assertEqual(obj.stream.getvalue(), stream.getvalue())
    237 
    238     def test_resultclass(self):
    239         def MockResultClass(*args):
    240             return args
    241         STREAM = object()
    242         DESCRIPTIONS = object()
    243         VERBOSITY = object()
    244         runner = unittest.TextTestRunner(STREAM, DESCRIPTIONS, VERBOSITY,
    245                                          resultclass=MockResultClass)
    246         self.assertEqual(runner.resultclass, MockResultClass)
    247 
    248         expectedresult = (runner.stream, DESCRIPTIONS, VERBOSITY)
    249         self.assertEqual(runner._makeResult(), expectedresult)
    250 
    251 
    252 if __name__ == '__main__':
    253     unittest.main()
    254