我试图在我的Django应用程序中编写一些异步方法的单元测试。本质上,当用户执行某个POST时,该方法被启动,因此应用程序不会挂起。我想测试的是在请求运行时取消请求的能力(在本例中是通过芹菜)。这样做的唯一问题是,因为芹菜是独立于web应用程序运行的,它将结果推送到真正的数据库,而不是由Django单元测试创建的测试数据库。所以我想知道的是我怎样才能做一些像
这样的事情Results.objects.get(id=some_id)
并告诉它指向实际的数据库。我已经试过了:
Results.objects.using('default').get(id=some_id)
认为这可能会解决问题,但它没有找到结果(再次因为它将信息推送到实际数据库,而不是测试数据库)。我做了一些搜索,发现了这个链接:如何对生产数据库运行单元测试?但这里的答案是"你不应该针对生产环境进行测试。"我完全理解这不是一个好的做法,但我需要访问实时数据库。所有东西都在VM上运行,所以无论如何都是一个测试数据库。有谁知道怎么进入真正的数据库吗?
谢谢,
有一件事我们可以做,一个肮脏的把戏!
- 运行你的芹菜工作器和调度器在一个设置上使用说"new_one"数据库。
-
你应该有一个像这样的settings.py -
DATABASES = { 'default': { 'TEST': { 'NAME': 'new_one', }, } } db_from_env = dj_database_url.config(default=config('DATABASE_URL')) DATABASES['default'].update(db_from_env)
-
然后在另一个数据库上运行django服务器,说
"another_new_one"。 运行您的测试用例,它们将通过。为什么?测试用例正在使用'new_one'数据库,芹菜也使用'new_one'数据库,你的Django服务器使用'another_new_one'。干杯! 我试着给相同的名称测试和生产数据库,但是在运行测试的数据库时出现错误已经被别人使用了,这个人就是django服务器。所以需要两个不同的数据库,1- new_one 2-another_new_one
Note- I have used .env file to use config(), where I have my production database name host user password etc. It can change according to what you use. Just use two different databases and do this dirty trick, it will work. As it worked for me.
我不确定对prod进行测试是否比在开发模式下对测试数据库运行芹菜工作程序更好。你是怎么开始你的芹菜工人的?我想象您使用prod/real设置在测试外部启动您的芹菜工作程序,然后使用测试设置运行您的测试。对于集成测试,如果您有一个集成环境,那么它的可重复性/可维护性可能会更好。
一个常见的测试策略是:- 单元测试你的视图,以确保它调用正确的芹菜任务与正确的参数,你可以存根芹菜任务依赖,或者你可以运行芹菜任务同步使用CELERY_ALWAYS_EAGER=True,并在内存队列。
- 如果你删除了芹菜依赖,那么应该有一个单独的单元测试执行它的逻辑
你原来的场景不太适合django单元测试框架,因为芹菜代理的进程间依赖。你的应用程序和芹菜之间的集成测试可能是有价值的,但为了它是可维护的,可重复的,可靠的芹菜代理进程启动,清理等应该以一种自动化的方式进行管理。
如果你真的想从单元测试中运行专用的芹菜工作进程,那么你需要从setUp()(或任何你想要的方法)中启动芹菜工作进程,并将django.conf.settings.DATABASE从测试进程复制到芹菜工作进程。
对于起点,请参阅我对非常类似问题的回答https://stackoverflow.com/a/42107423/590233(有启动芹菜工人的代码)
下面是在单个模块中配置django和DATABASE设置的示例代码https://gist.github.com/Sovetnikov/369a8d05ba2b6482fa20769bc498f122