2016-08-12 102 views
1

我想在我的Django应用程序中为异步方法编写一些单元测试。实质上,当用户执行特定的POST时,此方法将启动,因此应用程序不会挂起。我想测试的是在运行时取消该请求的能力(在本例中是通过芹菜)。这样做的唯一问题是,因为Celery独立于Web应用程序运行,所以它将结果推送到真正的数据库,而不是由Django Unit Tests创建的测试数据库。所以我想知道的是,我将如何能够做到像针对生产数据库的Django单元测试查询

Results.objects.get(id=some_id) 

并告诉它指向实际的数据库。我已经尝试了以下内容:

Results.objects.using('default').get(id=some_id) 

想,也许这将解决这个问题,但没有找到结果(因为它是推动信息到实际的数据库再次,不是测试DB) 。我做了一些搜索,发现这个链接: How do I run a unit test against the production database?但这里的答案说“你不应该对生产进行测试”。我完全明白这不是好的做法,但我需要击中实时数据库。一切都在虚拟机上运行,​​因此无论如何它都是测试数据库。有谁知道一种方法来打真正的数据库?

感谢,

+0

你是如何开始你的芹菜工人? – dm03514

回答

0

我不知道是否对你的督促测试比运行你的芹菜工人开发模式对你的测试数据库更好的解决方案。你怎么开始你的芹菜工人?我想象你正在使用prod/real设置开始测试以外的芹菜工作人员,然后使用测试设置运行测试。对于集成测试,如果您拥有集成环境,它可能会更具可重复性/可维护性。

一个常见的测试策略是:

  • 单元测试以确保它调用正确的参数正确的芹菜任务,你可以存根出的芹菜任务相关,或者你可以使用CELERY_ALWAYS_EAGER = True同步运行芹菜任务,并使用内存队列。
  • ,如果你存根出了芹菜的依赖,那么就应该有一个独立的单元测试行使其逻辑

你的原始方案是因为芹菜的进程间依赖的不是超级适合于Django的单元测试框架经纪人。您的应用程序和芹菜之间的集成测试可能是有价值的,但是为了维护,可重复和可靠的芹菜经纪人流程启动,清理等应该可以用自动化的方式进行管理。

+0

理想情况下,我将能够同步运行芹菜任务是的。不幸的是,程序编码的方式,它必须在单元测试中异步运行,因为它经常检查某个对象的状态。如果此对象的字符串字段的值设置为“取消”,则在执行过程中取消该任务。很明显,如果我同步运行,我会遇到无法测试这个“取消”情况的问题。 –

0

如果你真的想从单元测试运行专用芹菜工作进程,那么你需要从setUp()(或任何你想要的方法)启动芹菜工作者,并将django.conf.settings.DATABASE从测试过程复制到芹菜工作进程。

为起点看到非常类似的问题https://stackoverflow.com/a/42107423/590233我的答案(有启动芹菜工人代码)

这里是配置单模块https://gist.github.com/Sovetnikov/369a8d05ba2b6482fa20769bc498f122

内Django和数据库设置就结合两个示例代码技巧,你会得到你想要的。