Zdecydowałem się odziedziczyć django.test.runner.DiscoverRunner
i dodać kilka elementów do run_tests
metody.
Mój pierwszy dodatek sprawdza, czy ustawienie bazy danych jest konieczne i pozwala na uruchomienie normalnej setup_databases
funkcjonalności, jeśli baza danych jest konieczna. Mój drugi dodatek pozwala normalnie teardown_databases
działać, jeśli setup_databases
metoda była dozwolona.
W moim kodzie założono, że każda sprawa TestCase, która dziedziczy z django.test.TransactionTestCase
(a tym samym django.test.TestCase
) wymaga skonfigurowania bazy danych. Zrobiłem to założenie, ponieważ doktorzy Django mówią:
Jeśli potrzebujesz innych, bardziej złożonych i ciężkich funkcji specyficznych dla Django, takich jak ... Testowanie lub używanie ORM ..., powinieneś zamiast tego użyć TransactionTestCase lub 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)
Na koniec dodałem następujący wiersz do pliku settings.py mojego projektu.
mysite / settings.py
TEST_RUNNER = 'mysite.scripts.settings.MyDiscoverRunner'
Teraz, gdy uruchamiam tylko testy niezależne od db, mój zestaw testów działa o rząd wielkości szybciej! :)