diff options
| author | Simon Charette <charette.s@gmail.com> | 2018-07-12 00:14:24 -0400 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2019-01-10 19:11:21 -0500 |
| commit | 41e73de39df31c4b13d65462bfeedde6924226d8 (patch) | |
| tree | a5842ddf1de35a51e54ffb3c5515bd89310c988f /django | |
| parent | 8c775391b78b2a4a2b57c5e89ed4888f36aada4b (diff) | |
Fixed #28478 -- Make DiscoverRunner skip creating unused test databases.
SimpleTestCase.databases makes it possible to determine the set of
databases required to run the discovered tests.
Diffstat (limited to 'django')
| -rw-r--r-- | django/test/runner.py | 27 | ||||
| -rw-r--r-- | django/test/utils.py | 10 |
2 files changed, 32 insertions, 5 deletions
diff --git a/django/test/runner.py b/django/test/runner.py index ed969cc42f..180b6911fb 100644 --- a/django/test/runner.py +++ b/django/test/runner.py @@ -391,6 +391,9 @@ class ParallelTestSuite(unittest.TestSuite): return result + def __iter__(self): + return iter(self.subsuites) + class DiscoverRunner: """A Django test runner that uses unittest2 test discovery.""" @@ -587,6 +590,27 @@ class DiscoverRunner: def suite_result(self, suite, result, **kwargs): return len(result.failures) + len(result.errors) + def _get_databases(self, suite): + databases = set() + for test in suite: + if isinstance(test, unittest.TestCase): + test_databases = getattr(test, 'databases', None) + if test_databases == '__all__': + return set(connections) + if test_databases: + databases.update(test_databases) + else: + databases.update(self._get_databases(test)) + return databases + + def get_databases(self, suite): + databases = self._get_databases(suite) + if self.verbosity >= 2: + unused_databases = [alias for alias in connections if alias not in databases] + if unused_databases: + print('Skipping setup of unused database(s): %s.' % ', '.join(sorted(unused_databases))) + return databases + def run_tests(self, test_labels, extra_tests=None, **kwargs): """ Run the unit tests for all the test labels in the provided list. @@ -601,7 +625,8 @@ class DiscoverRunner: """ self.setup_test_environment() suite = self.build_suite(test_labels, extra_tests) - old_config = self.setup_databases() + databases = self.get_databases(suite) + old_config = self.setup_databases(aliases=databases) run_failed = False try: self.run_checks() diff --git a/django/test/utils.py b/django/test/utils.py index c8965cdbb8..057969503d 100644 --- a/django/test/utils.py +++ b/django/test/utils.py @@ -152,9 +152,9 @@ def teardown_test_environment(): del mail.outbox -def setup_databases(verbosity, interactive, keepdb=False, debug_sql=False, parallel=0, **kwargs): +def setup_databases(verbosity, interactive, keepdb=False, debug_sql=False, parallel=0, aliases=None, **kwargs): """Create the test databases.""" - test_databases, mirrored_aliases = get_unique_databases_and_mirrors() + test_databases, mirrored_aliases = get_unique_databases_and_mirrors(aliases) old_names = [] @@ -238,7 +238,7 @@ def dependency_ordered(test_databases, dependencies): return ordered_test_databases -def get_unique_databases_and_mirrors(): +def get_unique_databases_and_mirrors(aliases=None): """ Figure out which databases actually need to be created. @@ -250,6 +250,8 @@ def get_unique_databases_and_mirrors(): where all aliases share the same underlying database. - mirrored_aliases: mapping of mirror aliases to original aliases. """ + if aliases is None: + aliases = connections mirrored_aliases = {} test_databases = {} dependencies = {} @@ -262,7 +264,7 @@ def get_unique_databases_and_mirrors(): if test_settings['MIRROR']: # If the database is marked as a test mirror, save the alias. mirrored_aliases[alias] = test_settings['MIRROR'] - else: + elif alias in aliases: # Store a tuple with DB parameters that uniquely identify it. # If we have two aliases with the same values for that tuple, # we only need to create the test database once. |
