我在django用gunicorn运行应用程序。我正在尝试使用selenium来测试我的应用程序,但遇到了问题。
我需要创建一个测试服务器,就像使用djangos LiveServerTestCase
一样,可以使用gunicorn。
有没有人对我如何做到这一点有任何想法?
注意:也有人确认我LiveServerTestCase
是作为一个线程执行而不是一个进程
答案 0 :(得分:2)
我已经阅读了代码。看LiveServerTestCase
寻找灵感是有道理的,但是试图通过扩展或以某种方式调用LiveServerTestCase
来做某事是在寻找麻烦和增加维护成本。
运行外观的强大方式,就像LiveServerTestCase
所做的那样,是从unittest.TestCase
创建一个包含自定义setUpClass
和{{1}的测试用例类} 方法。 tearDownClass
方法:
使用适合测试的设置设置Django应用程序的实例:位置不会干扰任何其他内容的数据库,记录到适当位置的日志,如果在正常操作期间发送电子邮件,电子邮件设置不会让你的系统管理员想要扼杀你,等等。
[实际上,这是一个部署过程。由于我们希望最终部署我们的应用程序,上面的过程是我们应该开发无论如何。
将所需的任何固定装置加载到数据库中。
启动一个Gunicorn实例运行这个Django应用程序实例,使用常用的OS命令。
setUpClass
:
再次使用正常的OS命令关闭Gunicorn实例。
删除为测试而创建的数据库,删除可能已创建的任何日志文件等。
在设置和拆解之间,我们的测试会联系分配给Gunicorn的端口上的应用程序,如果需要,他们会加载更多的灯具等。
为什么不尝试使用修改后的tearDownClass
?
LiveServerTestCase
在一个进程中包含整个测试设置:测试,WSGI服务器和Django应用程序。 Gunicorn并非设计用于此类操作。首先,它使用主进程和工作进程。
如果修改LiveServerTestCase
以某种方式在外部进程中启动Django应用程序,那么这个类的很多好处就会消失。 LiveServerTestCase
依赖这个事实,即它只能修改其进程空间中的设置或数据库连接,并且这些修改将转移到Django应用程序,因为它存在于同一进程中。如果应用程序处于不同的过程中,则这些技巧无法运行。修改LiveServerTestCase
以解决此问题后,最终结果将接近我上面概述的内容。
补充:有人可以让Gunicorn和Django在同一个过程中运行吗?
我确定某人可以将它们粘在一起,但请考虑以下因素。这肯定意味着改变Gunicorn的核心代码,因为Gunicorn 设计以使用主和工作进程。然后,当Gunicorn或Django的内部构件以使胶水破裂的方式发生变化时,创建胶水的人将负责保持胶水的最新状态。在这一天结束时,这需要比使用本答案开头所述方法更多的工作。
答案 1 :(得分:1)
在我的头顶,您可以尝试覆盖LiveServerTestCase.setUpClass
并结束gunicorn而不是LiveServerThread