Rev 5393: Do a full test suite against all the subunit permutations. in http://bazaar.launchpad.net/~jameinel/bzr/2.3-filter-tests
John Arbash Meinel
john at arbash-meinel.com
Sat Sep 25 20:32:19 BST 2010
At http://bazaar.launchpad.net/~jameinel/bzr/2.3-filter-tests
------------------------------------------------------------
revno: 5393
revision-id: john at arbash-meinel.com-20100925193153-lyy1agn4d0rkgfv6
parent: john at arbash-meinel.com-20100924165327-54m2jfhmz5mo69b3
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: 2.3-filter-tests
timestamp: Sat 2010-09-25 14:31:53 -0500
message:
Do a full test suite against all the subunit permutations.
-------------- next part --------------
=== modified file 'bzrlib/tests/__init__.py'
--- a/bzrlib/tests/__init__.py 2010-09-24 16:44:38 +0000
+++ b/bzrlib/tests/__init__.py 2010-09-25 19:31:53 +0000
@@ -4533,10 +4533,20 @@
try:
from subunit import TestProtocolClient
from subunit.test_results import AutoTimingTestResultDecorator
+ class SubUnitBzrProtocolClient(TestProtocolClient):
+
+ def addSuccess(self, test, details=None):
+ # The subunit client always includes the details in the subunit
+ # stream, but we don't want to include it in ours.
+ if 'log' in details:
+ del details['log']
+ return super(SubUnitBzrProtocolClient, self).addSuccess(
+ test, details)
+
class SubUnitBzrRunner(TextTestRunner):
def run(self, test):
result = AutoTimingTestResultDecorator(
- TestProtocolClient(self.stream))
+ SubUnitBzrProtocolClient(self.stream))
test.run(result)
return result
except ImportError:
=== modified file 'bzrlib/tests/test_selftest.py'
--- a/bzrlib/tests/test_selftest.py 2010-09-24 16:53:27 +0000
+++ b/bzrlib/tests/test_selftest.py 2010-09-25 19:31:53 +0000
@@ -1656,41 +1656,75 @@
self.assertEqual('original', obj.test_attr)
+class _MissingFeature(tests.Feature):
+ def _probe(self):
+ return False
+missing_feature = _MissingFeature()
+
+
+def _get_test(name):
+ """Get an instance of a specific example test.
+
+ We protect this in a function so that they don't auto-run in the test
+ suite.
+ """
+
+ class ExampleTests(tests.TestCase):
+
+ def test_fail(self):
+ mutter('this was a failing test')
+ self.fail('this test will fail')
+
+ def test_error(self):
+ mutter('this test errored')
+ raise RuntimeError('gotcha')
+
+ def test_missing_feature(self):
+ mutter('missing the feature')
+ self.requireFeature(missing_feature)
+
+ def test_skip(self):
+ mutter('this test will be skipped')
+ raise tests.TestSkipped('reason')
+
+ def test_success(self):
+ mutter('this test succeeds')
+
+ def test_xfail(self):
+ mutter('test with expected failure')
+ self.knownFailure('this_fails')
+
+ def test_unexpected_success(self):
+ mutter('test with unexpected success')
+ self.expectFailure('should_fail', lambda: None)
+
+ return ExampleTests(name)
+
+
class TestTestCaseLogDetails(tests.TestCase):
- def _run_test(self, a_test):
+ def _run_test(self, test_name):
+ test = _get_test(test_name)
result = testtools.TestResult()
- a_test.run(result)
+ test.run(result)
return result
def test_fail_has_log(self):
- class Test(tests.TestCase):
- def test_fail(self):
- mutter('this was a failing test')
- self.fail('this test will fail')
- result = self._run_test(Test('test_fail'))
+ result = self._run_test('test_fail')
self.assertEqual(1, len(result.failures))
result_content = result.failures[0][1]
self.assertContainsRe(result_content, 'Text attachment: log')
self.assertContainsRe(result_content, 'this was a failing test')
def test_error_has_log(self):
- class Test(tests.TestCase):
- def test_error(self):
- mutter('this test errored')
- raise RuntimeError('gotcha')
- result = self._run_test(Test('test_error'))
+ result = self._run_test('test_error')
self.assertEqual(1, len(result.errors))
result_content = result.errors[0][1]
self.assertContainsRe(result_content, 'Text attachment: log')
self.assertContainsRe(result_content, 'this test errored')
def test_skip_has_no_log(self):
- class Test(tests.TestCase):
- def test_skip(self):
- mutter('this test will be skipped')
- raise tests.TestSkipped('reason')
- result = self._run_test(Test('test_skip'))
+ result = self._run_test('test_skip')
self.assertEqual(['reason'], result.skip_reasons.keys())
skips = result.skip_reasons['reason']
self.assertEqual(1, len(skips))
@@ -1698,40 +1732,24 @@
self.assertFalse('log' in test.getDetails())
def test_missing_feature_has_no_log(self):
- class MissingFeature(tests.Feature):
- def _probe(self):
- return False
- feature = MissingFeature()
- class Test(tests.TestCase):
- def test_missing_feature(self):
- mutter('missing the feature')
- self.requireFeature(feature)
# testtools doesn't know about addNotSupported, so it just gets
# considered as a skip
- result = self._run_test(Test('test_missing_feature'))
- self.assertEqual([feature], result.skip_reasons.keys())
- skips = result.skip_reasons[feature]
+ result = self._run_test('test_missing_feature')
+ self.assertEqual([missing_feature], result.skip_reasons.keys())
+ skips = result.skip_reasons[missing_feature]
self.assertEqual(1, len(skips))
test = skips[0]
self.assertFalse('log' in test.getDetails())
def test_xfail_has_no_log(self):
- class Test(tests.TestCase):
- def test_xfail(self):
- mutter('test with expected failure')
- self.knownFailure('this_fails')
- result = self._run_test(Test('test_xfail'))
+ result = self._run_test('test_xfail')
self.assertEqual(1, len(result.expectedFailures))
result_content = result.expectedFailures[0][1]
self.assertNotContainsRe(result_content, 'Text attachment: log')
self.assertNotContainsRe(result_content, 'test with expected failure')
def test_unexpected_success_has_log(self):
- class Test(tests.TestCase):
- def test_unexpected_success(self):
- mutter('test with unexpected success')
- self.expectFailure('should_fail', lambda: None)
- result = self._run_test(Test('test_unexpected_success'))
+ result = self._run_test('test_unexpected_success')
self.assertEqual(1, len(result.unexpectedSuccesses))
# Inconsistency, unexpectedSuccesses is a list of tests,
# expectedFailures is a list of reasons?
@@ -2060,24 +2078,75 @@
_test_needs_features = [features.subunit]
- def run_subunit_stream(self, test_suite_factory):
+ def run_subunit_stream(self, test_name):
from subunit import ProtocolTestCase
+ def factory():
+ return TestUtil.TestSuite([_get_test(test_name)])
stream = self.run_selftest(runner_class=tests.SubUnitBzrRunner,
- test_suite_factory=test_suite_factory)
+ test_suite_factory=factory)
test = ProtocolTestCase(stream)
- result = unittest.TestResult()
+ result = testtools.TestResult()
test.run(result)
- return stream, result
+ content = stream.getvalue()
+ return content, result
+
+ def test_fail_has_log(self):
+ content, result = self.run_subunit_stream('test_fail')
+ self.assertEqual(1, len(result.failures))
+ self.assertContainsRe(content, '(?m)^log$')
+ self.assertContainsRe(content, 'this test will fail')
+
+ def test_error_has_log(self):
+ content, result = self.run_subunit_stream('test_error')
+ self.assertContainsRe(content, '(?m)^log$')
+ self.assertContainsRe(content, 'this test errored')
+
+ def test_skip_has_no_log(self):
+ content, result = self.run_subunit_stream('test_skip')
+ self.assertNotContainsRe(content, '(?m)^log$')
+ self.assertNotContainsRe(content, 'this test will be skipped')
+ self.assertEqual(['reason'], result.skip_reasons.keys())
+ skips = result.skip_reasons['reason']
+ self.assertEqual(1, len(skips))
+ test = skips[0]
+ # RemotedTestCase doesn't preserve the "details"
+ ## self.assertFalse('log' in test.getDetails())
+
+ def test_missing_feature_has_no_log(self):
+ content, result = self.run_subunit_stream('test_missing_feature')
+ self.assertNotContainsRe(content, '(?m)^log$')
+ self.assertNotContainsRe(content, 'missing the feature')
+ self.assertEqual(['_MissingFeature\n'], result.skip_reasons.keys())
+ skips = result.skip_reasons['_MissingFeature\n']
+ self.assertEqual(1, len(skips))
+ test = skips[0]
+ # RemotedTestCase doesn't preserve the "details"
+ ## self.assertFalse('log' in test.getDetails())
+
+ def test_xfail_has_no_log(self):
+ content, result = self.run_subunit_stream('test_xfail')
+ self.assertNotContainsRe(content, '(?m)^log$')
+ self.assertNotContainsRe(content, 'test with expected failure')
+ self.assertEqual(1, len(result.expectedFailures))
+ result_content = result.expectedFailures[0][1]
+ self.assertNotContainsRe(result_content, 'Text attachment: log')
+ self.assertNotContainsRe(result_content, 'test with expected failure')
+
+ def test_unexpected_success_has_log(self):
+ content, result = self.run_subunit_stream('test_unexpected_success')
+ self.assertContainsRe(content, '(?m)^log$')
+ self.assertContainsRe(content, 'test with unexpected success')
+ self.expectFailure('subunit treats "unexpectedSuccess"'
+ ' as a plain success',
+ self.assertEqual, 1, len(result.unexpectedSuccesses))
+ self.assertEqual(1, len(result.unexpectedSuccesses))
+ test = result.unexpectedSuccesses[0]
+ # RemotedTestCase doesn't preserve the "details"
+ ## self.assertTrue('log' in test.getDetails())
def test_success_has_no_log(self):
- class Test(tests.TestCase):
- def test_success(self):
- mutter('this test succeeds')
- def factory():
- return TestUtil.TestSuite([Test('test_success')])
- stream, result = self.run_subunit_stream(factory)
+ content, result = self.run_subunit_stream('test_success')
self.assertEqual(1, result.testsRun)
- content = stream.getvalue()
self.assertNotContainsRe(content, '(?m)^log$')
self.assertNotContainsRe(content, 'this test succeeds')
More information about the bazaar-commits
mailing list