[1.7.x] Fixed #23421 -- Corrected TEST SERIALIZE setting.

Thanks gkoller for the report and Markus Holtermann for review.
This commit is contained in:
Tim Graham 2014-09-15 11:17:12 -04:00
parent 5356183716
commit 02aa3e30e9
5 changed files with 88 additions and 31 deletions

View File

@ -296,7 +296,7 @@ def setup_databases(verbosity, interactive, **kwargs):
test_db_name = connection.creation.create_test_db( test_db_name = connection.creation.create_test_db(
verbosity, verbosity,
autoclobber=not interactive, autoclobber=not interactive,
serialize=connection.settings_dict.get("TEST_SERIALIZE", True), serialize=connection.settings_dict.get("TEST", {}).get("SERIALIZE", True),
) )
destroy = True destroy = True
else: else:

View File

@ -704,6 +704,19 @@ test database will use the name ``'test_' + DATABASE_NAME``.
See :ref:`the-test-database`. See :ref:`the-test-database`.
.. setting:: TEST_SERIALIZE
SERIALIZE
^^^^^^^^^
.. versionadded:: 1.7.1
Boolean value to control whether or not the default test runnner serializes the
database into an in-memory JSON string before running tests (used to restore
the database state between tests if you don't have transactions). You can set
this to ``False`` to speed up creation time if you don't have any test classes
with :ref:`serialized_rollback=True <test-case-serialized-rollback>`.
.. setting:: TEST_CREATE .. setting:: TEST_CREATE
CREATE_DB CREATE_DB

View File

@ -70,3 +70,6 @@ Bugfixes
* Made ``migrations.RunSQL`` no longer require percent sign escaping. This is * Made ``migrations.RunSQL`` no longer require percent sign escaping. This is
now consistent with ``cursor.execute()`` (:ticket:`23426`). now consistent with ``cursor.execute()`` (:ticket:`23426`).
* Made the :setting:`SERIALIZE <TEST_SERIALIZE>` entry in the
:setting:`TEST <DATABASE-TEST>` dictionary usable (:ticket:`23421`).

View File

@ -507,8 +507,14 @@ can be useful during testing.
``serialize`` determines if Django serializes the database into an ``serialize`` determines if Django serializes the database into an
in-memory JSON string before running tests (used to restore the database in-memory JSON string before running tests (used to restore the database
state between tests if you don't have transactions). You can set this to state between tests if you don't have transactions). You can set this to
False to significantly speed up creation time if you know you don't need ``False`` to speed up creation time if you don't have any test classes
data persistence outside of test fixtures. with :ref:`serialized_rollback=True <test-case-serialized-rollback>`.
.. versionadded:: 1.7.1
If you are using the default test runner, you can control this with the
the :setting:`SERIALIZE <TEST_SERIALIZE>` entry in the
:setting:`TEST <DATABASE-TEST>` dictionary
Returns the name of the test database that it created. Returns the name of the test database that it created.

View File

@ -7,9 +7,10 @@ from optparse import make_option
import types import types
import unittest import unittest
from django import db
from django.core.exceptions import ImproperlyConfigured from django.core.exceptions import ImproperlyConfigured
from django.core.management import call_command from django.core.management import call_command
from django import db from django.db.backends.dummy.base import DatabaseCreation
from django.test import runner, TestCase, TransactionTestCase, skipUnlessDBFeature from django.test import runner, TestCase, TransactionTestCase, skipUnlessDBFeature
from django.test.testcases import connections_support_transactions from django.test.testcases import connections_support_transactions
from django.test.utils import ( from django.test.utils import (
@ -339,18 +340,29 @@ class AliasedDefaultTestSetupTest(unittest.TestCase):
db.connections = old_db_connections db.connections = old_db_connections
class AliasedDatabaseTeardownTest(unittest.TestCase): class SetupDatabasesTests(unittest.TestCase):
def test_setup_aliased_databases(self):
from django.db.backends.dummy.base import DatabaseCreation
runner_instance = runner.DiscoverRunner(verbosity=0) def setUp(self):
old_db_connections = db.connections self._old_db_connections = db.connections
old_destroy_test_db = DatabaseCreation.destroy_test_db self._old_destroy_test_db = DatabaseCreation.destroy_test_db
old_create_test_db = DatabaseCreation.create_test_db self._old_create_test_db = DatabaseCreation.create_test_db
try: self.runner_instance = runner.DiscoverRunner(verbosity=0)
def tearDown(self):
DatabaseCreation.create_test_db = self._old_create_test_db
DatabaseCreation.destroy_test_db = self._old_destroy_test_db
db.connections = self._old_db_connections
def test_setup_aliased_databases(self):
destroyed_names = [] destroyed_names = []
DatabaseCreation.destroy_test_db = lambda self, old_database_name, verbosity=1, serialize=True: destroyed_names.append(old_database_name) DatabaseCreation.destroy_test_db = (
DatabaseCreation.create_test_db = lambda self, verbosity=1, autoclobber=False, serialize=True: self._get_test_db_name() lambda self, old_database_name, verbosity=1, keepdb=False, serialize=True:
destroyed_names.append(old_database_name)
)
DatabaseCreation.create_test_db = (
lambda self, verbosity=1, autoclobber=False, keepdb=False, serialize=True:
self._get_test_db_name()
)
db.connections = db.ConnectionHandler({ db.connections = db.ConnectionHandler({
'default': { 'default': {
@ -363,14 +375,37 @@ class AliasedDatabaseTeardownTest(unittest.TestCase):
} }
}) })
old_config = runner_instance.setup_databases() old_config = self.runner_instance.setup_databases()
runner_instance.teardown_databases(old_config) self.runner_instance.teardown_databases(old_config)
self.assertEqual(destroyed_names.count('dbname'), 1) self.assertEqual(destroyed_names.count('dbname'), 1)
finally:
DatabaseCreation.create_test_db = old_create_test_db def test_serialization(self):
DatabaseCreation.destroy_test_db = old_destroy_test_db serialize = []
db.connections = old_db_connections DatabaseCreation.create_test_db = (
lambda *args, **kwargs: serialize.append(kwargs.get('serialize'))
)
db.connections = db.ConnectionHandler({
'default': {
'ENGINE': 'django.db.backends.dummy',
},
})
self.runner_instance.setup_databases()
self.assertEqual(serialize, [True])
def test_serialized_off(self):
serialize = []
DatabaseCreation.create_test_db = (
lambda *args, **kwargs: serialize.append(kwargs.get('serialize'))
)
db.connections = db.ConnectionHandler({
'default': {
'ENGINE': 'django.db.backends.dummy',
'TEST': {'SERIALIZE': False},
},
})
self.runner_instance.setup_databases()
self.assertEqual(serialize, [False])
class DeprecationDisplayTest(AdminScriptTestCase): class DeprecationDisplayTest(AdminScriptTestCase):