J'ai choisi d'hériter django.test.runner.DiscoverRunner
et de faire quelques ajouts à la run_tests
méthode.
Mon premier ajout vérifie si la configuration d'une base de données est nécessaire et permet à la setup_databases
fonctionnalité normale de démarrer si une base de données est nécessaire. Mon deuxième ajout permet à la normale teardown_databases
de fonctionner si lesetup_databases
méthode était autorisée à s'exécuter.
Mon code suppose que tout TestCase qui hérite de django.test.TransactionTestCase
(et donc django.test.TestCase
) nécessite la configuration d'une base de données. J'ai fait cette hypothèse parce que la documentation Django dit:
Si vous avez besoin de l'une des autres fonctionnalités plus complexes et plus lourdes spécifiques à Django comme ... Tester ou utiliser l'ORM ... alors vous devriez utiliser TransactionTestCase ou TestCase à la place.
https://docs.djangoproject.com/en/1.6/topics/testing/tools/#django.test.SimpleTestCase
monsite / 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)
Enfin, j'ai ajouté la ligne suivante au fichier settings.py de mon projet.
monsite / settings.py
TEST_RUNNER = 'mysite.scripts.settings.MyDiscoverRunner'
Maintenant, lorsque j'exécute uniquement des tests non dépendants de la base de données, ma suite de tests exécute un ordre de grandeur plus rapide! :)