summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authorSimon Charette <charette.s@gmail.com>2018-07-12 00:14:24 -0400
committerTim Graham <timograham@gmail.com>2019-01-10 19:11:21 -0500
commit41e73de39df31c4b13d65462bfeedde6924226d8 (patch)
treea5842ddf1de35a51e54ffb3c5515bd89310c988f /django
parent8c775391b78b2a4a2b57c5e89ed4888f36aada4b (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.py27
-rw-r--r--django/test/utils.py10
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.