Merge lp:~tchaypo/testscenarios/testcase-mixin into lp:~testtools-committers/testscenarios/trunk

Proposed by James Polley
Status: Merged
Merged at revision: 20
Proposed branch: lp:~tchaypo/testscenarios/testcase-mixin
Merge into: lp:~testtools-committers/testscenarios/trunk
Diff against target: 192 lines (+141/-4)
3 files modified
lib/testscenarios/__init__.py (+2/-1)
lib/testscenarios/testcase.py (+6/-3)
lib/testscenarios/tests/test_testcase.py (+133/-0)
To merge this branch: bzr merge lp:~tchaypo/testscenarios/testcase-mixin
Reviewer Review Type Date Requested Status
Robert Collins Pending
Review via email: mp+95713@code.launchpad.net

Commit message

Rename TestWithScenarios as MixableTestWithScenarios

Define new class TestWithScenarios, which mixes MixableTestWithScenarios with unittest.TestCase

If unittest2 is importable when running tests, a new class which mixes MixableTestWithScenarios with unittest2.TestCase is created and exercised.

Description of the change

Goal: allow TestWithScenarios to be mixed with any TestCase, not just unittest.TestCase

Implementation:
Rename TestWithScenarios as MixableTestWithScenarios

Define new class TestWithScenarios, which mixes MixableTestWithScenarios with unittest.TestCase

If unittest2 is importable when running tests, a new class which mixes MixableTestWithScenarios with unittest2.TestCase is created and exercised.

To post a comment you must log in.
Revision history for this message
Robert Collins (lifeless) wrote :

Ok, this is broadly fine, module the horrible horrible fact of copy in paste when in fact you want boom-tish to parameterise the tests to test with different unittest base classes.

