Django单元测试查询生产数据库

时间:2016-08-12 16:53:59

标签: python django unit-testing celery integration-testing

我正在尝试在我的Django应用程序中为异步方法编写一些单元测试。基本上,当用户执行某个POST时,此方法将启动,因此应用程序不会挂起。我想测试的是能够在运行时取消此请求(在这种情况下通过芹菜)。这样做的唯一问题是因为Celery独立于Web应用程序运行,它将结果推送到真实数据库,而不是由Django Unit Tests创建的测试数据库。所以我想知道的是我怎么能做像

这样的事情
Results.objects.get(id=some_id)

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

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

认为这可能会解决问题,但它没有找到结果(再次因为它将信息推送到实际数据库,而不是测试数据库)。我做了一些搜索,发现这个链接: How do I run a unit test against the production database?但是这里的答案说的是"你不应该对生产进行测试。"我完全理解这不是一个好习惯,但我需要点击实时数据库。一切都在VM上运行,所以它无论如何都是一个测试数据库。有没有人知道一种打击真实数据库的方法?

谢谢,

3 个答案:

答案 0 :(得分:1)

我们只能做一件坏事!

  • 在使用“说”的设置上运行您的芹菜工人和调度程序 “ 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.
    

答案 1 :(得分:0)

我不确定针对您的产品进行测试是否比在开发模式下针对您的测试数据库运行芹菜工作者更好的解决方案。你是如何开始你的芹菜工人?我想你是在使用你的prod / real设置开始测试之外的芹菜工作者,然后你使用测试设置运行你的测试。对于集成测试,如果您有集成环境,它可能会更可重复/可维护。

这个常见的测试策略是:

  • 对视图进行单元测试以确保它使用正确的参数调用正确的celery任务,您可以存根芹菜任务依赖项,或者您可以使用CELERY_ALWAYS_EAGER = True和内存队列同步运行芹菜任务。
  • 如果你剔除芹菜依赖,那么应该有一个单独的单元测试来运用它的逻辑

由于芹菜经纪人的进程间依赖性,您的原始场景不适合django单元测试框架。您的应用程序和芹菜之间的集成测试可能很有价值,但是为了可维护,可重复和可靠的芹菜代理进程启动,清理等应该以自动方式进行管理。

答案 2 :(得分:0)

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

关于起点,请参阅我在非常相似的问题https://stackoverflow.com/a/42107423/590233上的答案(有代码启动芹菜工人)

以下是在单个模块https://gist.github.com/Sovetnikov/369a8d05ba2b6482fa20769bc498f122中配置django和DATABASE设置的示例代码

只需结合两种技巧,您就可以获得所需的效果。