Rev 3215: New test loader avoiding unneeded imports and tests loading. in file:///v/home/vila/src/bzr/experimental/selftest/
Vincent Ladeuil
v.ladeuil+lp at free.fr
Fri Feb 15 10:57:07 GMT 2008
At file:///v/home/vila/src/bzr/experimental/selftest/
------------------------------------------------------------
revno: 3215
revision-id:v.ladeuil+lp at free.fr-20080215105702-52sb8hijq9cfy0i7
parent: v.ladeuil+lp at free.fr-20080214172545-26fcbg17zmjq62bf
committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
branch nick: selftest
timestamp: Fri 2008-02-15 11:57:02 +0100
message:
New test loader avoiding unneeded imports and tests loading.
* bzrlib/tests/TestUtil.py:
(TestLoader.loadTestsFromModuleName): New method allowing
specialization by daughter classes.
(FilteredByModuleTestLoader): Specialized loader importing and
loading tests for a reduced set of modules.
* bzrlib/tests/test_selftest.py:
(_test_ids): Used by three different tests classes, changed to a
module level function.
(TestTestLoader): Add tests for loadTestsFromModuleName.
(TestTestIdList.test_test_suite): Fix failing test. Tests order
have changed.
(TestFilteredByModuleTestLoader): Tests for a loader that don't
import unneeded modules.
modified:
bzrlib/tests/TestUtil.py TestUtil.py-20050824080200-5f70140a2d938694
bzrlib/tests/test_selftest.py test_selftest.py-20051202044319-c110a115d8c0456a
-------------- next part --------------
=== modified file 'bzrlib/tests/TestUtil.py'
--- a/bzrlib/tests/TestUtil.py 2008-01-07 16:47:46 +0000
+++ b/bzrlib/tests/TestUtil.py 2008-02-15 10:57:02 +0000
@@ -89,8 +89,14 @@
"""
result = self.suiteClass()
for name in names:
- module = _load_module_by_name(name)
- result.addTests(self.loadTestsFromModule(module))
+ result.addTests(self.loadTestsFromModuleName(name))
+ return result
+
+ def loadTestsFromModuleName(self, name):
+ result = self.suiteClass()
+ module = _load_module_by_name(name)
+
+ result.addTests(self.loadTestsFromModule(module))
return result
def loadTestsFromModule(self, module):
@@ -135,6 +141,26 @@
self.test_func_names[test_case_class] = test_fn_names
return test_fn_names
+
+class FilteredByModuleTestLoader(TestLoader):
+ """A test loader that import only the needed modules."""
+
+ def __init__(self, needs_module):
+ """Constructor.
+
+ :param needs_module: a callable taking a module name as a
+ parameter returing True if the module should be loaded.
+ """
+ TestLoader.__init__(self)
+ self.needs_module = needs_module
+
+ def loadTestsFromModuleName(self, name):
+ if self.needs_module(name):
+ return TestLoader.loadTestsFromModuleName(self, name)
+ else:
+ return self.suiteClass()
+
+
def _load_module_by_name(mod_name):
parts = mod_name.split('.')
module = __import__(mod_name)
=== modified file 'bzrlib/tests/test_selftest.py'
--- a/bzrlib/tests/test_selftest.py 2008-02-10 20:23:50 +0000
+++ b/bzrlib/tests/test_selftest.py 2008-02-15 10:57:02 +0000
@@ -77,6 +77,11 @@
from bzrlib.version import _get_bzr_source_tree
+def _test_ids(test_suite):
+ """Get the ids for the tests in a test suite."""
+ return [t.id() for t in iter_suite_tests(test_suite)]
+
+
class SelftestTests(TestCase):
def test_import_tests(self):
@@ -1721,18 +1726,14 @@
self.loader = TestUtil.TestLoader()
self.suite.addTest(self.loader.loadTestsFromModuleNames([
'bzrlib.tests.test_selftest']))
- self.all_names = self._test_ids(self.suite)
-
- def _test_ids(self, test_suite):
- """Get the ids for the tests in a test suite."""
- return [t.id() for t in iter_suite_tests(test_suite)]
+ self.all_names = _test_ids(self.suite)
def test_condition_id_re(self):
test_name = ('bzrlib.tests.test_selftest.TestSelftestFiltering.'
'test_condition_id_re')
filtered_suite = filter_suite_by_condition(self.suite,
condition_id_re('test_condition_id_re'))
- self.assertEqual([test_name], self._test_ids(filtered_suite))
+ self.assertEqual([test_name], _test_ids(filtered_suite))
def test_condition_id_in_list(self):
test_names = ['bzrlib.tests.test_selftest.TestSelftestFiltering.'
@@ -1742,16 +1743,14 @@
self.suite, tests.condition_id_in_list(id_list))
my_pattern = 'TestSelftestFiltering.*test_condition_id_in_list'
re_filtered = filter_suite_by_re(self.suite, my_pattern)
- self.assertEqual(self._test_ids(re_filtered),
- self._test_ids(filtered_suite))
+ self.assertEqual(_test_ids(re_filtered), _test_ids(filtered_suite))
def test_condition_isinstance(self):
filtered_suite = filter_suite_by_condition(self.suite,
condition_isinstance(self.__class__))
class_pattern = 'bzrlib.tests.test_selftest.TestSelftestFiltering.'
re_filtered = filter_suite_by_re(self.suite, class_pattern)
- self.assertEqual(self._test_ids(re_filtered),
- self._test_ids(filtered_suite))
+ self.assertEqual(_test_ids(re_filtered), _test_ids(filtered_suite))
def test_exclude_tests_by_condition(self):
excluded_name = ('bzrlib.tests.test_selftest.TestSelftestFiltering.'
@@ -1760,33 +1759,33 @@
lambda x:x.id() == excluded_name)
self.assertEqual(len(self.all_names) - 1,
filtered_suite.countTestCases())
- self.assertFalse(excluded_name in self._test_ids(filtered_suite))
+ self.assertFalse(excluded_name in _test_ids(filtered_suite))
remaining_names = list(self.all_names)
remaining_names.remove(excluded_name)
- self.assertEqual(remaining_names, self._test_ids(filtered_suite))
+ self.assertEqual(remaining_names, _test_ids(filtered_suite))
def test_exclude_tests_by_re(self):
- self.all_names = self._test_ids(self.suite)
+ self.all_names = _test_ids(self.suite)
filtered_suite = exclude_tests_by_re(self.suite, 'exclude_tests_by_re')
excluded_name = ('bzrlib.tests.test_selftest.TestSelftestFiltering.'
'test_exclude_tests_by_re')
self.assertEqual(len(self.all_names) - 1,
filtered_suite.countTestCases())
- self.assertFalse(excluded_name in self._test_ids(filtered_suite))
+ self.assertFalse(excluded_name in _test_ids(filtered_suite))
remaining_names = list(self.all_names)
remaining_names.remove(excluded_name)
- self.assertEqual(remaining_names, self._test_ids(filtered_suite))
+ self.assertEqual(remaining_names, _test_ids(filtered_suite))
def test_filter_suite_by_condition(self):
test_name = ('bzrlib.tests.test_selftest.TestSelftestFiltering.'
'test_filter_suite_by_condition')
filtered_suite = filter_suite_by_condition(self.suite,
lambda x:x.id() == test_name)
- self.assertEqual([test_name], self._test_ids(filtered_suite))
+ self.assertEqual([test_name], _test_ids(filtered_suite))
def test_filter_suite_by_re(self):
filtered_suite = filter_suite_by_re(self.suite, 'test_filter_suite_by_r')
- filtered_names = self._test_ids(filtered_suite)
+ filtered_names = _test_ids(filtered_suite)
self.assertEqual(filtered_names, ['bzrlib.tests.test_selftest.'
'TestSelftestFiltering.test_filter_suite_by_re'])
@@ -1795,7 +1794,7 @@
'TestSelftestFiltering.test_filter_suite_by_id_list']
filtered_suite = tests.filter_suite_by_id_list(
self.suite, tests.TestIdList(test_list))
- filtered_names = self._test_ids(filtered_suite)
+ filtered_names = _test_ids(filtered_suite)
self.assertEqual(
filtered_names,
['bzrlib.tests.test_selftest.'
@@ -1809,37 +1808,36 @@
def test_randomize_suite(self):
randomized_suite = randomize_suite(self.suite)
# randomizing should not add or remove test names.
- self.assertEqual(set(self._test_ids(self.suite)),
- set(self._test_ids(randomized_suite)))
+ self.assertEqual(set(_test_ids(self.suite)),
+ set(_test_ids(randomized_suite)))
# Technically, this *can* fail, because random.shuffle(list) can be
# equal to list. Trying multiple times just pushes the frequency back.
# As its len(self.all_names)!:1, the failure frequency should be low
# enough to ignore. RBC 20071021.
# It should change the order.
- self.assertNotEqual(self.all_names, self._test_ids(randomized_suite))
+ self.assertNotEqual(self.all_names, _test_ids(randomized_suite))
# But not the length. (Possibly redundant with the set test, but not
# necessarily.)
- self.assertEqual(len(self.all_names),
- len(self._test_ids(randomized_suite)))
+ self.assertEqual(len(self.all_names), len(_test_ids(randomized_suite)))
def test_sort_suite_by_re(self):
sorted_suite = self.applyDeprecated(one_zero,
sort_suite_by_re, self.suite, 'test_filter_suite_by_r')
- sorted_names = self._test_ids(sorted_suite)
+ sorted_names = _test_ids(sorted_suite)
self.assertEqual(sorted_names[0], 'bzrlib.tests.test_selftest.'
'TestSelftestFiltering.test_filter_suite_by_re')
self.assertEquals(sorted(self.all_names), sorted(sorted_names))
def test_split_suit_by_re(self):
- self.all_names = self._test_ids(self.suite)
+ self.all_names = _test_ids(self.suite)
split_suite = split_suite_by_re(self.suite, 'test_filter_suite_by_r')
filtered_name = ('bzrlib.tests.test_selftest.TestSelftestFiltering.'
'test_filter_suite_by_re')
- self.assertEqual([filtered_name], self._test_ids(split_suite[0]))
- self.assertFalse(filtered_name in self._test_ids(split_suite[1]))
+ self.assertEqual([filtered_name], _test_ids(split_suite[0]))
+ self.assertFalse(filtered_name in _test_ids(split_suite[1]))
remaining_names = list(self.all_names)
remaining_names.remove(filtered_name)
- self.assertEqual(remaining_names, self._test_ids(split_suite[1]))
+ self.assertEqual(remaining_names, _test_ids(split_suite[1]))
class TestCheckInventoryShape(TestCaseWithTransport):
@@ -1916,6 +1914,16 @@
module.__class__.load_tests = load_tests
self.assertEqual(2, loader.loadTestsFromModule(module).countTestCases())
+ def test_load_tests_from_module_name_smoke_test(self):
+ loader = TestUtil.TestLoader()
+ suite = loader.loadTestsFromModuleName('bzrlib.tests.test_sampler')
+ self.assertEquals(['bzrlib.tests.test_sampler.DemoTest.test_nothing'],
+ _test_ids(suite))
+
+ def test_load_tests_from_module_name_with_bougs_module_name(self):
+ loader = TestUtil.TestLoader()
+ self.assertRaises(ImportError, loader.loadTestsFromModuleName, 'bogus')
+
class TestTestIdList(tests.TestCase):
@@ -1938,10 +1946,6 @@
suite.addTest(t)
return suite
- def _test_ids(self, test_suite):
- """Get the ids for the tests in a test suite."""
- return [t.id() for t in iter_suite_tests(test_suite)]
-
def test_empty_list(self):
id_list = self._create_id_list([])
self.assertEquals({}, id_list.tests)
@@ -1976,20 +1980,20 @@
# This test is slow, so we do a single test with one test in each
# category
test_list = [
+ # packages_to_test()
+ 'bzrlib.tests.blackbox.test_branch.TestBranch.test_branch',
# testmod_names
'bzrlib.tests.test_selftest.TestTestIdList.test_test_suite',
# transport implementations
'bzrlib.tests.test_transport_implementations.TransportTests'
'.test_abspath(LocalURLServer)',
- # packages_to_test()
- 'bzrlib.tests.blackbox.test_branch.TestBranch.test_branch',
# MODULES_TO_DOCTEST
'bzrlib.timestamp.format_highres_date',
# plugins can't be tested that way since selftest may be run with
# --no-plugins
]
suite = tests.test_suite(test_list)
- self.assertEquals(test_list, self._test_ids(suite))
+ self.assertEquals(test_list, _test_ids(suite))
class TestLoadTestIdList(tests.TestCaseInTempDir):
@@ -2025,3 +2029,23 @@
self.assertEquals('bar baz', tlist[3])
+class TestFilteredByModuleTestLoader(tests.TestCase):
+
+ def _create_loader(self, test_list):
+ id_filter = tests.TestIdList(test_list)
+ loader = TestUtil.FilteredByModuleTestLoader(id_filter.refers_to)
+ return loader
+
+ def test_load_tests(self):
+ test_list = ['bzrlib.tests.test_sampler.DemoTest.test_nothing']
+ loader = self._create_loader(test_list)
+
+ suite = loader.loadTestsFromModuleName('bzrlib.tests.test_sampler')
+ self.assertEquals(test_list, _test_ids(suite))
+
+ def test_exclude_tests(self):
+ test_list = ['bogus']
+ loader = self._create_loader(test_list)
+
+ suite = loader.loadTestsFromModuleName('bzrlib.tests.test_sampler')
+ self.assertEquals([], _test_ids(suite))
More information about the bazaar-commits
mailing list