Merge lp:~jml/testtools/skip-dont-elide into lp:~testtools-committers/testtools/trunk
- skip-dont-elide
- Merge into 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 | ||||||||
Related bugs: |
|
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
testtools developers | Pending | ||
Review via email: mp+42003@code.launchpad.net |
Commit message
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 : | # |
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") |
Seems fine enough to me.