运行连接到Django Test DB的Celery worker

时间:2013-12-17 15:54:47

标签: python django multithreading testing celery

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

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

我目前正在使用this SO answer建议的CELERY_ALWAYS_EAGER

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

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

1 个答案:

答案 0 :(得分:1)

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

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

所以,这个过程可能是:

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