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

时间:2019-04-03 18:31:15

标签: python django bash python-multithreading django-testing

我正在使用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()

基本上,我需要我的应用程序不时地异步执行某些操作。 是否应该更改池化方式?还是应该在测试期间将其禁用(如何?)?

1 个答案:

答案 0 :(得分: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添加一些内容来控制此设置。)