Martin's module-parameteriser will help with that, so I'll review and merge this after that lands, which will be after testtools gets the needed support. Be a couple of days I imagine.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'lib/testscenarios/__init__.py'
--- lib/testscenarios/__init__.py 2010-10-12 06:57:23 +0000
+++ lib/testscenarios/__init__.py 2012-03-03 01:41:18 +0000
@@ -42,6 +42,7 @@
4242
43__all__ = [43__all__ = [
44 'TestWithScenarios',44 'TestWithScenarios',
45 'MixableTestWithScenarios',
45 'apply_scenario',46 'apply_scenario',
46 'apply_scenarios',47 'apply_scenarios',
47 'generate_scenarios',48 'generate_scenarios',
@@ -58,7 +59,7 @@
58 load_tests_apply_scenarios,59 load_tests_apply_scenarios,
59 multiply_scenarios,60 multiply_scenarios,
60 )61 )
61from testscenarios.testcase import TestWithScenarios62from testscenarios.testcase import TestWithScenarios, MixableTestWithScenarios
6263
6364
64def test_suite():65def test_suite():
6566
=== modified file 'lib/testscenarios/testcase.py'
--- lib/testscenarios/testcase.py 2009-12-19 03:09:14 +0000
+++ lib/testscenarios/testcase.py 2012-03-03 01:41:18 +0000
@@ -24,7 +24,7 @@
2424
25from testscenarios.scenarios import generate_scenarios25from testscenarios.scenarios import generate_scenarios
2626
27class TestWithScenarios(unittest.TestCase):27class MixableTestWithScenarios(object):
28 """A TestCase with support for scenarios via a scenarios attribute.28 """A TestCase with support for scenarios via a scenarios attribute.
29 29
30 When a test object which is an instance of TestWithScenarios is run,30 When a test object which is an instance of TestWithScenarios is run,
@@ -50,7 +50,7 @@
50 for test in generate_scenarios(self):50 for test in generate_scenarios(self):
51 test.debug()51 test.debug()
52 else:52 else:
53 return super(TestWithScenarios, self).debug()53 return super(MixableTestWithScenarios, self).debug()
5454
55 def run(self, result=None):55 def run(self, result=None):
56 scenarios = self._get_scenarios()56 scenarios = self._get_scenarios()
@@ -59,4 +59,7 @@
59 test.run(result)59 test.run(result)
60 return60 return
61 else:61 else:
62 return super(TestWithScenarios, self).run(result)62 return super(MixableTestWithScenarios, self).run(result)
63
64class TestWithScenarios(MixableTestWithScenarios, unittest.TestCase):
65 pass
6366
=== modified file 'lib/testscenarios/tests/test_testcase.py'
--- lib/testscenarios/tests/test_testcase.py 2009-12-19 03:09:14 +0000
+++ lib/testscenarios/tests/test_testcase.py 2012-03-03 01:41:18 +0000
@@ -143,3 +143,136 @@
143 self.assertEqual(None, log[0].scenarios)143 self.assertEqual(None, log[0].scenarios)
144 self.assertEqual(None, log[1].scenarios)144 self.assertEqual(None, log[1].scenarios)
145 self.assertNotEqual(log[0].id(), log[1].id())145 self.assertNotEqual(log[0].id(), log[1].id())
146
147try:
148 import unittest2
149 class TestWithScenariosWithUnittest2(testscenarios.MixableTestWithScenarios, unittest2.TestCase):
150 pass
151
152 class TestTestWithScenariosWithInittest2(unittest.TestCase):
153
154 def test_no_scenarios_no_error(self):
155 class ReferenceTest(TestWithScenariosWithUnittest2):
156 def test_pass(self):
157 pass
158 test = ReferenceTest("test_pass")
159 result = unittest.TestResult()
160 test.run(result)
161 self.assertTrue(result.wasSuccessful())
162 self.assertEqual(1, result.testsRun)
163
164 def test_with_one_scenario_one_run(self):
165 class ReferenceTest(TestWithScenariosWithUnittest2):
166 scenarios = [('demo', {})]
167 def test_pass(self):
168 pass
169 test = ReferenceTest("test_pass")
170 log = []
171 result = LoggingResult(log)
172 test.run(result)
173 self.assertTrue(result.wasSuccessful())
174 self.assertEqual(1, result.testsRun)
175 self.assertEqual(
176 'testscenarios.tests.test_testcase.ReferenceTest.test_pass(demo)',
177 log[0][1].id())
178
179 def test_with_two_scenarios_two_run(self):
180 class ReferenceTest(TestWithScenariosWithUnittest2):
181 scenarios = [('1', {}), ('2', {})]
182 def test_pass(self):
183 pass
184 test = ReferenceTest("test_pass")
185 log = []
186 result = LoggingResult(log)
187 test.run(result)
188 self.assertTrue(result.wasSuccessful())
189 self.assertEqual(2, result.testsRun)
190 self.assertEqual(
191 'testscenarios.tests.test_testcase.ReferenceTest.test_pass(1)',
192 log[0][1].id())
193 self.assertEqual(
194 'testscenarios.tests.test_testcase.ReferenceTest.test_pass(2)',
195 log[4][1].id())
196
197 def test_attributes_set(self):
198 class ReferenceTest(TestWithScenariosWithUnittest2):
199 scenarios = [
200 ('1', {'foo': 1, 'bar': 2}),
201 ('2', {'foo': 2, 'bar': 4})]
202 def test_check_foo(self):
203 self.assertEqual(self.foo * 2, self.bar)
204 test = ReferenceTest("test_check_foo")
205 log = []
206 result = LoggingResult(log)
207 test.run(result)
208 self.assertTrue(result.wasSuccessful())
209 self.assertEqual(2, result.testsRun)
210
211 def test_scenarios_attribute_cleared(self):
212 class ReferenceTest(TestWithScenariosWithUnittest2):
213 scenarios = [
214 ('1', {'foo': 1, 'bar': 2}),
215 ('2', {'foo': 2, 'bar': 4})]
216 def test_check_foo(self):
217 self.assertEqual(self.foo * 2, self.bar)
218 test = ReferenceTest("test_check_foo")
219 log = []
220 result = LoggingResult(log)
221 test.run(result)
222 self.assertTrue(result.wasSuccessful())
223 self.assertEqual(2, result.testsRun)
224 self.assertNotEqual(None, test.scenarios)
225 self.assertEqual(None, log[0][1].scenarios)
226 self.assertEqual(None, log[4][1].scenarios)
227
228 def test_countTestCases_no_scenarios(self):
229 class ReferenceTest(TestWithScenariosWithUnittest2):
230 def test_check_foo(self):
231 pass
232 test = ReferenceTest("test_check_foo")
233 self.assertEqual(1, test.countTestCases())
234
235 def test_countTestCases_empty_scenarios(self):
236 class ReferenceTest(TestWithScenariosWithUnittest2):
237 scenarios = []
238 def test_check_foo(self):
239 pass
240 test = ReferenceTest("test_check_foo")
241 self.assertEqual(1, test.countTestCases())
242
243 def test_countTestCases_1_scenarios(self):
244 class ReferenceTest(TestWithScenariosWithUnittest2):
245 scenarios = [('1', {'foo': 1, 'bar': 2})]
246 def test_check_foo(self):
247 pass
248 test = ReferenceTest("test_check_foo")
249 self.assertEqual(1, test.countTestCases())
250
251 def test_countTestCases_2_scenarios(self):
252 class ReferenceTest(TestWithScenariosWithUnittest2):
253 scenarios = [
254 ('1', {'foo': 1, 'bar': 2}),
255 ('2', {'foo': 2, 'bar': 4})]
256 def test_check_foo(self):
257 pass
258 test = ReferenceTest("test_check_foo")
259 self.assertEqual(2, test.countTestCases())
260
261 def test_debug_2_scenarios(self):
262 log = []
263 class ReferenceTest(TestWithScenariosWithUnittest2):
264 scenarios = [
265 ('1', {'foo': 1, 'bar': 2}),
266 ('2', {'foo': 2, 'bar': 4})]
267 def test_check_foo(self):
268 log.append(self)
269 test = ReferenceTest("test_check_foo")
270 test.debug()
271 self.assertEqual(2, len(log))
272 self.assertEqual(None, log[0].scenarios)
273 self.assertEqual(None, log[1].scenarios)
274 self.assertNotEqual(log[0].id(), log[1].id())
275
276
277except ImportError:
278 pass

Subscribers

People subscribed via source and target branches