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__':