Один из возможных подходов - написать собственный бегун, который расширил бы django.test.simple.DjangoTestSuiteRunner
и переопределил бы метод build_suite
.Вот где Django генерирует набор, используемый командой test
.
Получает аргумент test_labels
, который соответствует аргументам командной строки, переданным команде.Вы можете расширить его функциональность, разрешив передавать дополнительные пути к модулям, из которых следует загружать тесты.Что-то вроде этого должно сработать (это просто для демонстрации подхода, я не тестировал код):
from django.test.simple import DjangoTestSuiteRunner
from django.utils import unittest
from django.utils.importlib import import_module
class MyTestSuiteRunner(DjangoTestSuiteRunner):
def build_suite(self, test_labels, extra_tests=None, *args, **kwargs):
if test_labels:
extra_test_modules = [label.lstrip('module:')
for label in test_labels
if label.startswith('module:')]
extra_tests = extra_tests or []
for module_path in extra_test_modules:
# Better way to load the tests here would probably be to use
# `django.test.siple.build_suite` as it does some extra stuff like looking for doctests.
extra_tests += unittest.defaultTestLoader.loadTestsFromModule(import_module(module_path))
# Remove the 'module:*' labels
test_labels = [label for label in test_labels if not label.startswith('module:')]
# Let Django do the rest
return super(MyTestSuiteRunner, self).build_suite(test_labels, extra_tests, *args, **kwargs)
Теперь вы сможете запускать команду test
точно так же, как и раньше,за исключением того, что любая метка, которая выглядит следующим образом module:api.test.extra
, приведет к тому, что все тесты / наборы из модуля будут добавлены в окончательный набор.
Обратите внимание, что метки 'module:' не являются метками приложения, поэтомудолжен быть полный путь Python к модулю.
Вам также нужно будет указать свои настройки TEST_RUNNER
для вашего нового бегуна.