首页 > 解决方案 > 在docker中使用芹菜进行Django Selenium功能测试

问题描述

背景:我有一个 Django 应用程序,我想为它编写测试。我编写了一个 docker-compose.yml 文件,以便我可以快速轻松地部署在服务器上。该应用程序在 celery 和 redis 作为其代理的帮助下工作。selenium 测试的整个过程也是通过 docker 完成的,我在其中部署 selenium hub 以及 chrome 和 firefox 的节点。

问题:当我运行python manage.py test app_name.tests.test_forms我的固定装置并且硒连接成功时,测试类继承自 StaticLiveServerTestCase。但是当我从 celery 调用一个任务时app_name.tasks.task_name.delay(),很明显在导入它之后,我注意到这些任务在我的 celery worker 容器上运行,该容器用于生产应用程序并进行了任务应该在测试数据库中进行的更改,它在生产数据库中进行。我已经尝试了多种可能的解决方案,例如在测试类上方添加@override_settings(CELERY_TASK_EAGER_PROPAGATES=True,CELERY_TASK_ALWAYS_EAGER=True,BROKER_BACKEND='memory') 它还尝试使用 setUpClass 中的以下内容在测试线程中启动 celery_worker:

cls.celery_worker = start_worker(app,perform_ping_check=False) 

cls.celery_worker.__enter__()

在 tearDownCass 中:

cls.celery_worker.__exit__(None, None, None)

并得到以下错误:

    ERROR/MainProcess] pidbox command error: AttributeError("'NoneType' object has no attribute 'groups'")
Traceback (most recent call last):
  File "/usr/local/lib/python3.7/site-packages/kombu/pidbox.py", line 104, in dispatch
    reply = handle(method, arguments)
  File "/usr/local/lib/python3.7/site-packages/kombu/pidbox.py", line 126, in handle_cast
    return self.handle(method, arguments)
  File "/usr/local/lib/python3.7/site-packages/kombu/pidbox.py", line 120, in handle
    return self.handlers[method](self.state, **arguments)
  File "/usr/local/lib/python3.7/site-packages/celery/worker/control.py", line 279, in enable_events
    if dispatcher.groups and 'task' not in dispatcher.groups:
AttributeError: 'NoneType' object has no attribute 'groups'

但是即使遇到此错误,生产数据库中的更改仍然会发生。我遗漏了一些东西,任何人都可以帮助我如何使 celery 任务在测试数据库中进行更改。我是否遵循不良做法?我只是希望我可以让我的 selenium 填写测试所需的表格,并且 celery 任务完成他们的工作并在一些处理后更新数据库,我可以在测试类中断言它们。
谢谢,任何帮助将不胜感激。
注意: celery 任务是嵌套的,即它们通过 .delay() 或 .apply_async() 调用相互调用。

标签: djangodockerunit-testingcelerydjango-celery

解决方案


推荐阅读