Merge lp:~jml/testtools/skip-dont-elide into lp:~testtools-committers/testtools/trunk

Proposed by Jonathan Lange
Status: Merged
Merged at revision: 140
Proposed branch: lp:~jml/testtools/skip-dont-elide
Merge into: lp:~testtools-committers/testtools/trunk
Diff against target: 434 lines (+94/-93)
4 files modified
testtools/tests/__init__.py (+6/-20)
testtools/tests/test_deferredruntest.py (+25/-19)
testtools/tests/test_fixturesupport.py (+9/-3)
testtools/tests/test_spinner.py (+54/-51)
To merge this branch: bzr merge lp:~jml/testtools/skip-dont-elide
Reviewer Review Type Date Requested Status
testtools developers Pending
Review via email: mp+42003@code.launchpad.net

Description of the change

This branch makes all of the tests that rely on fixtures or Twisted skip instead of not being included in the test run in the first place.

I don't know if there's a nicer way to do this.

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

Seems fine enough to me.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'testtools/tests/__init__.py'
2--- testtools/tests/__init__.py 2010-10-31 18:14:24 +0000
3+++ testtools/tests/__init__.py 2010-11-27 11:31:58 +0000
4@@ -10,10 +10,13 @@
5 test_compat,
6 test_content,
7 test_content_type,
8+ test_deferredruntest,
9+ test_fixturesupport,
10 test_helpers,
11 test_matchers,
12 test_monkey,
13 test_runtest,
14+ test_spinner,
15 test_testtools,
16 test_testresult,
17 test_testsuite,
18@@ -23,34 +26,17 @@
19 test_compat,
20 test_content,
21 test_content_type,
22+ test_deferredruntest,
23+ test_fixturesupport,
24 test_helpers,
25 test_matchers,
26 test_monkey,
27 test_runtest,
28+ test_spinner,
29 test_testresult,
30 test_testsuite,
31 test_testtools,
32 ]
33- try:
34- # Tests that rely on Twisted.
35- from testtools.tests import (
36- test_deferredruntest,
37- test_spinner,
38- )
39- except ImportError:
40- pass
41- else:
42- modules.extend([test_deferredruntest, test_spinner])
43- try:
44- # Tests that rely on 'fixtures'.
45- from testtools.tests import (
46- test_fixturesupport,
47- )
48- except ImportError:
49- pass
50- else:
51- modules.extend([test_fixturesupport])
52-
53 for module in modules:
54 suites.append(getattr(module, 'test_suite')())
55 return unittest.TestSuite(suites)
56
57=== modified file 'testtools/tests/test_deferredruntest.py'
58--- testtools/tests/test_deferredruntest.py 2010-11-12 11:30:23 +0000
59+++ testtools/tests/test_deferredruntest.py 2010-11-27 11:31:58 +0000
60@@ -12,12 +12,7 @@
61 from testtools.content import (
62 text_content,
63 )
64-from testtools.deferredruntest import (
65- assert_fails_with,
66- AsynchronousDeferredRunTest,
67- flush_logged_errors,
68- SynchronousDeferredRunTest,
69- )
70+from testtools.helpers import try_import
71 from testtools.tests.helpers import ExtendedTestResult
72 from testtools.matchers import (
73 Equals,
74@@ -26,9 +21,19 @@
75 Raises,
76 )
77 from testtools.runtest import RunTest
78-
79-from twisted.internet import defer
80-from twisted.python import failure, log
81+from testtools.tests.test_spinner import NeedsTwistedTestCase
82+
83+assert_fails_with = try_import('testtools.deferredruntest.assert_fails_with')
84+AsynchronousDeferredRunTest = try_import(
85+ 'testtools.deferredruntest.AsynchronousDeferredRunTest')
86+flush_logged_errors = try_import(
87+ 'testtools.deferredruntest.flush_logged_errors')
88+SynchronousDeferredRunTest = try_import(
89+ 'testtools.deferredruntest.SynchronousDeferredRunTest')
90+
91+defer = try_import('twisted.internet.defer')
92+failure = try_import('twisted.python.failure')
93+log = try_import('twisted.python.log')
94
95
96 class X(object):
97@@ -77,7 +82,7 @@
98 self.calls.append('test')
99 self.addCleanup(lambda: 1/0)
100
101- class TestIntegration(TestCase):
102+ class TestIntegration(NeedsTwistedTestCase):
103
104 def assertResultsMatch(self, test, result):
105 events = list(result._events)
106@@ -104,9 +109,9 @@
107 from unittest import TestSuite
108 from testtools import clone_test_with_new_id
109 runners = [
110- RunTest,
111- SynchronousDeferredRunTest,
112- AsynchronousDeferredRunTest,
113+ ('RunTest', RunTest),
114+ ('SynchronousDeferredRunTest', SynchronousDeferredRunTest),
115+ ('AsynchronousDeferredRunTest', AsynchronousDeferredRunTest),
116 ]
117
118 tests = [
119@@ -118,12 +123,12 @@
120 ]
121 base_test = X.TestIntegration('test_runner')
122 integration_tests = []
123- for runner in runners:
124+ for runner_name, runner in runners:
125 for test in tests:
126 new_test = clone_test_with_new_id(
127 base_test, '%s(%s, %s)' % (
128 base_test.id(),
129- runner.__name__,
130+ runner_name,
131 test.__name__))
132 new_test.test_factory = test
133 new_test.runner = runner
134@@ -131,7 +136,7 @@
135 return TestSuite(integration_tests)
136
137
138-class TestSynchronousDeferredRunTest(TestCase):
139+class TestSynchronousDeferredRunTest(NeedsTwistedTestCase):
140
141 def make_result(self):
142 return ExtendedTestResult()
143@@ -185,7 +190,7 @@
144 ('stopTest', test)]))
145
146
147-class TestAsynchronousDeferredRunTest(TestCase):
148+class TestAsynchronousDeferredRunTest(NeedsTwistedTestCase):
149
150 def make_reactor(self):
151 from twisted.internet import reactor
152@@ -602,10 +607,11 @@
153 self.assertThat(error, KeysEqual('traceback', 'twisted-log'))
154
155
156-class TestAssertFailsWith(TestCase):
157+class TestAssertFailsWith(NeedsTwistedTestCase):
158 """Tests for `assert_fails_with`."""
159
160- run_tests_with = SynchronousDeferredRunTest
161+ if SynchronousDeferredRunTest is not None:
162+ run_tests_with = SynchronousDeferredRunTest
163
164 def test_assert_fails_with_success(self):
165 # assert_fails_with fails the test if it's given a Deferred that
166
167=== modified file 'testtools/tests/test_fixturesupport.py'
168--- testtools/tests/test_fixturesupport.py 2010-10-28 20:18:39 +0000
169+++ testtools/tests/test_fixturesupport.py 2010-11-27 11:31:58 +0000
170@@ -1,20 +1,26 @@
171 import unittest
172
173-import fixtures
174-from fixtures.tests.helpers import LoggingFixture
175-
176 from testtools import (
177 TestCase,
178 content,
179 content_type,
180 )
181+from testtools.helpers import try_import
182 from testtools.tests.helpers import (
183 ExtendedTestResult,
184 )
185
186+fixtures = try_import('fixtures')
187+LoggingFixture = try_import('fixtures.tests.helpers.LoggingFixture')
188+
189
190 class TestFixtureSupport(TestCase):
191
192+ def setUp(self):
193+ super(TestFixtureSupport, self).setUp()
194+ if fixtures is None or LoggingFixture is None:
195+ self.skipTest("Need fixtures")
196+
197 def test_useFixture(self):
198 fixture = LoggingFixture()
199 class SimpleTest(TestCase):
200
201=== modified file 'testtools/tests/test_spinner.py'
202--- testtools/tests/test_spinner.py 2010-11-11 09:46:18 +0000
203+++ testtools/tests/test_spinner.py 2010-11-27 11:31:58 +0000
204@@ -9,90 +9,91 @@
205 skipIf,
206 TestCase,
207 )
208+from testtools.helpers import try_import
209 from testtools.matchers import (
210 Equals,
211 Is,
212 MatchesException,
213 Raises,
214 )
215-from testtools._spinner import (
216- DeferredNotFired,
217- extract_result,
218- NoResultError,
219- not_reentrant,
220- ReentryError,
221- Spinner,
222- StaleJunkError,
223- TimeoutError,
224- trap_unhandled_errors,
225- )
226-
227-from twisted.internet import defer
228-from twisted.python.failure import Failure
229-
230-
231-class TestNotReentrant(TestCase):
232+
233+_spinner = try_import('testtools._spinner')
234+
235+defer = try_import('twisted.internet.defer')
236+Failure = try_import('twisted.python.failure.Failure')
237+
238+
239+class NeedsTwistedTestCase(TestCase):
240+
241+ def setUp(self):
242+ super(NeedsTwistedTestCase, self).setUp()
243+ if defer is None or Failure is None:
244+ self.skipTest("Need Twisted to run")
245+
246+
247+class TestNotReentrant(NeedsTwistedTestCase):
248
249 def test_not_reentrant(self):
250 # A function decorated as not being re-entrant will raise a
251- # ReentryError if it is called while it is running.
252+ # _spinner.ReentryError if it is called while it is running.
253 calls = []
254- @not_reentrant
255+ @_spinner.not_reentrant
256 def log_something():
257 calls.append(None)
258 if len(calls) < 5:
259 log_something()
260- self.assertThat(log_something, Raises(MatchesException(ReentryError)))
261+ self.assertThat(
262+ log_something, Raises(MatchesException(_spinner.ReentryError)))
263 self.assertEqual(1, len(calls))
264
265 def test_deeper_stack(self):
266 calls = []
267- @not_reentrant
268+ @_spinner.not_reentrant
269 def g():
270 calls.append(None)
271 if len(calls) < 5:
272 f()
273- @not_reentrant
274+ @_spinner.not_reentrant
275 def f():
276 calls.append(None)
277 if len(calls) < 5:
278 g()
279- self.assertThat(f, Raises(MatchesException(ReentryError)))
280+ self.assertThat(f, Raises(MatchesException(_spinner.ReentryError)))
281 self.assertEqual(2, len(calls))
282
283
284-class TestExtractResult(TestCase):
285+class TestExtractResult(NeedsTwistedTestCase):
286
287 def test_not_fired(self):
288- # extract_result raises DeferredNotFired if it's given a Deferred that
289- # has not fired.
290- self.assertThat(lambda:extract_result(defer.Deferred()),
291- Raises(MatchesException(DeferredNotFired)))
292+ # _spinner.extract_result raises _spinner.DeferredNotFired if it's
293+ # given a Deferred that has not fired.
294+ self.assertThat(lambda:_spinner.extract_result(defer.Deferred()),
295+ Raises(MatchesException(_spinner.DeferredNotFired)))
296
297 def test_success(self):
298- # extract_result returns the value of the Deferred if it has fired
299- # successfully.
300+ # _spinner.extract_result returns the value of the Deferred if it has
301+ # fired successfully.
302 marker = object()
303 d = defer.succeed(marker)
304- self.assertThat(extract_result(d), Equals(marker))
305+ self.assertThat(_spinner.extract_result(d), Equals(marker))
306
307 def test_failure(self):
308- # extract_result raises the failure's exception if it's given a
309- # Deferred that is failing.
310+ # _spinner.extract_result raises the failure's exception if it's given
311+ # a Deferred that is failing.
312 try:
313 1/0
314 except ZeroDivisionError:
315 f = Failure()
316 d = defer.fail(f)
317- self.assertThat(lambda:extract_result(d),
318+ self.assertThat(lambda:_spinner.extract_result(d),
319 Raises(MatchesException(ZeroDivisionError)))
320
321
322-class TestTrapUnhandledErrors(TestCase):
323+class TestTrapUnhandledErrors(NeedsTwistedTestCase):
324
325 def test_no_deferreds(self):
326 marker = object()
327- result, errors = trap_unhandled_errors(lambda: marker)
328+ result, errors = _spinner.trap_unhandled_errors(lambda: marker)
329 self.assertEqual([], errors)
330 self.assertIs(marker, result)
331
332@@ -105,12 +106,13 @@
333 f = Failure()
334 failures.append(f)
335 defer.fail(f)
336- result, errors = trap_unhandled_errors(make_deferred_but_dont_handle)
337+ result, errors = _spinner.trap_unhandled_errors(
338+ make_deferred_but_dont_handle)
339 self.assertIs(None, result)
340 self.assertEqual(failures, [error.failResult for error in errors])
341
342
343-class TestRunInReactor(TestCase):
344+class TestRunInReactor(NeedsTwistedTestCase):
345
346 def make_reactor(self):
347 from twisted.internet import reactor
348@@ -119,7 +121,7 @@
349 def make_spinner(self, reactor=None):
350 if reactor is None:
351 reactor = self.make_reactor()
352- return Spinner(reactor)
353+ return _spinner.Spinner(reactor)
354
355 def make_timeout(self):
356 return 0.01
357@@ -157,8 +159,8 @@
358 # to run_in_reactor.
359 spinner = self.make_spinner()
360 self.assertThat(lambda: spinner.run(
361- self.make_timeout(), spinner.run, self.make_timeout(), lambda: None),
362- Raises(MatchesException(ReentryError)))
363+ self.make_timeout(), spinner.run, self.make_timeout(),
364+ lambda: None), Raises(MatchesException(_spinner.ReentryError)))
365
366 def test_deferred_value_returned(self):
367 # If the given function returns a Deferred, run_in_reactor returns the
368@@ -182,11 +184,12 @@
369 self.assertEqual(new_hdlrs, map(signal.getsignal, signals))
370
371 def test_timeout(self):
372- # If the function takes too long to run, we raise a TimeoutError.
373+ # If the function takes too long to run, we raise a
374+ # _spinner.TimeoutError.
375 timeout = self.make_timeout()
376 self.assertThat(
377 lambda:self.make_spinner().run(timeout, lambda: defer.Deferred()),
378- Raises(MatchesException(TimeoutError)))
379+ Raises(MatchesException(_spinner.TimeoutError)))
380
381 def test_no_junk_by_default(self):
382 # If the reactor hasn't spun yet, then there cannot be any junk.
383@@ -263,7 +266,7 @@
384 timeout = self.make_timeout()
385 spinner.run(timeout, reactor.listenTCP, 0, ServerFactory())
386 self.assertThat(lambda: spinner.run(timeout, lambda: None),
387- Raises(MatchesException(StaleJunkError)))
388+ Raises(MatchesException(_spinner.StaleJunkError)))
389
390 def test_clear_junk_clears_previous_junk(self):
391 # If 'run' is called and there's still junk in the spinner's junk
392@@ -279,7 +282,7 @@
393
394 @skipIf(os.name != "posix", "Sending SIGINT with os.kill is posix only")
395 def test_sigint_raises_no_result_error(self):
396- # If we get a SIGINT during a run, we raise NoResultError.
397+ # If we get a SIGINT during a run, we raise _spinner.NoResultError.
398 SIGINT = getattr(signal, 'SIGINT', None)
399 if not SIGINT:
400 self.skipTest("SIGINT not available")
401@@ -288,19 +291,19 @@
402 timeout = self.make_timeout()
403 reactor.callLater(timeout, os.kill, os.getpid(), SIGINT)
404 self.assertThat(lambda:spinner.run(timeout * 5, defer.Deferred),
405- Raises(MatchesException(NoResultError)))
406+ Raises(MatchesException(_spinner.NoResultError)))
407 self.assertEqual([], spinner._clean())
408
409 @skipIf(os.name != "posix", "Sending SIGINT with os.kill is posix only")
410 def test_sigint_raises_no_result_error_second_time(self):
411- # If we get a SIGINT during a run, we raise NoResultError. This test
412- # is exactly the same as test_sigint_raises_no_result_error, and
413- # exists to make sure we haven't futzed with state.
414+ # If we get a SIGINT during a run, we raise _spinner.NoResultError.
415+ # This test is exactly the same as test_sigint_raises_no_result_error,
416+ # and exists to make sure we haven't futzed with state.
417 self.test_sigint_raises_no_result_error()
418
419 @skipIf(os.name != "posix", "Sending SIGINT with os.kill is posix only")
420 def test_fast_sigint_raises_no_result_error(self):
421- # If we get a SIGINT during a run, we raise NoResultError.
422+ # If we get a SIGINT during a run, we raise _spinner.NoResultError.
423 SIGINT = getattr(signal, 'SIGINT', None)
424 if not SIGINT:
425 self.skipTest("SIGINT not available")
426@@ -309,7 +312,7 @@
427 timeout = self.make_timeout()
428 reactor.callWhenRunning(os.kill, os.getpid(), SIGINT)
429 self.assertThat(lambda:spinner.run(timeout * 5, defer.Deferred),
430- Raises(MatchesException(NoResultError)))
431+ Raises(MatchesException(_spinner.NoResultError)))
432 self.assertEqual([], spinner._clean())
433
434 @skipIf(os.name != "posix", "Sending SIGINT with os.kill is posix only")

Subscribers

People subscribed via source and target branches