]>
Commit | Line | Data |
---|---|---|
4710c53d | 1 | import sys\r |
2 | \r | |
3 | from cStringIO import StringIO\r | |
4 | \r | |
5 | import unittest\r | |
6 | \r | |
7 | \r | |
8 | def resultFactory(*_):\r | |
9 | return unittest.TestResult()\r | |
10 | \r | |
11 | \r | |
12 | class TestSetups(unittest.TestCase):\r | |
13 | \r | |
14 | def getRunner(self):\r | |
15 | return unittest.TextTestRunner(resultclass=resultFactory,\r | |
16 | stream=StringIO())\r | |
17 | def runTests(self, *cases):\r | |
18 | suite = unittest.TestSuite()\r | |
19 | for case in cases:\r | |
20 | tests = unittest.defaultTestLoader.loadTestsFromTestCase(case)\r | |
21 | suite.addTests(tests)\r | |
22 | \r | |
23 | runner = self.getRunner()\r | |
24 | \r | |
25 | # creating a nested suite exposes some potential bugs\r | |
26 | realSuite = unittest.TestSuite()\r | |
27 | realSuite.addTest(suite)\r | |
28 | # adding empty suites to the end exposes potential bugs\r | |
29 | suite.addTest(unittest.TestSuite())\r | |
30 | realSuite.addTest(unittest.TestSuite())\r | |
31 | return runner.run(realSuite)\r | |
32 | \r | |
33 | def test_setup_class(self):\r | |
34 | class Test(unittest.TestCase):\r | |
35 | setUpCalled = 0\r | |
36 | @classmethod\r | |
37 | def setUpClass(cls):\r | |
38 | Test.setUpCalled += 1\r | |
39 | unittest.TestCase.setUpClass()\r | |
40 | def test_one(self):\r | |
41 | pass\r | |
42 | def test_two(self):\r | |
43 | pass\r | |
44 | \r | |
45 | result = self.runTests(Test)\r | |
46 | \r | |
47 | self.assertEqual(Test.setUpCalled, 1)\r | |
48 | self.assertEqual(result.testsRun, 2)\r | |
49 | self.assertEqual(len(result.errors), 0)\r | |
50 | \r | |
51 | def test_teardown_class(self):\r | |
52 | class Test(unittest.TestCase):\r | |
53 | tearDownCalled = 0\r | |
54 | @classmethod\r | |
55 | def tearDownClass(cls):\r | |
56 | Test.tearDownCalled += 1\r | |
57 | unittest.TestCase.tearDownClass()\r | |
58 | def test_one(self):\r | |
59 | pass\r | |
60 | def test_two(self):\r | |
61 | pass\r | |
62 | \r | |
63 | result = self.runTests(Test)\r | |
64 | \r | |
65 | self.assertEqual(Test.tearDownCalled, 1)\r | |
66 | self.assertEqual(result.testsRun, 2)\r | |
67 | self.assertEqual(len(result.errors), 0)\r | |
68 | \r | |
69 | def test_teardown_class_two_classes(self):\r | |
70 | class Test(unittest.TestCase):\r | |
71 | tearDownCalled = 0\r | |
72 | @classmethod\r | |
73 | def tearDownClass(cls):\r | |
74 | Test.tearDownCalled += 1\r | |
75 | unittest.TestCase.tearDownClass()\r | |
76 | def test_one(self):\r | |
77 | pass\r | |
78 | def test_two(self):\r | |
79 | pass\r | |
80 | \r | |
81 | class Test2(unittest.TestCase):\r | |
82 | tearDownCalled = 0\r | |
83 | @classmethod\r | |
84 | def tearDownClass(cls):\r | |
85 | Test2.tearDownCalled += 1\r | |
86 | unittest.TestCase.tearDownClass()\r | |
87 | def test_one(self):\r | |
88 | pass\r | |
89 | def test_two(self):\r | |
90 | pass\r | |
91 | \r | |
92 | result = self.runTests(Test, Test2)\r | |
93 | \r | |
94 | self.assertEqual(Test.tearDownCalled, 1)\r | |
95 | self.assertEqual(Test2.tearDownCalled, 1)\r | |
96 | self.assertEqual(result.testsRun, 4)\r | |
97 | self.assertEqual(len(result.errors), 0)\r | |
98 | \r | |
99 | def test_error_in_setupclass(self):\r | |
100 | class BrokenTest(unittest.TestCase):\r | |
101 | @classmethod\r | |
102 | def setUpClass(cls):\r | |
103 | raise TypeError('foo')\r | |
104 | def test_one(self):\r | |
105 | pass\r | |
106 | def test_two(self):\r | |
107 | pass\r | |
108 | \r | |
109 | result = self.runTests(BrokenTest)\r | |
110 | \r | |
111 | self.assertEqual(result.testsRun, 0)\r | |
112 | self.assertEqual(len(result.errors), 1)\r | |
113 | error, _ = result.errors[0]\r | |
114 | self.assertEqual(str(error),\r | |
115 | 'setUpClass (%s.BrokenTest)' % __name__)\r | |
116 | \r | |
117 | def test_error_in_teardown_class(self):\r | |
118 | class Test(unittest.TestCase):\r | |
119 | tornDown = 0\r | |
120 | @classmethod\r | |
121 | def tearDownClass(cls):\r | |
122 | Test.tornDown += 1\r | |
123 | raise TypeError('foo')\r | |
124 | def test_one(self):\r | |
125 | pass\r | |
126 | def test_two(self):\r | |
127 | pass\r | |
128 | \r | |
129 | class Test2(unittest.TestCase):\r | |
130 | tornDown = 0\r | |
131 | @classmethod\r | |
132 | def tearDownClass(cls):\r | |
133 | Test2.tornDown += 1\r | |
134 | raise TypeError('foo')\r | |
135 | def test_one(self):\r | |
136 | pass\r | |
137 | def test_two(self):\r | |
138 | pass\r | |
139 | \r | |
140 | result = self.runTests(Test, Test2)\r | |
141 | self.assertEqual(result.testsRun, 4)\r | |
142 | self.assertEqual(len(result.errors), 2)\r | |
143 | self.assertEqual(Test.tornDown, 1)\r | |
144 | self.assertEqual(Test2.tornDown, 1)\r | |
145 | \r | |
146 | error, _ = result.errors[0]\r | |
147 | self.assertEqual(str(error),\r | |
148 | 'tearDownClass (%s.Test)' % __name__)\r | |
149 | \r | |
150 | def test_class_not_torndown_when_setup_fails(self):\r | |
151 | class Test(unittest.TestCase):\r | |
152 | tornDown = False\r | |
153 | @classmethod\r | |
154 | def setUpClass(cls):\r | |
155 | raise TypeError\r | |
156 | @classmethod\r | |
157 | def tearDownClass(cls):\r | |
158 | Test.tornDown = True\r | |
159 | raise TypeError('foo')\r | |
160 | def test_one(self):\r | |
161 | pass\r | |
162 | \r | |
163 | self.runTests(Test)\r | |
164 | self.assertFalse(Test.tornDown)\r | |
165 | \r | |
166 | def test_class_not_setup_or_torndown_when_skipped(self):\r | |
167 | class Test(unittest.TestCase):\r | |
168 | classSetUp = False\r | |
169 | tornDown = False\r | |
170 | @classmethod\r | |
171 | def setUpClass(cls):\r | |
172 | Test.classSetUp = True\r | |
173 | @classmethod\r | |
174 | def tearDownClass(cls):\r | |
175 | Test.tornDown = True\r | |
176 | def test_one(self):\r | |
177 | pass\r | |
178 | \r | |
179 | Test = unittest.skip("hop")(Test)\r | |
180 | self.runTests(Test)\r | |
181 | self.assertFalse(Test.classSetUp)\r | |
182 | self.assertFalse(Test.tornDown)\r | |
183 | \r | |
184 | def test_setup_teardown_order_with_pathological_suite(self):\r | |
185 | results = []\r | |
186 | \r | |
187 | class Module1(object):\r | |
188 | @staticmethod\r | |
189 | def setUpModule():\r | |
190 | results.append('Module1.setUpModule')\r | |
191 | @staticmethod\r | |
192 | def tearDownModule():\r | |
193 | results.append('Module1.tearDownModule')\r | |
194 | \r | |
195 | class Module2(object):\r | |
196 | @staticmethod\r | |
197 | def setUpModule():\r | |
198 | results.append('Module2.setUpModule')\r | |
199 | @staticmethod\r | |
200 | def tearDownModule():\r | |
201 | results.append('Module2.tearDownModule')\r | |
202 | \r | |
203 | class Test1(unittest.TestCase):\r | |
204 | @classmethod\r | |
205 | def setUpClass(cls):\r | |
206 | results.append('setup 1')\r | |
207 | @classmethod\r | |
208 | def tearDownClass(cls):\r | |
209 | results.append('teardown 1')\r | |
210 | def testOne(self):\r | |
211 | results.append('Test1.testOne')\r | |
212 | def testTwo(self):\r | |
213 | results.append('Test1.testTwo')\r | |
214 | \r | |
215 | class Test2(unittest.TestCase):\r | |
216 | @classmethod\r | |
217 | def setUpClass(cls):\r | |
218 | results.append('setup 2')\r | |
219 | @classmethod\r | |
220 | def tearDownClass(cls):\r | |
221 | results.append('teardown 2')\r | |
222 | def testOne(self):\r | |
223 | results.append('Test2.testOne')\r | |
224 | def testTwo(self):\r | |
225 | results.append('Test2.testTwo')\r | |
226 | \r | |
227 | class Test3(unittest.TestCase):\r | |
228 | @classmethod\r | |
229 | def setUpClass(cls):\r | |
230 | results.append('setup 3')\r | |
231 | @classmethod\r | |
232 | def tearDownClass(cls):\r | |
233 | results.append('teardown 3')\r | |
234 | def testOne(self):\r | |
235 | results.append('Test3.testOne')\r | |
236 | def testTwo(self):\r | |
237 | results.append('Test3.testTwo')\r | |
238 | \r | |
239 | Test1.__module__ = Test2.__module__ = 'Module'\r | |
240 | Test3.__module__ = 'Module2'\r | |
241 | sys.modules['Module'] = Module1\r | |
242 | sys.modules['Module2'] = Module2\r | |
243 | \r | |
244 | first = unittest.TestSuite((Test1('testOne'),))\r | |
245 | second = unittest.TestSuite((Test1('testTwo'),))\r | |
246 | third = unittest.TestSuite((Test2('testOne'),))\r | |
247 | fourth = unittest.TestSuite((Test2('testTwo'),))\r | |
248 | fifth = unittest.TestSuite((Test3('testOne'),))\r | |
249 | sixth = unittest.TestSuite((Test3('testTwo'),))\r | |
250 | suite = unittest.TestSuite((first, second, third, fourth, fifth, sixth))\r | |
251 | \r | |
252 | runner = self.getRunner()\r | |
253 | result = runner.run(suite)\r | |
254 | self.assertEqual(result.testsRun, 6)\r | |
255 | self.assertEqual(len(result.errors), 0)\r | |
256 | \r | |
257 | self.assertEqual(results,\r | |
258 | ['Module1.setUpModule', 'setup 1',\r | |
259 | 'Test1.testOne', 'Test1.testTwo', 'teardown 1',\r | |
260 | 'setup 2', 'Test2.testOne', 'Test2.testTwo',\r | |
261 | 'teardown 2', 'Module1.tearDownModule',\r | |
262 | 'Module2.setUpModule', 'setup 3',\r | |
263 | 'Test3.testOne', 'Test3.testTwo',\r | |
264 | 'teardown 3', 'Module2.tearDownModule'])\r | |
265 | \r | |
266 | def test_setup_module(self):\r | |
267 | class Module(object):\r | |
268 | moduleSetup = 0\r | |
269 | @staticmethod\r | |
270 | def setUpModule():\r | |
271 | Module.moduleSetup += 1\r | |
272 | \r | |
273 | class Test(unittest.TestCase):\r | |
274 | def test_one(self):\r | |
275 | pass\r | |
276 | def test_two(self):\r | |
277 | pass\r | |
278 | Test.__module__ = 'Module'\r | |
279 | sys.modules['Module'] = Module\r | |
280 | \r | |
281 | result = self.runTests(Test)\r | |
282 | self.assertEqual(Module.moduleSetup, 1)\r | |
283 | self.assertEqual(result.testsRun, 2)\r | |
284 | self.assertEqual(len(result.errors), 0)\r | |
285 | \r | |
286 | def test_error_in_setup_module(self):\r | |
287 | class Module(object):\r | |
288 | moduleSetup = 0\r | |
289 | moduleTornDown = 0\r | |
290 | @staticmethod\r | |
291 | def setUpModule():\r | |
292 | Module.moduleSetup += 1\r | |
293 | raise TypeError('foo')\r | |
294 | @staticmethod\r | |
295 | def tearDownModule():\r | |
296 | Module.moduleTornDown += 1\r | |
297 | \r | |
298 | class Test(unittest.TestCase):\r | |
299 | classSetUp = False\r | |
300 | classTornDown = False\r | |
301 | @classmethod\r | |
302 | def setUpClass(cls):\r | |
303 | Test.classSetUp = True\r | |
304 | @classmethod\r | |
305 | def tearDownClass(cls):\r | |
306 | Test.classTornDown = True\r | |
307 | def test_one(self):\r | |
308 | pass\r | |
309 | def test_two(self):\r | |
310 | pass\r | |
311 | \r | |
312 | class Test2(unittest.TestCase):\r | |
313 | def test_one(self):\r | |
314 | pass\r | |
315 | def test_two(self):\r | |
316 | pass\r | |
317 | Test.__module__ = 'Module'\r | |
318 | Test2.__module__ = 'Module'\r | |
319 | sys.modules['Module'] = Module\r | |
320 | \r | |
321 | result = self.runTests(Test, Test2)\r | |
322 | self.assertEqual(Module.moduleSetup, 1)\r | |
323 | self.assertEqual(Module.moduleTornDown, 0)\r | |
324 | self.assertEqual(result.testsRun, 0)\r | |
325 | self.assertFalse(Test.classSetUp)\r | |
326 | self.assertFalse(Test.classTornDown)\r | |
327 | self.assertEqual(len(result.errors), 1)\r | |
328 | error, _ = result.errors[0]\r | |
329 | self.assertEqual(str(error), 'setUpModule (Module)')\r | |
330 | \r | |
331 | def test_testcase_with_missing_module(self):\r | |
332 | class Test(unittest.TestCase):\r | |
333 | def test_one(self):\r | |
334 | pass\r | |
335 | def test_two(self):\r | |
336 | pass\r | |
337 | Test.__module__ = 'Module'\r | |
338 | sys.modules.pop('Module', None)\r | |
339 | \r | |
340 | result = self.runTests(Test)\r | |
341 | self.assertEqual(result.testsRun, 2)\r | |
342 | \r | |
343 | def test_teardown_module(self):\r | |
344 | class Module(object):\r | |
345 | moduleTornDown = 0\r | |
346 | @staticmethod\r | |
347 | def tearDownModule():\r | |
348 | Module.moduleTornDown += 1\r | |
349 | \r | |
350 | class Test(unittest.TestCase):\r | |
351 | def test_one(self):\r | |
352 | pass\r | |
353 | def test_two(self):\r | |
354 | pass\r | |
355 | Test.__module__ = 'Module'\r | |
356 | sys.modules['Module'] = Module\r | |
357 | \r | |
358 | result = self.runTests(Test)\r | |
359 | self.assertEqual(Module.moduleTornDown, 1)\r | |
360 | self.assertEqual(result.testsRun, 2)\r | |
361 | self.assertEqual(len(result.errors), 0)\r | |
362 | \r | |
363 | def test_error_in_teardown_module(self):\r | |
364 | class Module(object):\r | |
365 | moduleTornDown = 0\r | |
366 | @staticmethod\r | |
367 | def tearDownModule():\r | |
368 | Module.moduleTornDown += 1\r | |
369 | raise TypeError('foo')\r | |
370 | \r | |
371 | class Test(unittest.TestCase):\r | |
372 | classSetUp = False\r | |
373 | classTornDown = False\r | |
374 | @classmethod\r | |
375 | def setUpClass(cls):\r | |
376 | Test.classSetUp = True\r | |
377 | @classmethod\r | |
378 | def tearDownClass(cls):\r | |
379 | Test.classTornDown = True\r | |
380 | def test_one(self):\r | |
381 | pass\r | |
382 | def test_two(self):\r | |
383 | pass\r | |
384 | \r | |
385 | class Test2(unittest.TestCase):\r | |
386 | def test_one(self):\r | |
387 | pass\r | |
388 | def test_two(self):\r | |
389 | pass\r | |
390 | Test.__module__ = 'Module'\r | |
391 | Test2.__module__ = 'Module'\r | |
392 | sys.modules['Module'] = Module\r | |
393 | \r | |
394 | result = self.runTests(Test, Test2)\r | |
395 | self.assertEqual(Module.moduleTornDown, 1)\r | |
396 | self.assertEqual(result.testsRun, 4)\r | |
397 | self.assertTrue(Test.classSetUp)\r | |
398 | self.assertTrue(Test.classTornDown)\r | |
399 | self.assertEqual(len(result.errors), 1)\r | |
400 | error, _ = result.errors[0]\r | |
401 | self.assertEqual(str(error), 'tearDownModule (Module)')\r | |
402 | \r | |
403 | def test_skiptest_in_setupclass(self):\r | |
404 | class Test(unittest.TestCase):\r | |
405 | @classmethod\r | |
406 | def setUpClass(cls):\r | |
407 | raise unittest.SkipTest('foo')\r | |
408 | def test_one(self):\r | |
409 | pass\r | |
410 | def test_two(self):\r | |
411 | pass\r | |
412 | \r | |
413 | result = self.runTests(Test)\r | |
414 | self.assertEqual(result.testsRun, 0)\r | |
415 | self.assertEqual(len(result.errors), 0)\r | |
416 | self.assertEqual(len(result.skipped), 1)\r | |
417 | skipped = result.skipped[0][0]\r | |
418 | self.assertEqual(str(skipped), 'setUpClass (%s.Test)' % __name__)\r | |
419 | \r | |
420 | def test_skiptest_in_setupmodule(self):\r | |
421 | class Test(unittest.TestCase):\r | |
422 | def test_one(self):\r | |
423 | pass\r | |
424 | def test_two(self):\r | |
425 | pass\r | |
426 | \r | |
427 | class Module(object):\r | |
428 | @staticmethod\r | |
429 | def setUpModule():\r | |
430 | raise unittest.SkipTest('foo')\r | |
431 | \r | |
432 | Test.__module__ = 'Module'\r | |
433 | sys.modules['Module'] = Module\r | |
434 | \r | |
435 | result = self.runTests(Test)\r | |
436 | self.assertEqual(result.testsRun, 0)\r | |
437 | self.assertEqual(len(result.errors), 0)\r | |
438 | self.assertEqual(len(result.skipped), 1)\r | |
439 | skipped = result.skipped[0][0]\r | |
440 | self.assertEqual(str(skipped), 'setUpModule (Module)')\r | |
441 | \r | |
442 | def test_suite_debug_executes_setups_and_teardowns(self):\r | |
443 | ordering = []\r | |
444 | \r | |
445 | class Module(object):\r | |
446 | @staticmethod\r | |
447 | def setUpModule():\r | |
448 | ordering.append('setUpModule')\r | |
449 | @staticmethod\r | |
450 | def tearDownModule():\r | |
451 | ordering.append('tearDownModule')\r | |
452 | \r | |
453 | class Test(unittest.TestCase):\r | |
454 | @classmethod\r | |
455 | def setUpClass(cls):\r | |
456 | ordering.append('setUpClass')\r | |
457 | @classmethod\r | |
458 | def tearDownClass(cls):\r | |
459 | ordering.append('tearDownClass')\r | |
460 | def test_something(self):\r | |
461 | ordering.append('test_something')\r | |
462 | \r | |
463 | Test.__module__ = 'Module'\r | |
464 | sys.modules['Module'] = Module\r | |
465 | \r | |
466 | suite = unittest.defaultTestLoader.loadTestsFromTestCase(Test)\r | |
467 | suite.debug()\r | |
468 | expectedOrder = ['setUpModule', 'setUpClass', 'test_something', 'tearDownClass', 'tearDownModule']\r | |
469 | self.assertEqual(ordering, expectedOrder)\r | |
470 | \r | |
471 | def test_suite_debug_propagates_exceptions(self):\r | |
472 | class Module(object):\r | |
473 | @staticmethod\r | |
474 | def setUpModule():\r | |
475 | if phase == 0:\r | |
476 | raise Exception('setUpModule')\r | |
477 | @staticmethod\r | |
478 | def tearDownModule():\r | |
479 | if phase == 1:\r | |
480 | raise Exception('tearDownModule')\r | |
481 | \r | |
482 | class Test(unittest.TestCase):\r | |
483 | @classmethod\r | |
484 | def setUpClass(cls):\r | |
485 | if phase == 2:\r | |
486 | raise Exception('setUpClass')\r | |
487 | @classmethod\r | |
488 | def tearDownClass(cls):\r | |
489 | if phase == 3:\r | |
490 | raise Exception('tearDownClass')\r | |
491 | def test_something(self):\r | |
492 | if phase == 4:\r | |
493 | raise Exception('test_something')\r | |
494 | \r | |
495 | Test.__module__ = 'Module'\r | |
496 | sys.modules['Module'] = Module\r | |
497 | \r | |
498 | _suite = unittest.defaultTestLoader.loadTestsFromTestCase(Test)\r | |
499 | suite = unittest.TestSuite()\r | |
500 | suite.addTest(_suite)\r | |
501 | \r | |
502 | messages = ('setUpModule', 'tearDownModule', 'setUpClass', 'tearDownClass', 'test_something')\r | |
503 | for phase, msg in enumerate(messages):\r | |
504 | with self.assertRaisesRegexp(Exception, msg):\r | |
505 | suite.debug()\r | |
506 | \r | |
507 | if __name__ == '__main__':\r | |
508 | unittest.main()\r |