2017-02-05 11 views
7

При запуске тестов в приложениях Django, которые используют задачи Celery, я не могу полностью проверить задачи, которые должны получать данные из базы данных, поскольку они не подключаются к тестовой базе данных, что Django создает.Сделать Celery использовать тестовую базу данных Django без task_always_eager

Установка task_always_eager в сельдерее True частично решает эту проблему, но как documentation for testing говорит, это не в полной мере отражает как код будет работать на реальный сельдерей работник и не подходят для тестирования.

Как я могу заставить задачи Celery использовать тестовую базу Django при выполнении тестов Django без установки task_always_eager = True?

ответ

8

Short = Вы должны работать сельдерей работник как в производстве

Easy:

  1. Использовать выделенный тест дб (как в производстве)
  2. Настройки сельдерей использовать его
  3. Start сельдерей рабочих вручную перед проведением испытаний

Продвинутый:

  1. Используйте автоматический созданный тест дб (это может быть SQLite)
  2. Run сельдерей рабочим в тестовой нАлАдкЕ()
  3. Настройки сельдерея использовать автоматический созданный тест дб (копию django.conf.settings.DATABASE из теста процесс для сельдерея)

И всегда вы должны предоставить брокера сообщений для сельдерея.

У меня есть тест, который требует специализированного сельдерея работника, чтобы проверить мой код, который проходит сообщения между сельдереем задачей и кодами вызова: https://gist.github.com/Sovetnikov/a7ad982fc77e8dfbc528bfc20fcf3b1e Этого модуль питоном два в одном - TestUnit и сельдерей рабочего бегунок с автономной конфигурацией.

В моем коде не используется какой-либо db, но вы можете легко адаптировать его к вашим потребностям. Просто передайте django.conf.settings.DATABASE (как json или pickle или что-то еще, что вам нравится), на стартовый код сельдерея и настройте Django DATABASE, чтобы указать на тест db.

Дополнительная информация:

  1. Существует полное решение для этого случая https://github.com/RentMethod/celerytest (я пытался некоторые старые версии этого и не везет, потому что он использует темы, с питоном GIL ... и я думаю, что это слишком сложный)

  2. Пример кода, как настроить параметры базы данных и инициализации DJANGO себя в одном модуле https://gist.github.com/Sovetnikov/369a8d05ba2b6482fa20769bc498f122

0

Простым решением является use celery.contrib.testing.worker.start_worker to spawn a Celery worker within the Django test process. Поскольку он живет в одном и том же процессе, он может получить доступ к базе данных тестирования по умолчанию в памяти, но поскольку он живет в своем собственном потоке, он не горит, и флаг task_always_eager не нужен или не рекомендуется.