运行连接到Django Test DB的Celery worker

And*_*res 8 python testing django multithreading celery

背景:我正在开发一个项目,该项目使用Celery来安排将来某个时间运行的任务.这些任务推动了最终状态机的状态.这是一个例子:

  • 未来的提醒计划在2天内发送给用户.
  • 当该计划任务运行时,将发送电子邮件,并且FSM将前进到下一个状态
  • 下一个状态是安排提醒在另外两天内运行
  • 当此任务运行时,它将发送另一封电子邮件,提前状态
  • 等等...

我正在使用这个SO答案所建议的CELERY_ALWAYS_EAGER

在测试中使用该技术的问题在于,任务代码(在单独的线程中运行)与调度它的运行在同一个线程中.这会导致FSM状态无法正确保存,并且难以测试.我无法确定究竟是什么导致它,但似乎在调用堆栈的底部你保存到当前状态,但是当你返回调用堆栈时,正在保存先前的状态.我可能会花更多的时间来确定代码没有运行时出现的问题,但尝试让代码运行应该如何运行并确保它正在做它应该做的事情似乎更合乎逻辑.

问题:因此,我想知道是否有办法在django可以在测试运行期间使用芹菜设置.如果它可以自动运行,那将是理想的,但即使是一些人工干预也不如手动测试行为.我认为如果我在测试中设置一个中断,运行芹菜工作者连接到测试数据库,继续django测试,可能有可能.以前有人试过这样的事吗?

Ric*_*nop 1

您想要做的不是单元测试,而是功能/集成测试。

我建议使用一些 BDD 框架(Behave、Lettuce),并从 CI 服务器(TravisCI 或 Jenkins)针对外部服务器(例如临时环境)运行 BDD 测试。

所以,这个过程可能是:

  1. 将更改推送到 GitHub
  2. GitHub 在 CI 服务器上启动构建
  3. CI 服务器运行单元测试
  4. CI 服务器部署到集成环境(或暂存环境,如果您没有集成)
  5. CI 服务器针对新部署的代码运行集成端到端测试
  6. 如果一切成功,此构建将提升为“可以部署到生产”或类似的内容