使用线程模块完成测试后,Django不会退出

问题描述 投票:1回答:1

我正在使用django.test.SimpleTestCase进行集成测试。 运行python manage.py test后,测试成功运行,终端挂起并显示以下消息:

---------------------------
Ran 5 tests in 1.365s

OK

问题是目前我使用CTRL + C返回终端,但我希望在CI / CD管道中进行自动化测试。

我在执行测试的方式上做错了吗?或者这种行为是否正常?在这种情况下,Bash中是否有一种方式以编程方式执行然后退出测试?

编辑: 在深入分析我的应用程序后,我能够确定导致该行为的原因。我在threading中使用views.py,如下所示:

def __pooling():
  wait_time = 10
  call_remote_server()
  threading.Timer(wait_time, __pooling).start()

__pooling()

基本上我需要我的应用程序不时地异步执行某些操作。我应该改变我的汇集方式吗?或者我应该在测试期间禁用它(如何?)?

python django bash python-multithreading django-testing
1个回答
1
投票

我能够确定造成这种行为的原因。我在threading中使用views.py,如下所示:

def __pooling():
  wait_time = 10
  call_remote_server()
  threading.Timer(wait_time, __pooling).start()

__pooling()

基本上我需要我的应用程序不时地异步执行某些操作。我应该改变我的汇集方式吗?

我并不完全了解您的需求,但更传统的方法是在Django本身之外安排任​​务(可能是management command)。像cronWindows Task Scheduler这样的操作系统级调度程序,如APScheduler,或像Celery这样的任务队列都是合理的选择。

或者我应该在测试期间禁用它(如何?)?

我不建议继续使用你今天存在的__pooling()功能。在我看来,这种事情不属于你的views.py。但如果你想保留它,就像

from django.conf import settings

if not settings.DEBUG:
  __pooling()

可能有帮助。你的__pooling()函数只会在DEBUG为假时被调用,因为它应该在生产中。 (如果它在您的CI环境中也是假的,您可以选择另一个现有设置,或者专门为settings.py添加一些内容来控制它。)

© www.soinside.com 2019 - 2024. All rights reserved.