Я выбрал наследование от django.test.runner.DiscoverRunner
и внес несколько дополнений в метод run_tests
.
Мое первое добавление проверяет, необходима ли настройка БД, и позволяет задействовать обычную функциональность setup_databases
, если БД необходима.Мое второе добавление позволяет запускать обычный teardown_databases
, если разрешен запуск метода setup_databases
.
Мой код предполагает, что для любого TestCase, который наследуется от django.test.TransactionTestCase
(и, следовательно, django.test.TestCase
), требуется база данных.быть настроенным.Я сделал это предположение, потому что документы Django говорят:
Если вам нужны какие-либо другие более сложные и тяжелые функции, специфичные для Django, такие как ... Тестирование или использование ORM ... тогда вы должны использоватьВместо TransactionTestCase или TestCase.
https://docs.djangoproject.com/en/1.6/topics/testing/tools/#django.test.SimpleTestCase
mysite / scripts / settings.py
from django.test import TransactionTestCase
from django.test.runner import DiscoverRunner
class MyDiscoverRunner(DiscoverRunner):
def run_tests(self, test_labels, extra_tests=None, **kwargs):
"""
Run the unit tests for all the test labels in the provided list.
Test labels should be dotted Python paths to test modules, test
classes, or test methods.
A list of 'extra' tests may also be provided; these tests
will be added to the test suite.
If any of the tests in the test suite inherit from
``django.test.TransactionTestCase``, databases will be setup.
Otherwise, databases will not be set up.
Returns the number of tests that failed.
"""
self.setup_test_environment()
suite = self.build_suite(test_labels, extra_tests)
# ----------------- First Addition --------------
need_databases = any(isinstance(test_case, TransactionTestCase)
for test_case in suite)
old_config = None
if need_databases:
# --------------- End First Addition ------------
old_config = self.setup_databases()
result = self.run_suite(suite)
# ----------------- Second Addition -------------
if need_databases:
# --------------- End Second Addition -----------
self.teardown_databases(old_config)
self.teardown_test_environment()
return self.suite_result(suite, result)
Наконец, я добавил следующую строку в настройки своего проекта.py файл.
mysite / settings.py
TEST_RUNNER = 'mysite.scripts.settings.MyDiscoverRunner'
Теперь, когда я запускаю только тесты, не зависящие от БД, мой набор тестов работает на порядок быстрее!:)