diff options
| author | Thomas Chaumeny <thomas.chaumeny@polyconseil.fr> | 2014-12-04 14:05:59 +0100 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2014-12-12 09:16:15 -0500 |
| commit | 119154ca7f65d423bb742aa0e32ffcfcb21d4b87 (patch) | |
| tree | 139d0431aeffca74686aea53c6dda99f9a26c460 /django | |
| parent | 0dea81cd6d34b3e41cc4bbec99b5fdf06142b09e (diff) | |
Refs #20392 -- Load fixtures once within TestCase
Diffstat (limited to 'django')
| -rw-r--r-- | django/test/testcases.py | 60 |
1 files changed, 31 insertions, 29 deletions
diff --git a/django/test/testcases.py b/django/test/testcases.py index 78c185ecd8..38bbd40946 100644 --- a/django/test/testcases.py +++ b/django/test/testcases.py @@ -915,24 +915,46 @@ class TestCase(TransactionTestCase): On database backends with no transaction support, TestCase behaves as TransactionTestCase. """ + @classmethod + def _enter_atomics(cls): + """Helper method to open atomic blocks for multiple databases""" + atomics = {} + for db_name in cls._databases_names(): + atomics[db_name] = transaction.atomic(using=db_name) + atomics[db_name].__enter__() + return atomics + + @classmethod + def _rollback_atomics(cls, atomics): + """Rollback atomic blocks opened through the previous method""" + for db_name in reversed(cls._databases_names()): + transaction.set_rollback(True, using=db_name) + atomics[db_name].__exit__(None, None, None) @classmethod def setUpClass(cls): super(TestCase, cls).setUpClass() if not connections_support_transactions(): return - cls.cls_atomics = {} - for db_name in cls._databases_names(): - cls.cls_atomics[db_name] = transaction.atomic(using=db_name) - cls.cls_atomics[db_name].__enter__() + cls.cls_atomics = cls._enter_atomics() + + if cls.fixtures: + for db_name in cls._databases_names(include_mirrors=False): + try: + call_command('loaddata', *cls.fixtures, **{ + 'verbosity': 0, + 'commit': False, + 'database': db_name, + }) + except Exception: + cls._rollback_atomics(cls.cls_atomics) + raise cls.setUpTestData() @classmethod def tearDownClass(cls): if connections_support_transactions(): - for db_name in reversed(cls._databases_names()): - transaction.set_rollback(True, using=db_name) - cls.cls_atomics[db_name].__exit__(None, None, None) + cls._rollback_atomics(cls.cls_atomics) for conn in connections.all(): conn.close() super(TestCase, cls).tearDownClass() @@ -955,32 +977,12 @@ class TestCase(TransactionTestCase): return super(TestCase, self)._fixture_setup() assert not self.reset_sequences, 'reset_sequences cannot be used on TestCase instances' - - self.atomics = {} - for db_name in self._databases_names(): - self.atomics[db_name] = transaction.atomic(using=db_name) - self.atomics[db_name].__enter__() - - for db_name in self._databases_names(include_mirrors=False): - if self.fixtures: - try: - call_command('loaddata', *self.fixtures, - **{ - 'verbosity': 0, - 'commit': False, - 'database': db_name, - }) - except Exception: - self._fixture_teardown() - raise + self.atomics = self._enter_atomics() def _fixture_teardown(self): if not connections_support_transactions(): return super(TestCase, self)._fixture_teardown() - - for db_name in reversed(self._databases_names()): - transaction.set_rollback(True, using=db_name) - self.atomics[db_name].__exit__(None, None, None) + self._rollback_atomics(self.atomics) class CheckCondition(object): |
