Использование django-nose и django-celery вместе - модульное тестирование
У меня есть проект Django, который использовал Django-No. Я хотел бы добавить django-сельдерей в проект. Я использую юнит-тесты. И django-nose, и django-celery нуждаются в настройке TEST_RUNNER в моем файле settings.py. В частности:
TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'
для джанго-носа и:
TEST_RUNNER = 'djcelery.contrib.test_runner.CeleryTestSuiteRunner'
для джанго-сельдерея.
Как мне справиться с этим, чтобы я мог использовать оба пакета?
3 ответа
Я обнаружил, что лучший способ справиться с этим - пропустить тестер Celery. Я просто использую украсить мои тесты с использованием сельдерея с @override_settings(CELERY_ALWAYS_EAGER=True)
и все хорошо проверяется.
Если вы можете изолировать свои тесты от функций, зависящих от сельдерея и не из сельдерея, вы можете попробовать переопределить настройки тестовых классов, которые вызывают задачи сельдерея:
from django.test.utils import override_settings
@override_settings(TEST_RUNNER='djcelery.contrib.test_runner.CeleryTestSuiteRunner')
class AsyncTestCase(TestCase):
def test_async(self):
self.assertEquals(add.delay(4,4), 8)
в то время как NoseTestRunner будет установлен по умолчанию в settings.py
Вы можете создать подкласс бегуна из сельдерея и носа, тогда вы получите хорошие стороны для всех них.
from django_nose import NoseTestSuiteRunner
from djcelery.contrib.test_runner import CeleryTestSuiteRunner
class TestRunner(CeleryTestSuiteRunner, NoseTestSuiteRunner):
pass
Тогда в ваших настройках:
TEST_RUNNER = '<package to>.TestRunner'
Почему это работает:
help(TestRunner)
Ты получаешь:
| Method resolution order:
| TestRunner
| djcelery.contrib.test_runner.CeleryTestSuiteRunner
| django_nose.runner.NoseTestSuiteRunner
| django_nose.runner.BasicNoseRunner
| django_nose.runner.BaseRunner
| django.test.runner.DiscoverRunner
| builtins.object
Тест CeleryTestRunner ничего не сделал, просто установил некоторый конфиг и затем вызвал super().setup_test_environment()
, Тогда супер будет искать setup_test_environment() в этой цепочке.
Смотрите видео от Рэймонда Хеттингера: супер считается супер ( здесь).