Rev 4651: Refactor test_suite to make stubbing out the list of tests to load possible without sacrificing coverage. in http://bazaar.launchpad.net/~lifeless/bzr/test-speed
Robert Collins
robertc at robertcollins.net
Wed Aug 26 06:52:05 BST 2009
At http://bazaar.launchpad.net/~lifeless/bzr/test-speed
------------------------------------------------------------
revno: 4651
revision-id: robertc at robertcollins.net-20090826055156-etd2y03l2t9etab2
parent: pqm at pqm.ubuntu.com-20090825233734-ozgeetbq9aagneer
committer: Robert Collins <robertc at robertcollins.net>
branch nick: test-speed
timestamp: Wed 2009-08-26 15:51:56 +1000
message:
Refactor test_suite to make stubbing out the list of tests to load possible without sacrificing coverage.
=== modified file 'bzrlib/tests/__init__.py'
--- a/bzrlib/tests/__init__.py 2009-08-25 05:04:05 +0000
+++ b/bzrlib/tests/__init__.py 2009-08-26 05:51:56 +0000
@@ -3477,6 +3477,206 @@
test_prefix_alias_registry.register('bp', 'bzrlib.plugins')
+def _test_suite_testmod_names():
+ """Return the standard list of test module names to test."""
+ return [
+ 'bzrlib.doc',
+ 'bzrlib.tests.blackbox',
+ 'bzrlib.tests.commands',
+ 'bzrlib.tests.per_branch',
+ 'bzrlib.tests.per_bzrdir',
+ 'bzrlib.tests.per_interrepository',
+ 'bzrlib.tests.per_intertree',
+ 'bzrlib.tests.per_inventory',
+ 'bzrlib.tests.per_interbranch',
+ 'bzrlib.tests.per_lock',
+ 'bzrlib.tests.per_transport',
+ 'bzrlib.tests.per_tree',
+ 'bzrlib.tests.per_pack_repository',
+ 'bzrlib.tests.per_repository',
+ 'bzrlib.tests.per_repository_chk',
+ 'bzrlib.tests.per_repository_reference',
+ 'bzrlib.tests.per_versionedfile',
+ 'bzrlib.tests.per_workingtree',
+ 'bzrlib.tests.test__annotator',
+ 'bzrlib.tests.test__chk_map',
+ 'bzrlib.tests.test__dirstate_helpers',
+ 'bzrlib.tests.test__groupcompress',
+ 'bzrlib.tests.test__known_graph',
+ 'bzrlib.tests.test__rio',
+ 'bzrlib.tests.test__walkdirs_win32',
+ 'bzrlib.tests.test_ancestry',
+ 'bzrlib.tests.test_annotate',
+ 'bzrlib.tests.test_api',
+ 'bzrlib.tests.test_atomicfile',
+ 'bzrlib.tests.test_bad_files',
+ 'bzrlib.tests.test_bencode',
+ 'bzrlib.tests.test_bisect_multi',
+ 'bzrlib.tests.test_branch',
+ 'bzrlib.tests.test_branchbuilder',
+ 'bzrlib.tests.test_btree_index',
+ 'bzrlib.tests.test_bugtracker',
+ 'bzrlib.tests.test_bundle',
+ 'bzrlib.tests.test_bzrdir',
+ 'bzrlib.tests.test__chunks_to_lines',
+ 'bzrlib.tests.test_cache_utf8',
+ 'bzrlib.tests.test_chk_map',
+ 'bzrlib.tests.test_chk_serializer',
+ 'bzrlib.tests.test_chunk_writer',
+ 'bzrlib.tests.test_clean_tree',
+ 'bzrlib.tests.test_commands',
+ 'bzrlib.tests.test_commit',
+ 'bzrlib.tests.test_commit_merge',
+ 'bzrlib.tests.test_config',
+ 'bzrlib.tests.test_conflicts',
+ 'bzrlib.tests.test_counted_lock',
+ 'bzrlib.tests.test_crash',
+ 'bzrlib.tests.test_decorators',
+ 'bzrlib.tests.test_delta',
+ 'bzrlib.tests.test_debug',
+ 'bzrlib.tests.test_deprecated_graph',
+ 'bzrlib.tests.test_diff',
+ 'bzrlib.tests.test_directory_service',
+ 'bzrlib.tests.test_dirstate',
+ 'bzrlib.tests.test_email_message',
+ 'bzrlib.tests.test_eol_filters',
+ 'bzrlib.tests.test_errors',
+ 'bzrlib.tests.test_export',
+ 'bzrlib.tests.test_extract',
+ 'bzrlib.tests.test_fetch',
+ 'bzrlib.tests.test_fifo_cache',
+ 'bzrlib.tests.test_filters',
+ 'bzrlib.tests.test_ftp_transport',
+ 'bzrlib.tests.test_foreign',
+ 'bzrlib.tests.test_generate_docs',
+ 'bzrlib.tests.test_generate_ids',
+ 'bzrlib.tests.test_globbing',
+ 'bzrlib.tests.test_gpg',
+ 'bzrlib.tests.test_graph',
+ 'bzrlib.tests.test_groupcompress',
+ 'bzrlib.tests.test_hashcache',
+ 'bzrlib.tests.test_help',
+ 'bzrlib.tests.test_hooks',
+ 'bzrlib.tests.test_http',
+ 'bzrlib.tests.test_http_response',
+ 'bzrlib.tests.test_https_ca_bundle',
+ 'bzrlib.tests.test_identitymap',
+ 'bzrlib.tests.test_ignores',
+ 'bzrlib.tests.test_index',
+ 'bzrlib.tests.test_info',
+ 'bzrlib.tests.test_inv',
+ 'bzrlib.tests.test_inventory_delta',
+ 'bzrlib.tests.test_knit',
+ 'bzrlib.tests.test_lazy_import',
+ 'bzrlib.tests.test_lazy_regex',
+ 'bzrlib.tests.test_lock',
+ 'bzrlib.tests.test_lockable_files',
+ 'bzrlib.tests.test_lockdir',
+ 'bzrlib.tests.test_log',
+ 'bzrlib.tests.test_lru_cache',
+ 'bzrlib.tests.test_lsprof',
+ 'bzrlib.tests.test_mail_client',
+ 'bzrlib.tests.test_memorytree',
+ 'bzrlib.tests.test_merge',
+ 'bzrlib.tests.test_merge3',
+ 'bzrlib.tests.test_merge_core',
+ 'bzrlib.tests.test_merge_directive',
+ 'bzrlib.tests.test_missing',
+ 'bzrlib.tests.test_msgeditor',
+ 'bzrlib.tests.test_multiparent',
+ 'bzrlib.tests.test_mutabletree',
+ 'bzrlib.tests.test_nonascii',
+ 'bzrlib.tests.test_options',
+ 'bzrlib.tests.test_osutils',
+ 'bzrlib.tests.test_osutils_encodings',
+ 'bzrlib.tests.test_pack',
+ 'bzrlib.tests.test_patch',
+ 'bzrlib.tests.test_patches',
+ 'bzrlib.tests.test_permissions',
+ 'bzrlib.tests.test_plugins',
+ 'bzrlib.tests.test_progress',
+ 'bzrlib.tests.test_read_bundle',
+ 'bzrlib.tests.test_reconcile',
+ 'bzrlib.tests.test_reconfigure',
+ 'bzrlib.tests.test_registry',
+ 'bzrlib.tests.test_remote',
+ 'bzrlib.tests.test_rename_map',
+ 'bzrlib.tests.test_repository',
+ 'bzrlib.tests.test_revert',
+ 'bzrlib.tests.test_revision',
+ 'bzrlib.tests.test_revisionspec',
+ 'bzrlib.tests.test_revisiontree',
+ 'bzrlib.tests.test_rio',
+ 'bzrlib.tests.test_rules',
+ 'bzrlib.tests.test_sampler',
+ 'bzrlib.tests.test_selftest',
+ 'bzrlib.tests.test_serializer',
+ 'bzrlib.tests.test_setup',
+ 'bzrlib.tests.test_sftp_transport',
+ 'bzrlib.tests.test_shelf',
+ 'bzrlib.tests.test_shelf_ui',
+ 'bzrlib.tests.test_smart',
+ 'bzrlib.tests.test_smart_add',
+ 'bzrlib.tests.test_smart_request',
+ 'bzrlib.tests.test_smart_transport',
+ 'bzrlib.tests.test_smtp_connection',
+ 'bzrlib.tests.test_source',
+ 'bzrlib.tests.test_ssh_transport',
+ 'bzrlib.tests.test_status',
+ 'bzrlib.tests.test_store',
+ 'bzrlib.tests.test_strace',
+ 'bzrlib.tests.test_subsume',
+ 'bzrlib.tests.test_switch',
+ 'bzrlib.tests.test_symbol_versioning',
+ 'bzrlib.tests.test_tag',
+ 'bzrlib.tests.test_testament',
+ 'bzrlib.tests.test_textfile',
+ 'bzrlib.tests.test_textmerge',
+ 'bzrlib.tests.test_timestamp',
+ 'bzrlib.tests.test_trace',
+ 'bzrlib.tests.test_transactions',
+ 'bzrlib.tests.test_transform',
+ 'bzrlib.tests.test_transport',
+ 'bzrlib.tests.test_transport_log',
+ 'bzrlib.tests.test_tree',
+ 'bzrlib.tests.test_treebuilder',
+ 'bzrlib.tests.test_tsort',
+ 'bzrlib.tests.test_tuned_gzip',
+ 'bzrlib.tests.test_ui',
+ 'bzrlib.tests.test_uncommit',
+ 'bzrlib.tests.test_upgrade',
+ 'bzrlib.tests.test_upgrade_stacked',
+ 'bzrlib.tests.test_urlutils',
+ 'bzrlib.tests.test_version',
+ 'bzrlib.tests.test_version_info',
+ 'bzrlib.tests.test_weave',
+ 'bzrlib.tests.test_whitebox',
+ 'bzrlib.tests.test_win32utils',
+ 'bzrlib.tests.test_workingtree',
+ 'bzrlib.tests.test_workingtree_4',
+ 'bzrlib.tests.test_wsgi',
+ 'bzrlib.tests.test_xml',
+ ]
+
+
+def _test_suite_modules_to_doctest():
+ """Return the list of modules to doctest."""
+ return [
+ 'bzrlib',
+ 'bzrlib.branchbuilder',
+ 'bzrlib.export',
+ 'bzrlib.inventory',
+ 'bzrlib.iterablefile',
+ 'bzrlib.lockdir',
+ 'bzrlib.merge3',
+ 'bzrlib.option',
+ 'bzrlib.symbol_versioning',
+ 'bzrlib.tests',
+ 'bzrlib.timestamp',
+ 'bzrlib.version_info_formats.format_custom',
+ ]
+
+
def test_suite(keep_only=None, starting_with=None):
"""Build and return TestSuite for the whole of bzrlib.
@@ -3488,184 +3688,6 @@
This function can be replaced if you need to change the default test
suite on a global basis, but it is not encouraged.
"""
- testmod_names = [
- 'bzrlib.doc',
- 'bzrlib.tests.blackbox',
- 'bzrlib.tests.commands',
- 'bzrlib.tests.per_branch',
- 'bzrlib.tests.per_bzrdir',
- 'bzrlib.tests.per_interrepository',
- 'bzrlib.tests.per_intertree',
- 'bzrlib.tests.per_inventory',
- 'bzrlib.tests.per_interbranch',
- 'bzrlib.tests.per_lock',
- 'bzrlib.tests.per_transport',
- 'bzrlib.tests.per_tree',
- 'bzrlib.tests.per_pack_repository',
- 'bzrlib.tests.per_repository',
- 'bzrlib.tests.per_repository_chk',
- 'bzrlib.tests.per_repository_reference',
- 'bzrlib.tests.per_versionedfile',
- 'bzrlib.tests.per_workingtree',
- 'bzrlib.tests.test__annotator',
- 'bzrlib.tests.test__chk_map',
- 'bzrlib.tests.test__dirstate_helpers',
- 'bzrlib.tests.test__groupcompress',
- 'bzrlib.tests.test__known_graph',
- 'bzrlib.tests.test__rio',
- 'bzrlib.tests.test__walkdirs_win32',
- 'bzrlib.tests.test_ancestry',
- 'bzrlib.tests.test_annotate',
- 'bzrlib.tests.test_api',
- 'bzrlib.tests.test_atomicfile',
- 'bzrlib.tests.test_bad_files',
- 'bzrlib.tests.test_bencode',
- 'bzrlib.tests.test_bisect_multi',
- 'bzrlib.tests.test_branch',
- 'bzrlib.tests.test_branchbuilder',
- 'bzrlib.tests.test_btree_index',
- 'bzrlib.tests.test_bugtracker',
- 'bzrlib.tests.test_bundle',
- 'bzrlib.tests.test_bzrdir',
- 'bzrlib.tests.test__chunks_to_lines',
- 'bzrlib.tests.test_cache_utf8',
- 'bzrlib.tests.test_chk_map',
- 'bzrlib.tests.test_chk_serializer',
- 'bzrlib.tests.test_chunk_writer',
- 'bzrlib.tests.test_clean_tree',
- 'bzrlib.tests.test_commands',
- 'bzrlib.tests.test_commit',
- 'bzrlib.tests.test_commit_merge',
- 'bzrlib.tests.test_config',
- 'bzrlib.tests.test_conflicts',
- 'bzrlib.tests.test_counted_lock',
- 'bzrlib.tests.test_crash',
- 'bzrlib.tests.test_decorators',
- 'bzrlib.tests.test_delta',
- 'bzrlib.tests.test_debug',
- 'bzrlib.tests.test_deprecated_graph',
- 'bzrlib.tests.test_diff',
- 'bzrlib.tests.test_directory_service',
- 'bzrlib.tests.test_dirstate',
- 'bzrlib.tests.test_email_message',
- 'bzrlib.tests.test_eol_filters',
- 'bzrlib.tests.test_errors',
- 'bzrlib.tests.test_export',
- 'bzrlib.tests.test_extract',
- 'bzrlib.tests.test_fetch',
- 'bzrlib.tests.test_fifo_cache',
- 'bzrlib.tests.test_filters',
- 'bzrlib.tests.test_ftp_transport',
- 'bzrlib.tests.test_foreign',
- 'bzrlib.tests.test_generate_docs',
- 'bzrlib.tests.test_generate_ids',
- 'bzrlib.tests.test_globbing',
- 'bzrlib.tests.test_gpg',
- 'bzrlib.tests.test_graph',
- 'bzrlib.tests.test_groupcompress',
- 'bzrlib.tests.test_hashcache',
- 'bzrlib.tests.test_help',
- 'bzrlib.tests.test_hooks',
- 'bzrlib.tests.test_http',
- 'bzrlib.tests.test_http_response',
- 'bzrlib.tests.test_https_ca_bundle',
- 'bzrlib.tests.test_identitymap',
- 'bzrlib.tests.test_ignores',
- 'bzrlib.tests.test_index',
- 'bzrlib.tests.test_info',
- 'bzrlib.tests.test_inv',
- 'bzrlib.tests.test_inventory_delta',
- 'bzrlib.tests.test_knit',
- 'bzrlib.tests.test_lazy_import',
- 'bzrlib.tests.test_lazy_regex',
- 'bzrlib.tests.test_lock',
- 'bzrlib.tests.test_lockable_files',
- 'bzrlib.tests.test_lockdir',
- 'bzrlib.tests.test_log',
- 'bzrlib.tests.test_lru_cache',
- 'bzrlib.tests.test_lsprof',
- 'bzrlib.tests.test_mail_client',
- 'bzrlib.tests.test_memorytree',
- 'bzrlib.tests.test_merge',
- 'bzrlib.tests.test_merge3',
- 'bzrlib.tests.test_merge_core',
- 'bzrlib.tests.test_merge_directive',
- 'bzrlib.tests.test_missing',
- 'bzrlib.tests.test_msgeditor',
- 'bzrlib.tests.test_multiparent',
- 'bzrlib.tests.test_mutabletree',
- 'bzrlib.tests.test_nonascii',
- 'bzrlib.tests.test_options',
- 'bzrlib.tests.test_osutils',
- 'bzrlib.tests.test_osutils_encodings',
- 'bzrlib.tests.test_pack',
- 'bzrlib.tests.test_patch',
- 'bzrlib.tests.test_patches',
- 'bzrlib.tests.test_permissions',
- 'bzrlib.tests.test_plugins',
- 'bzrlib.tests.test_progress',
- 'bzrlib.tests.test_read_bundle',
- 'bzrlib.tests.test_reconcile',
- 'bzrlib.tests.test_reconfigure',
- 'bzrlib.tests.test_registry',
- 'bzrlib.tests.test_remote',
- 'bzrlib.tests.test_rename_map',
- 'bzrlib.tests.test_repository',
- 'bzrlib.tests.test_revert',
- 'bzrlib.tests.test_revision',
- 'bzrlib.tests.test_revisionspec',
- 'bzrlib.tests.test_revisiontree',
- 'bzrlib.tests.test_rio',
- 'bzrlib.tests.test_rules',
- 'bzrlib.tests.test_sampler',
- 'bzrlib.tests.test_selftest',
- 'bzrlib.tests.test_serializer',
- 'bzrlib.tests.test_setup',
- 'bzrlib.tests.test_sftp_transport',
- 'bzrlib.tests.test_shelf',
- 'bzrlib.tests.test_shelf_ui',
- 'bzrlib.tests.test_smart',
- 'bzrlib.tests.test_smart_add',
- 'bzrlib.tests.test_smart_request',
- 'bzrlib.tests.test_smart_transport',
- 'bzrlib.tests.test_smtp_connection',
- 'bzrlib.tests.test_source',
- 'bzrlib.tests.test_ssh_transport',
- 'bzrlib.tests.test_status',
- 'bzrlib.tests.test_store',
- 'bzrlib.tests.test_strace',
- 'bzrlib.tests.test_subsume',
- 'bzrlib.tests.test_switch',
- 'bzrlib.tests.test_symbol_versioning',
- 'bzrlib.tests.test_tag',
- 'bzrlib.tests.test_testament',
- 'bzrlib.tests.test_textfile',
- 'bzrlib.tests.test_textmerge',
- 'bzrlib.tests.test_timestamp',
- 'bzrlib.tests.test_trace',
- 'bzrlib.tests.test_transactions',
- 'bzrlib.tests.test_transform',
- 'bzrlib.tests.test_transport',
- 'bzrlib.tests.test_transport_log',
- 'bzrlib.tests.test_tree',
- 'bzrlib.tests.test_treebuilder',
- 'bzrlib.tests.test_tsort',
- 'bzrlib.tests.test_tuned_gzip',
- 'bzrlib.tests.test_ui',
- 'bzrlib.tests.test_uncommit',
- 'bzrlib.tests.test_upgrade',
- 'bzrlib.tests.test_upgrade_stacked',
- 'bzrlib.tests.test_urlutils',
- 'bzrlib.tests.test_version',
- 'bzrlib.tests.test_version_info',
- 'bzrlib.tests.test_weave',
- 'bzrlib.tests.test_whitebox',
- 'bzrlib.tests.test_win32utils',
- 'bzrlib.tests.test_workingtree',
- 'bzrlib.tests.test_workingtree_4',
- 'bzrlib.tests.test_wsgi',
- 'bzrlib.tests.test_xml',
- ]
loader = TestUtil.TestLoader()
@@ -3700,24 +3722,9 @@
suite = loader.suiteClass()
# modules building their suite with loadTestsFromModuleNames
- suite.addTest(loader.loadTestsFromModuleNames(testmod_names))
-
- modules_to_doctest = [
- 'bzrlib',
- 'bzrlib.branchbuilder',
- 'bzrlib.export',
- 'bzrlib.inventory',
- 'bzrlib.iterablefile',
- 'bzrlib.lockdir',
- 'bzrlib.merge3',
- 'bzrlib.option',
- 'bzrlib.symbol_versioning',
- 'bzrlib.tests',
- 'bzrlib.timestamp',
- 'bzrlib.version_info_formats.format_custom',
- ]
-
- for mod in modules_to_doctest:
+ suite.addTest(loader.loadTestsFromModuleNames(_test_suite_testmod_names()))
+
+ for mod in _test_suite_modules_to_doctest():
if not interesting_module(mod):
# No tests to keep here, move along
continue
=== modified file 'bzrlib/tests/test_selftest.py'
--- a/bzrlib/tests/test_selftest.py 2009-08-25 08:11:17 +0000
+++ b/bzrlib/tests/test_selftest.py 2009-08-26 05:51:56 +0000
@@ -2726,10 +2726,52 @@
class TestTestSuite(tests.TestCase):
+ def test__test_suite_testmod_names(self):
+ # Test that a plausible list of test module names are returned
+ # by _test_suite_testmod_names.
+ test_list = tests._test_suite_testmod_names()
+ self.assertSubset([
+ 'bzrlib.tests.blackbox',
+ 'bzrlib.tests.per_transport',
+ 'bzrlib.tests.test_selftest',
+ ],
+ test_list)
+
+ def test__test_suite_modules_to_doctest(self):
+ # Test that a plausible list of modules to doctest is returned
+ # by _test_suite_modules_to_doctest.
+ test_list = tests._test_suite_modules_to_doctest()
+ self.assertSubset([
+ 'bzrlib.timestamp',
+ ],
+ test_list)
+
def test_test_suite(self):
- # This test is slow - it loads the entire test suite to operate, so we
- # do a single test with one test in each category
- test_list = [
+ # test_suite() loads the entire test suite to operate. To avoid this
+ # overhead, and yet still be confident that things are happening,
+ # we temporarily replace two functions used by test_suite with
+ # test doubles that supply a few sample tests to load, and check they
+ # are loaded.
+ calls = []
+ def _test_suite_testmod_names():
+ calls.append("testmod_names")
+ return [
+ 'bzrlib.tests.blackbox.test_branch',
+ 'bzrlib.tests.per_transport',
+ 'bzrlib.tests.test_selftest',
+ ]
+ original_testmod_names = tests._test_suite_testmod_names
+ def _test_suite_modules_to_doctest():
+ calls.append("modules_to_doctest")
+ return ['bzrlib.timestamp']
+ orig_modules_to_doctest = tests._test_suite_modules_to_doctest
+ def restore_names():
+ tests._test_suite_testmod_names = original_testmod_names
+ tests._test_suite_modules_to_doctest = orig_modules_to_doctest
+ self.addCleanup(restore_names)
+ tests._test_suite_testmod_names = _test_suite_testmod_names
+ tests._test_suite_modules_to_doctest = _test_suite_modules_to_doctest
+ expected_test_list = [
# testmod_names
'bzrlib.tests.blackbox.test_branch.TestBranch.test_branch',
('bzrlib.tests.per_transport.TransportTests'
@@ -2740,15 +2782,18 @@
# 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, _test_ids(suite))
+ suite = tests.test_suite()
+ self.assertEqual(set(["testmod_names", "modules_to_doctest"]),
+ set(calls))
+ self.assertSubset(expected_test_list, _test_ids(suite))
def test_test_suite_list_and_start(self):
# We cannot test this at the same time as the main load, because we want
- # to know that starting_with == None works. So a second full load is
- # incurred.
+ # to know that starting_with == None works. So a second load is #
+ # incurred. Note that the starting_with parameter causes a partial load
+ # rather than a full load.
test_list = ['bzrlib.tests.test_selftest.TestTestSuite.test_test_suite']
- suite = tests.test_suite(test_list,
+ suite = tests.test_suite(None,
['bzrlib.tests.test_selftest.TestTestSuite'])
# test_test_suite_list_and_start is not included
self.assertEquals(test_list, _test_ids(suite))
More information about the bazaar-commits
mailing list