让Celery使用Django的测试数据库而不使用task_always_eager

Osk*_*son 11 python django unit-testing celery

在使用Celery任务的Django应用程序中运行测试时,我无法完全测试需要从数据库获取数据的任务,因为它们没有连接到Django创建的测试数据库.

task_always_eager在Celery中进行设置可以True部分解决这个问题,但正如测试文档所说,这并不能完全反映代码如何在真正的Celery工作程序上运行,并且不适合测试.

如何在没有设置的情况下运行Django测试时,如何让Celery任务使用Django测试数据库task_always_eager = True

Sov*_*kov 13

短=你必须像生产一样经营芹菜工人

简单:

  1. 使用专用测试数据库(如生产中)
  2. 配置芹菜使用它
  3. 在运行测试之前手动启动芹菜工作者

高级:

  1. 使用自动创建的测试数据库(可能是sqlite)
  2. 在你的测试setUp()中运行celery worker
  3. 配置celery以使用自动创建的测试数据库(从测试过程复制django.conf.settings.DATABASE到芹菜)

总是你必须为芹菜提供消息代理.

我有一个测试需要专门的芹菜工作者检查我的代码,它在celery任务和调用代码之间传递消息:https: //gist.github.com/Sovetnikov/a7ad982fc77e8dfbc528bfc20fcf3b1e这个python模块是二合一 - 一个TestUnit和芹菜工人运行具有自包含配置.

我的代码不使用任何数据库,但您可以轻松地根据您的需要进行调整.只需将django.conf.settings.DATABASE(作为json或pickle或任何你喜欢的方法)传递给celery starter代码并配置Django DATABASE以指向测试db.

附加信息:

  1. 这个案例有完整的解决方案https://github.com/RentMethod/celerytest(我尝试了它的一些旧版本并没有运气,因为它使用线程,使用python GIL ......我认为它过于复杂)

  2. 示例代码,如何在单个模块中配置DATABASE设置和init django本身https://gist.github.com/Sovetnikov/369a8d05ba2b6482fa20769bc498f122