Использование 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() в этой цепочке.

Смотрите видео от Рэймонда Хеттингера: супер считается супер ( здесь).

Другие вопросы по тегам