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
=== modified file 'testtools/tests/__init__.py'
--- testtools/tests/__init__.py 2010-10-31 18:14:24 +0000
+++ testtools/tests/__init__.py 2010-11-27 11:31:58 +0000
@@ -10,10 +10,13 @@
10 test_compat,10 test_compat,
11 test_content,11 test_content,
12 test_content_type,12 test_content_type,
13 test_deferredruntest,
14 test_fixturesupport,
13 test_helpers,15 test_helpers,
14 test_matchers,16 test_matchers,
15 test_monkey,17 test_monkey,
16 test_runtest,18 test_runtest,
19 test_spinner,
17 test_testtools,20 test_testtools,
18 test_testresult,21 test_testresult,
19 test_testsuite,22 test_testsuite,
@@ -23,34 +26,17 @@
23 test_compat,26 test_compat,
24 test_content,27 test_content,
25 test_content_type,28 test_content_type,
29 test_deferredruntest,
30 test_fixturesupport,
26 test_helpers,31 test_helpers,
27 test_matchers,32 test_matchers,
28 test_monkey,33 test_monkey,
29 test_runtest,34 test_runtest,
35 test_spinner,
30 test_testresult,36 test_testresult,
31 test_testsuite,37 test_testsuite,
32 test_testtools,38 test_testtools,
33 ]39 ]
34 try:
35 # Tests that rely on Twisted.
36 from testtools.tests import (
37 test_deferredruntest,
38 test_spinner,
39 )
40 except ImportError:
41 pass
42 else:
43 modules.extend([test_deferredruntest, test_spinner])
44 try:
45 # Tests that rely on 'fixtures'.
46 from testtools.tests import (
47 test_fixturesupport,
48 )
49 except ImportError:
50 pass
51 else:
52 modules.extend([test_fixturesupport])
53
54 for module in modules:40 for module in modules:
55 suites.append(getattr(module, 'test_suite')())41 suites.append(getattr(module, 'test_suite')())
56 return unittest.TestSuite(suites)42 return unittest.TestSuite(suites)
5743
=== modified file 'testtools/tests/test_deferredruntest.py'
--- testtools/tests/test_deferredruntest.py 2010-11-12 11:30:23 +0000
+++ testtools/tests/test_deferredruntest.py 2010-11-27 11:31:58 +0000
@@ -12,12 +12,7 @@
12from testtools.content import (12from testtools.content import (
13 text_content,13 text_content,
14 )14 )
15from testtools.deferredruntest import (15from testtools.helpers import try_import
16 assert_fails_with,
17 AsynchronousDeferredRunTest,
18 flush_logged_errors,
19 SynchronousDeferredRunTest,
20 )
21from testtools.tests.helpers import ExtendedTestResult16from testtools.tests.helpers import ExtendedTestResult
22from testtools.matchers import (17from testtools.matchers import (
23 Equals,18 Equals,
@@ -26,9 +21,19 @@
26 Raises,21 Raises,
27 )22 )
28from testtools.runtest import RunTest23from testtools.runtest import RunTest
2924from testtools.tests.test_spinner import NeedsTwistedTestCase
30from twisted.internet import defer25
31from twisted.python import failure, log26assert_fails_with = try_import('testtools.deferredruntest.assert_fails_with')
27AsynchronousDeferredRunTest = try_import(
28 'testtools.deferredruntest.AsynchronousDeferredRunTest')
29flush_logged_errors = try_import(
30 'testtools.deferredruntest.flush_logged_errors')
31SynchronousDeferredRunTest = try_import(
32 'testtools.deferredruntest.SynchronousDeferredRunTest')
33
34defer = try_import('twisted.internet.defer')
35failure = try_import('twisted.python.failure')
36log = try_import('twisted.python.log')
3237
3338
34class X(object):39class X(object):
@@ -77,7 +82,7 @@
77 self.calls.append('test')82 self.calls.append('test')
78 self.addCleanup(lambda: 1/0)83 self.addCleanup(lambda: 1/0)
7984
80 class TestIntegration(TestCase):85 class TestIntegration(NeedsTwistedTestCase):
8186
82 def assertResultsMatch(self, test, result):87 def assertResultsMatch(self, test, result):
83 events = list(result._events)88 events = list(result._events)
@@ -104,9 +109,9 @@
104 from unittest import TestSuite109 from unittest import TestSuite
105 from testtools import clone_test_with_new_id110 from testtools import clone_test_with_new_id
106 runners = [111 runners = [
107 RunTest,112 ('RunTest', RunTest),
108 SynchronousDeferredRunTest,113 ('SynchronousDeferredRunTest', SynchronousDeferredRunTest),
109 AsynchronousDeferredRunTest,114 ('AsynchronousDeferredRunTest', AsynchronousDeferredRunTest),
110 ]115 ]
111116
112 tests = [117 tests = [
@@ -118,12 +123,12 @@
118 ]123 ]
119 base_test = X.TestIntegration('test_runner')124 base_test = X.TestIntegration('test_runner')
120 integration_tests = []125 integration_tests = []
121 for runner in runners:126 for runner_name, runner in runners:
122 for test in tests:127 for test in tests:
123 new_test = clone_test_with_new_id(128 new_test = clone_test_with_new_id(
124 base_test, '%s(%s, %s)' % (129 base_test, '%s(%s, %s)' % (
125 base_test.id(),130 base_test.id(),
126 runner.__name__,131 runner_name,
127 test.__name__))132 test.__name__))
128 new_test.test_factory = test133 new_test.test_factory = test
129 new_test.runner = runner134 new_test.runner = runner
@@ -131,7 +136,7 @@
131 return TestSuite(integration_tests)136 return TestSuite(integration_tests)
132137
133138
134class TestSynchronousDeferredRunTest(TestCase):139class TestSynchronousDeferredRunTest(NeedsTwistedTestCase):
135140
136 def make_result(self):141 def make_result(self):
137 return ExtendedTestResult()142 return ExtendedTestResult()
@@ -185,7 +190,7 @@
185 ('stopTest', test)]))190 ('stopTest', test)]))
186191
187192
188class TestAsynchronousDeferredRunTest(TestCase):193class TestAsynchronousDeferredRunTest(NeedsTwistedTestCase):
189194
190 def make_reactor(self):195 def make_reactor(self):
191 from twisted.internet import reactor196 from twisted.internet import reactor
@@ -602,10 +607,11 @@
602 self.assertThat(error, KeysEqual('traceback', 'twisted-log'))607 self.assertThat(error, KeysEqual('traceback', 'twisted-log'))
603608
604609
605class TestAssertFailsWith(TestCase):610class TestAssertFailsWith(NeedsTwistedTestCase):
606 """Tests for `assert_fails_with`."""611 """Tests for `assert_fails_with`."""
607612
608 run_tests_with = SynchronousDeferredRunTest613 if SynchronousDeferredRunTest is not None:
614 run_tests_with = SynchronousDeferredRunTest
609615
610 def test_assert_fails_with_success(self):616 def test_assert_fails_with_success(self):
611 # assert_fails_with fails the test if it's given a Deferred that617 # assert_fails_with fails the test if it's given a Deferred that
612618
=== modified file 'testtools/tests/test_fixturesupport.py'
--- testtools/tests/test_fixturesupport.py 2010-10-28 20:18:39 +0000
+++ testtools/tests/test_fixturesupport.py 2010-11-27 11:31:58 +0000
@@ -1,20 +1,26 @@
1import unittest1import unittest
22
3import fixtures
4from fixtures.tests.helpers import LoggingFixture
5
6from testtools import (3from testtools import (
7 TestCase,4 TestCase,
8 content,5 content,
9 content_type,6 content_type,
10 )7 )
8from testtools.helpers import try_import
11from testtools.tests.helpers import (9from testtools.tests.helpers import (
12 ExtendedTestResult,10 ExtendedTestResult,
13 )11 )
1412
13fixtures = try_import('fixtures')
14LoggingFixture = try_import('fixtures.tests.helpers.LoggingFixture')
15
1516
16class TestFixtureSupport(TestCase):17class TestFixtureSupport(TestCase):
1718
19 def setUp(self):
20 super(TestFixtureSupport, self).setUp()
21 if fixtures is None or LoggingFixture is None:
22 self.skipTest("Need fixtures")
23
18 def test_useFixture(self):24 def test_useFixture(self):
19 fixture = LoggingFixture()25 fixture = LoggingFixture()
20 class SimpleTest(TestCase):26 class SimpleTest(TestCase):
2127
=== modified file 'testtools/tests/test_spinner.py'
--- testtools/tests/test_spinner.py 2010-11-11 09:46:18 +0000
+++ testtools/tests/test_spinner.py 2010-11-27 11:31:58 +0000
@@ -9,90 +9,91 @@
9 skipIf,9 skipIf,
10 TestCase,10 TestCase,
11 )11 )
12from testtools.helpers import try_import
12from testtools.matchers import (13from testtools.matchers import (
13 Equals,14 Equals,
14 Is,15 Is,
15 MatchesException,16 MatchesException,
16 Raises,17 Raises,
17 )18 )
18from testtools._spinner import (19
19 DeferredNotFired,20_spinner = try_import('testtools._spinner')
20 extract_result,21
21 NoResultError,22defer = try_import('twisted.internet.defer')
22 not_reentrant,23Failure = try_import('twisted.python.failure.Failure')
23 ReentryError,24
24 Spinner,25
25 StaleJunkError,26class NeedsTwistedTestCase(TestCase):
26 TimeoutError,27
27 trap_unhandled_errors,28 def setUp(self):
28 )29 super(NeedsTwistedTestCase, self).setUp()
2930 if defer is None or Failure is None:
30from twisted.internet import defer31 self.skipTest("Need Twisted to run")
31from twisted.python.failure import Failure32
3233
3334class TestNotReentrant(NeedsTwistedTestCase):
34class TestNotReentrant(TestCase):
3535
36 def test_not_reentrant(self):36 def test_not_reentrant(self):
37 # A function decorated as not being re-entrant will raise a37 # A function decorated as not being re-entrant will raise a
38 # ReentryError if it is called while it is running.38 # _spinner.ReentryError if it is called while it is running.
39 calls = []39 calls = []
40 @not_reentrant40 @_spinner.not_reentrant
41 def log_something():41 def log_something():
42 calls.append(None)42 calls.append(None)
43 if len(calls) < 5:43 if len(calls) < 5:
44 log_something()44 log_something()
45 self.assertThat(log_something, Raises(MatchesException(ReentryError)))45 self.assertThat(
46 log_something, Raises(MatchesException(_spinner.ReentryError)))
46 self.assertEqual(1, len(calls))47 self.assertEqual(1, len(calls))
4748
48 def test_deeper_stack(self):49 def test_deeper_stack(self):
49 calls = []50 calls = []
50 @not_reentrant51 @_spinner.not_reentrant
51 def g():52 def g():
52 calls.append(None)53 calls.append(None)
53 if len(calls) < 5:54 if len(calls) < 5:
54 f()55 f()
55 @not_reentrant56 @_spinner.not_reentrant
56 def f():57 def f():
57 calls.append(None)58 calls.append(None)
58 if len(calls) < 5:59 if len(calls) < 5:
59 g()60 g()
60 self.assertThat(f, Raises(MatchesException(ReentryError)))61 self.assertThat(f, Raises(MatchesException(_spinner.ReentryError)))
61 self.assertEqual(2, len(calls))62 self.assertEqual(2, len(calls))
6263
6364
64class TestExtractResult(TestCase):65class TestExtractResult(NeedsTwistedTestCase):
6566
66 def test_not_fired(self):67 def test_not_fired(self):
67 # extract_result raises DeferredNotFired if it's given a Deferred that68 # _spinner.extract_result raises _spinner.DeferredNotFired if it's
68 # has not fired.69 # given a Deferred that has not fired.
69 self.assertThat(lambda:extract_result(defer.Deferred()),70 self.assertThat(lambda:_spinner.extract_result(defer.Deferred()),
70 Raises(MatchesException(DeferredNotFired)))71 Raises(MatchesException(_spinner.DeferredNotFired)))
7172
72 def test_success(self):73 def test_success(self):
73 # extract_result returns the value of the Deferred if it has fired74 # _spinner.extract_result returns the value of the Deferred if it has
74 # successfully.75 # fired successfully.
75 marker = object()76 marker = object()
76 d = defer.succeed(marker)77 d = defer.succeed(marker)
77 self.assertThat(extract_result(d), Equals(marker))78 self.assertThat(_spinner.extract_result(d), Equals(marker))
7879
79 def test_failure(self):80 def test_failure(self):
80 # extract_result raises the failure's exception if it's given a81 # _spinner.extract_result raises the failure's exception if it's given
81 # Deferred that is failing.82 # a Deferred that is failing.
82 try:83 try:
83 1/084 1/0
84 except ZeroDivisionError:85 except ZeroDivisionError:
85 f = Failure()86 f = Failure()
86 d = defer.fail(f)87 d = defer.fail(f)
87 self.assertThat(lambda:extract_result(d),88 self.assertThat(lambda:_spinner.extract_result(d),
88 Raises(MatchesException(ZeroDivisionError)))89 Raises(MatchesException(ZeroDivisionError)))
8990
9091
91class TestTrapUnhandledErrors(TestCase):92class TestTrapUnhandledErrors(NeedsTwistedTestCase):
9293
93 def test_no_deferreds(self):94 def test_no_deferreds(self):
94 marker = object()95 marker = object()
95 result, errors = trap_unhandled_errors(lambda: marker)96 result, errors = _spinner.trap_unhandled_errors(lambda: marker)
96 self.assertEqual([], errors)97 self.assertEqual([], errors)
97 self.assertIs(marker, result)98 self.assertIs(marker, result)
9899
@@ -105,12 +106,13 @@
105 f = Failure()106 f = Failure()
106 failures.append(f)107 failures.append(f)
107 defer.fail(f)108 defer.fail(f)
108 result, errors = trap_unhandled_errors(make_deferred_but_dont_handle)109 result, errors = _spinner.trap_unhandled_errors(
110 make_deferred_but_dont_handle)
109 self.assertIs(None, result)111 self.assertIs(None, result)
110 self.assertEqual(failures, [error.failResult for error in errors])112 self.assertEqual(failures, [error.failResult for error in errors])
111113
112114
113class TestRunInReactor(TestCase):115class TestRunInReactor(NeedsTwistedTestCase):
114116
115 def make_reactor(self):117 def make_reactor(self):
116 from twisted.internet import reactor118 from twisted.internet import reactor
@@ -119,7 +121,7 @@
119 def make_spinner(self, reactor=None):121 def make_spinner(self, reactor=None):
120 if reactor is None:122 if reactor is None:
121 reactor = self.make_reactor()123 reactor = self.make_reactor()
122 return Spinner(reactor)124 return _spinner.Spinner(reactor)
123125
124 def make_timeout(self):126 def make_timeout(self):
125 return 0.01127 return 0.01
@@ -157,8 +159,8 @@
157 # to run_in_reactor.159 # to run_in_reactor.
158 spinner = self.make_spinner()160 spinner = self.make_spinner()
159 self.assertThat(lambda: spinner.run(161 self.assertThat(lambda: spinner.run(
160 self.make_timeout(), spinner.run, self.make_timeout(), lambda: None),162 self.make_timeout(), spinner.run, self.make_timeout(),
161 Raises(MatchesException(ReentryError)))163 lambda: None), Raises(MatchesException(_spinner.ReentryError)))
162164
163 def test_deferred_value_returned(self):165 def test_deferred_value_returned(self):
164 # If the given function returns a Deferred, run_in_reactor returns the166 # If the given function returns a Deferred, run_in_reactor returns the
@@ -182,11 +184,12 @@
182 self.assertEqual(new_hdlrs, map(signal.getsignal, signals))184 self.assertEqual(new_hdlrs, map(signal.getsignal, signals))
183185
184 def test_timeout(self):186 def test_timeout(self):
185 # If the function takes too long to run, we raise a TimeoutError.187 # If the function takes too long to run, we raise a
188 # _spinner.TimeoutError.
186 timeout = self.make_timeout()189 timeout = self.make_timeout()
187 self.assertThat(190 self.assertThat(
188 lambda:self.make_spinner().run(timeout, lambda: defer.Deferred()),191 lambda:self.make_spinner().run(timeout, lambda: defer.Deferred()),
189 Raises(MatchesException(TimeoutError)))192 Raises(MatchesException(_spinner.TimeoutError)))
190193
191 def test_no_junk_by_default(self):194 def test_no_junk_by_default(self):
192 # If the reactor hasn't spun yet, then there cannot be any junk.195 # If the reactor hasn't spun yet, then there cannot be any junk.
@@ -263,7 +266,7 @@
263 timeout = self.make_timeout()266 timeout = self.make_timeout()
264 spinner.run(timeout, reactor.listenTCP, 0, ServerFactory())267 spinner.run(timeout, reactor.listenTCP, 0, ServerFactory())
265 self.assertThat(lambda: spinner.run(timeout, lambda: None),268 self.assertThat(lambda: spinner.run(timeout, lambda: None),
266 Raises(MatchesException(StaleJunkError)))269 Raises(MatchesException(_spinner.StaleJunkError)))
267270
268 def test_clear_junk_clears_previous_junk(self):271 def test_clear_junk_clears_previous_junk(self):
269 # If 'run' is called and there's still junk in the spinner's junk272 # If 'run' is called and there's still junk in the spinner's junk
@@ -279,7 +282,7 @@
279282
280 @skipIf(os.name != "posix", "Sending SIGINT with os.kill is posix only")283 @skipIf(os.name != "posix", "Sending SIGINT with os.kill is posix only")
281 def test_sigint_raises_no_result_error(self):284 def test_sigint_raises_no_result_error(self):
282 # If we get a SIGINT during a run, we raise NoResultError.285 # If we get a SIGINT during a run, we raise _spinner.NoResultError.
283 SIGINT = getattr(signal, 'SIGINT', None)286 SIGINT = getattr(signal, 'SIGINT', None)
284 if not SIGINT:287 if not SIGINT:
285 self.skipTest("SIGINT not available")288 self.skipTest("SIGINT not available")
@@ -288,19 +291,19 @@
288 timeout = self.make_timeout()291 timeout = self.make_timeout()
289 reactor.callLater(timeout, os.kill, os.getpid(), SIGINT)292 reactor.callLater(timeout, os.kill, os.getpid(), SIGINT)
290 self.assertThat(lambda:spinner.run(timeout * 5, defer.Deferred),293 self.assertThat(lambda:spinner.run(timeout * 5, defer.Deferred),
291 Raises(MatchesException(NoResultError)))294 Raises(MatchesException(_spinner.NoResultError)))
292 self.assertEqual([], spinner._clean())295 self.assertEqual([], spinner._clean())
293296
294 @skipIf(os.name != "posix", "Sending SIGINT with os.kill is posix only")297 @skipIf(os.name != "posix", "Sending SIGINT with os.kill is posix only")
295 def test_sigint_raises_no_result_error_second_time(self):298 def test_sigint_raises_no_result_error_second_time(self):
296 # If we get a SIGINT during a run, we raise NoResultError. This test299 # If we get a SIGINT during a run, we raise _spinner.NoResultError.
297 # is exactly the same as test_sigint_raises_no_result_error, and300 # This test is exactly the same as test_sigint_raises_no_result_error,
298 # exists to make sure we haven't futzed with state.301 # and exists to make sure we haven't futzed with state.
299 self.test_sigint_raises_no_result_error()302 self.test_sigint_raises_no_result_error()
300303
301 @skipIf(os.name != "posix", "Sending SIGINT with os.kill is posix only")304 @skipIf(os.name != "posix", "Sending SIGINT with os.kill is posix only")
302 def test_fast_sigint_raises_no_result_error(self):305 def test_fast_sigint_raises_no_result_error(self):
303 # If we get a SIGINT during a run, we raise NoResultError.306 # If we get a SIGINT during a run, we raise _spinner.NoResultError.
304 SIGINT = getattr(signal, 'SIGINT', None)307 SIGINT = getattr(signal, 'SIGINT', None)
305 if not SIGINT:308 if not SIGINT:
306 self.skipTest("SIGINT not available")309 self.skipTest("SIGINT not available")
@@ -309,7 +312,7 @@
309 timeout = self.make_timeout()312 timeout = self.make_timeout()
310 reactor.callWhenRunning(os.kill, os.getpid(), SIGINT)313 reactor.callWhenRunning(os.kill, os.getpid(), SIGINT)
311 self.assertThat(lambda:spinner.run(timeout * 5, defer.Deferred),314 self.assertThat(lambda:spinner.run(timeout * 5, defer.Deferred),
312 Raises(MatchesException(NoResultError)))315 Raises(MatchesException(_spinner.NoResultError)))
313 self.assertEqual([], spinner._clean())316 self.assertEqual([], spinner._clean())
314317
315 @skipIf(os.name != "posix", "Sending SIGINT with os.kill is posix only")318 @skipIf(os.name != "posix", "Sending SIGINT with os.kill is posix only")

Subscribers

People subscribed via source and target branches