django - 在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() 调用相互调用。
解决方案
推荐阅读
- string - Shell 脚本 - 如何从 sting "T=50" 中获得 50?
- google-maps - 如何使用 Google Maps For Flutter 将初始相机位置设置为当前设备的经纬度
- javascript - Puppeteer 无限滚动
- angular - 使用 httpClient 和 Angular 下载 .tar 文件
- angular - 更改类名时,Swiper angular 7 不起作用
- javascript - 对 HTML 表进行排序
- android - 如何以编程方式隐藏和显示android对话框
- python - 添加除法不等式约束
- html - POS 打印机的自定义页面大小
- api - 用于更新一对一关系的 API 端点