source: python/trunk/Lib/unittest/test/test_suite.py

Last change on this file was 391, checked in by dmik, 11 years ago

python: Merge vendor 2.7.6 to trunk.

  • Property svn:eol-style set to native
File size: 11.8 KB
Line 
1import unittest
2
3import sys
4from .support import LoggingResult, TestEquality
5
6
7### Support code for Test_TestSuite
8################################################################
9
10class Test(object):
11 class Foo(unittest.TestCase):
12 def test_1(self): pass
13 def test_2(self): pass
14 def test_3(self): pass
15 def runTest(self): pass
16
17def _mk_TestSuite(*names):
18 return unittest.TestSuite(Test.Foo(n) for n in names)
19
20################################################################
21
22
23class Test_TestSuite(unittest.TestCase, TestEquality):
24
25 ### Set up attributes needed by inherited tests
26 ################################################################
27
28 # Used by TestEquality.test_eq
29 eq_pairs = [(unittest.TestSuite(), unittest.TestSuite()),
30 (unittest.TestSuite(), unittest.TestSuite([])),
31 (_mk_TestSuite('test_1'), _mk_TestSuite('test_1'))]
32
33 # Used by TestEquality.test_ne
34 ne_pairs = [(unittest.TestSuite(), _mk_TestSuite('test_1')),
35 (unittest.TestSuite([]), _mk_TestSuite('test_1')),
36 (_mk_TestSuite('test_1', 'test_2'), _mk_TestSuite('test_1', 'test_3')),
37 (_mk_TestSuite('test_1'), _mk_TestSuite('test_2'))]
38
39 ################################################################
40 ### /Set up attributes needed by inherited tests
41
42 ### Tests for TestSuite.__init__
43 ################################################################
44
45 # "class TestSuite([tests])"
46 #
47 # The tests iterable should be optional
48 def test_init__tests_optional(self):
49 suite = unittest.TestSuite()
50
51 self.assertEqual(suite.countTestCases(), 0)
52
53 # "class TestSuite([tests])"
54 # ...
55 # "If tests is given, it must be an iterable of individual test cases
56 # or other test suites that will be used to build the suite initially"
57 #
58 # TestSuite should deal with empty tests iterables by allowing the
59 # creation of an empty suite
60 def test_init__empty_tests(self):
61 suite = unittest.TestSuite([])
62
63 self.assertEqual(suite.countTestCases(), 0)
64
65 # "class TestSuite([tests])"
66 # ...
67 # "If tests is given, it must be an iterable of individual test cases
68 # or other test suites that will be used to build the suite initially"
69 #
70 # TestSuite should allow any iterable to provide tests
71 def test_init__tests_from_any_iterable(self):
72 def tests():
73 yield unittest.FunctionTestCase(lambda: None)
74 yield unittest.FunctionTestCase(lambda: None)
75
76 suite_1 = unittest.TestSuite(tests())
77 self.assertEqual(suite_1.countTestCases(), 2)
78
79 suite_2 = unittest.TestSuite(suite_1)
80 self.assertEqual(suite_2.countTestCases(), 2)
81
82 suite_3 = unittest.TestSuite(set(suite_1))
83 self.assertEqual(suite_3.countTestCases(), 2)
84
85 # "class TestSuite([tests])"
86 # ...
87 # "If tests is given, it must be an iterable of individual test cases
88 # or other test suites that will be used to build the suite initially"
89 #
90 # Does TestSuite() also allow other TestSuite() instances to be present
91 # in the tests iterable?
92 def test_init__TestSuite_instances_in_tests(self):
93 def tests():
94 ftc = unittest.FunctionTestCase(lambda: None)
95 yield unittest.TestSuite([ftc])
96 yield unittest.FunctionTestCase(lambda: None)
97
98 suite = unittest.TestSuite(tests())
99 self.assertEqual(suite.countTestCases(), 2)
100
101 ################################################################
102 ### /Tests for TestSuite.__init__
103
104 # Container types should support the iter protocol
105 def test_iter(self):
106 test1 = unittest.FunctionTestCase(lambda: None)
107 test2 = unittest.FunctionTestCase(lambda: None)
108 suite = unittest.TestSuite((test1, test2))
109
110 self.assertEqual(list(suite), [test1, test2])
111
112 # "Return the number of tests represented by the this test object.
113 # ...this method is also implemented by the TestSuite class, which can
114 # return larger [greater than 1] values"
115 #
116 # Presumably an empty TestSuite returns 0?
117 def test_countTestCases_zero_simple(self):
118 suite = unittest.TestSuite()
119
120 self.assertEqual(suite.countTestCases(), 0)
121
122 # "Return the number of tests represented by the this test object.
123 # ...this method is also implemented by the TestSuite class, which can
124 # return larger [greater than 1] values"
125 #
126 # Presumably an empty TestSuite (even if it contains other empty
127 # TestSuite instances) returns 0?
128 def test_countTestCases_zero_nested(self):
129 class Test1(unittest.TestCase):
130 def test(self):
131 pass
132
133 suite = unittest.TestSuite([unittest.TestSuite()])
134
135 self.assertEqual(suite.countTestCases(), 0)
136
137 # "Return the number of tests represented by the this test object.
138 # ...this method is also implemented by the TestSuite class, which can
139 # return larger [greater than 1] values"
140 def test_countTestCases_simple(self):
141 test1 = unittest.FunctionTestCase(lambda: None)
142 test2 = unittest.FunctionTestCase(lambda: None)
143 suite = unittest.TestSuite((test1, test2))
144
145 self.assertEqual(suite.countTestCases(), 2)
146
147 # "Return the number of tests represented by the this test object.
148 # ...this method is also implemented by the TestSuite class, which can
149 # return larger [greater than 1] values"
150 #
151 # Make sure this holds for nested TestSuite instances, too
152 def test_countTestCases_nested(self):
153 class Test1(unittest.TestCase):
154 def test1(self): pass
155 def test2(self): pass
156
157 test2 = unittest.FunctionTestCase(lambda: None)
158 test3 = unittest.FunctionTestCase(lambda: None)
159 child = unittest.TestSuite((Test1('test2'), test2))
160 parent = unittest.TestSuite((test3, child, Test1('test1')))
161
162 self.assertEqual(parent.countTestCases(), 4)
163
164 # "Run the tests associated with this suite, collecting the result into
165 # the test result object passed as result."
166 #
167 # And if there are no tests? What then?
168 def test_run__empty_suite(self):
169 events = []
170 result = LoggingResult(events)
171
172 suite = unittest.TestSuite()
173
174 suite.run(result)
175
176 self.assertEqual(events, [])
177
178 # "Note that unlike TestCase.run(), TestSuite.run() requires the
179 # "result object to be passed in."
180 def test_run__requires_result(self):
181 suite = unittest.TestSuite()
182
183 try:
184 suite.run()
185 except TypeError:
186 pass
187 else:
188 self.fail("Failed to raise TypeError")
189
190 # "Run the tests associated with this suite, collecting the result into
191 # the test result object passed as result."
192 def test_run(self):
193 events = []
194 result = LoggingResult(events)
195
196 class LoggingCase(unittest.TestCase):
197 def run(self, result):
198 events.append('run %s' % self._testMethodName)
199
200 def test1(self): pass
201 def test2(self): pass
202
203 tests = [LoggingCase('test1'), LoggingCase('test2')]
204
205 unittest.TestSuite(tests).run(result)
206
207 self.assertEqual(events, ['run test1', 'run test2'])
208
209 # "Add a TestCase ... to the suite"
210 def test_addTest__TestCase(self):
211 class Foo(unittest.TestCase):
212 def test(self): pass
213
214 test = Foo('test')
215 suite = unittest.TestSuite()
216
217 suite.addTest(test)
218
219 self.assertEqual(suite.countTestCases(), 1)
220 self.assertEqual(list(suite), [test])
221
222 # "Add a ... TestSuite to the suite"
223 def test_addTest__TestSuite(self):
224 class Foo(unittest.TestCase):
225 def test(self): pass
226
227 suite_2 = unittest.TestSuite([Foo('test')])
228
229 suite = unittest.TestSuite()
230 suite.addTest(suite_2)
231
232 self.assertEqual(suite.countTestCases(), 1)
233 self.assertEqual(list(suite), [suite_2])
234
235 # "Add all the tests from an iterable of TestCase and TestSuite
236 # instances to this test suite."
237 #
238 # "This is equivalent to iterating over tests, calling addTest() for
239 # each element"
240 def test_addTests(self):
241 class Foo(unittest.TestCase):
242 def test_1(self): pass
243 def test_2(self): pass
244
245 test_1 = Foo('test_1')
246 test_2 = Foo('test_2')
247 inner_suite = unittest.TestSuite([test_2])
248
249 def gen():
250 yield test_1
251 yield test_2
252 yield inner_suite
253
254 suite_1 = unittest.TestSuite()
255 suite_1.addTests(gen())
256
257 self.assertEqual(list(suite_1), list(gen()))
258
259 # "This is equivalent to iterating over tests, calling addTest() for
260 # each element"
261 suite_2 = unittest.TestSuite()
262 for t in gen():
263 suite_2.addTest(t)
264
265 self.assertEqual(suite_1, suite_2)
266
267 # "Add all the tests from an iterable of TestCase and TestSuite
268 # instances to this test suite."
269 #
270 # What happens if it doesn't get an iterable?
271 def test_addTest__noniterable(self):
272 suite = unittest.TestSuite()
273
274 try:
275 suite.addTests(5)
276 except TypeError:
277 pass
278 else:
279 self.fail("Failed to raise TypeError")
280
281 def test_addTest__noncallable(self):
282 suite = unittest.TestSuite()
283 self.assertRaises(TypeError, suite.addTest, 5)
284
285 def test_addTest__casesuiteclass(self):
286 suite = unittest.TestSuite()
287 self.assertRaises(TypeError, suite.addTest, Test_TestSuite)
288 self.assertRaises(TypeError, suite.addTest, unittest.TestSuite)
289
290 def test_addTests__string(self):
291 suite = unittest.TestSuite()
292 self.assertRaises(TypeError, suite.addTests, "foo")
293
294 def test_function_in_suite(self):
295 def f(_):
296 pass
297 suite = unittest.TestSuite()
298 suite.addTest(f)
299
300 # when the bug is fixed this line will not crash
301 suite.run(unittest.TestResult())
302
303
304
305 def test_basetestsuite(self):
306 class Test(unittest.TestCase):
307 wasSetUp = False
308 wasTornDown = False
309 @classmethod
310 def setUpClass(cls):
311 cls.wasSetUp = True
312 @classmethod
313 def tearDownClass(cls):
314 cls.wasTornDown = True
315 def testPass(self):
316 pass
317 def testFail(self):
318 fail
319 class Module(object):
320 wasSetUp = False
321 wasTornDown = False
322 @staticmethod
323 def setUpModule():
324 Module.wasSetUp = True
325 @staticmethod
326 def tearDownModule():
327 Module.wasTornDown = True
328
329 Test.__module__ = 'Module'
330 sys.modules['Module'] = Module
331 self.addCleanup(sys.modules.pop, 'Module')
332
333 suite = unittest.BaseTestSuite()
334 suite.addTests([Test('testPass'), Test('testFail')])
335 self.assertEqual(suite.countTestCases(), 2)
336
337 result = unittest.TestResult()
338 suite.run(result)
339 self.assertFalse(Module.wasSetUp)
340 self.assertFalse(Module.wasTornDown)
341 self.assertFalse(Test.wasSetUp)
342 self.assertFalse(Test.wasTornDown)
343 self.assertEqual(len(result.errors), 1)
344 self.assertEqual(len(result.failures), 0)
345 self.assertEqual(result.testsRun, 2)
346
347
348 def test_overriding_call(self):
349 class MySuite(unittest.TestSuite):
350 called = False
351 def __call__(self, *args, **kw):
352 self.called = True
353 unittest.TestSuite.__call__(self, *args, **kw)
354
355 suite = MySuite()
356 result = unittest.TestResult()
357 wrapper = unittest.TestSuite()
358 wrapper.addTest(suite)
359 wrapper(result)
360 self.assertTrue(suite.called)
361
362 # reusing results should be permitted even if abominable
363 self.assertFalse(result._testRunEntered)
364
365
366if __name__ == '__main__':
367 unittest.main()
Note: See TracBrowser for help on using the repository browser.