Ich habe mich entschieden, von django.test.runner.DiscoverRunner
der run_tests
Methode zu erben und sie ein paar Mal zu ergänzen .
Mein erster Zusatz prüft, ob das Einrichten einer Datenbank erforderlich ist, und ermöglicht die Aktivierung der normalen setup_databases
Funktionalität, wenn eine Datenbank erforderlich ist. Mein zweiter Zusatz ermöglicht das teardown_databases
Ausführen des Normalen , wenn die setup_databases
Methode ausgeführt werden durfte.
Mein Code geht davon aus, dass für jeden TestCase, der von django.test.TransactionTestCase
(und damit django.test.TestCase
) erbt , eine Datenbank eingerichtet werden muss. Ich habe diese Annahme gemacht, weil die Django-Dokumente sagen:
Wenn Sie eine der anderen komplexeren und schwereren Django-spezifischen Funktionen benötigen, wie ... Testen oder Verwenden des ORM ..., sollten Sie stattdessen TransactionTestCase oder TestCase verwenden.
https://docs.djangoproject.com/de/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)
Schließlich habe ich die folgende Zeile zur Datei settings.py meines Projekts hinzugefügt.
mysite / settings.py
TEST_RUNNER = 'mysite.scripts.settings.MyDiscoverRunner'
Wenn ich jetzt nur nicht db-abhängige Tests ausführe, läuft meine Testsuite um eine Größenordnung schneller! :) :)