3
from cStringIO import StringIO
6
from .support import LoggingResult, ResultWithNoStartTestRunStopTestRun
9
class TestCleanUp(unittest.TestCase):
11
def testCleanUp(self):
12
class TestableTest(unittest.TestCase):
13
def testNothing(self):
16
test = TestableTest('testNothing')
17
self.assertEqual(test._cleanups, [])
21
def cleanup1(*args, **kwargs):
22
cleanups.append((1, args, kwargs))
24
def cleanup2(*args, **kwargs):
25
cleanups.append((2, args, kwargs))
27
test.addCleanup(cleanup1, 1, 2, 3, four='hello', five='goodbye')
28
test.addCleanup(cleanup2)
30
self.assertEqual(test._cleanups,
31
[(cleanup1, (1, 2, 3), dict(four='hello', five='goodbye')),
34
result = test.doCleanups()
35
self.assertTrue(result)
37
self.assertEqual(cleanups, [(2, (), {}), (1, (1, 2, 3),
38
dict(four='hello', five='goodbye'))])
40
def testCleanUpWithErrors(self):
41
class TestableTest(unittest.TestCase):
42
def testNothing(self):
45
class MockResult(object):
47
def addError(self, test, exc_info):
48
self.errors.append((test, exc_info))
51
test = TestableTest('testNothing')
52
test._resultForDoCleanups = result
54
exc1 = Exception('foo')
55
exc2 = Exception('bar')
62
test.addCleanup(cleanup1)
63
test.addCleanup(cleanup2)
65
self.assertFalse(test.doCleanups())
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))
71
def testCleanupInRun(self):
75
class TestableTest(unittest.TestCase):
77
ordering.append('setUp')
79
raise Exception('foo')
81
def testNothing(self):
82
ordering.append('test')
85
ordering.append('tearDown')
87
test = TestableTest('testNothing')
90
ordering.append('cleanup1')
92
ordering.append('cleanup2')
93
test.addCleanup(cleanup1)
94
test.addCleanup(cleanup2)
96
def success(some_test):
97
self.assertEqual(some_test, test)
98
ordering.append('success')
100
result = unittest.TestResult()
101
result.addSuccess = success
104
self.assertEqual(ordering, ['setUp', 'test', 'tearDown',
105
'cleanup2', 'cleanup1', 'success'])
109
test = TestableTest('testNothing')
110
test.addCleanup(cleanup1)
112
self.assertEqual(ordering, ['setUp', 'cleanup1'])
114
def testTestCaseDebugExecutesCleanups(self):
117
class TestableTest(unittest.TestCase):
119
ordering.append('setUp')
120
self.addCleanup(cleanup1)
122
def testNothing(self):
123
ordering.append('test')
126
ordering.append('tearDown')
128
test = TestableTest('testNothing')
131
ordering.append('cleanup1')
132
test.addCleanup(cleanup2)
134
ordering.append('cleanup2')
137
self.assertEqual(ordering, ['setUp', 'test', 'tearDown', 'cleanup1', 'cleanup2'])
140
class Test_TextTestRunner(unittest.TestCase):
141
"""Tests for TextTestRunner."""
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)
152
def testBufferAndFailfast(self):
153
class Test(unittest.TestCase):
156
result = unittest.TestResult()
157
runner = unittest.TextTestRunner(stream=StringIO(), failfast=True,
159
# Use our result object
160
runner._makeResult = lambda: result
161
runner.run(Test('testFoo'))
163
self.assertTrue(result.failfast)
164
self.assertTrue(result.buffer)
166
def testRunnerRegistersResult(self):
167
class Test(unittest.TestCase):
170
originalRegisterResult = unittest.runner.registerResult
172
unittest.runner.registerResult = originalRegisterResult
173
self.addCleanup(cleanup)
175
result = unittest.TestResult()
176
runner = unittest.TextTestRunner(stream=StringIO())
177
# Use our result object
178
runner._makeResult = lambda: result
180
self.wasRegistered = 0
181
def fakeRegisterResult(thisResult):
182
self.wasRegistered += 1
183
self.assertEqual(thisResult, result)
184
unittest.runner.registerResult = fakeRegisterResult
186
runner.run(unittest.TestSuite())
187
self.assertEqual(self.wasRegistered, 1)
189
def test_works_with_result_without_startTestRun_stopTestRun(self):
190
class OldTextResult(ResultWithNoStartTestRunStopTestRun):
192
def printErrors(self):
195
class Runner(unittest.TextTestRunner):
197
super(Runner, self).__init__(StringIO())
199
def _makeResult(self):
200
return OldTextResult()
203
runner.run(unittest.TestSuite())
205
def test_startTestRun_stopTestRun_called(self):
206
class LoggingTextResult(LoggingResult):
208
def printErrors(self):
211
class LoggingRunner(unittest.TextTestRunner):
212
def __init__(self, events):
213
super(LoggingRunner, self).__init__(StringIO())
214
self._events = events
216
def _makeResult(self):
217
return LoggingTextResult(self._events)
220
runner = LoggingRunner(events)
221
runner.run(unittest.TestSuite())
222
expected = ['startTestRun', 'stopTestRun']
223
self.assertEqual(events, expected)
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())
238
def test_resultclass(self):
239
def MockResultClass(*args):
242
DESCRIPTIONS = object()
244
runner = unittest.TextTestRunner(STREAM, DESCRIPTIONS, VERBOSITY,
245
resultclass=MockResultClass)
246
self.assertEqual(runner.resultclass, MockResultClass)
248
expectedresult = (runner.stream, DESCRIPTIONS, VERBOSITY)
249
self.assertEqual(runner._makeResult(), expectedresult)
252
if __name__ == '__main__':