11

我正在用 gunicorn 在 django 中运行一个应用程序。我正在尝试使用 selenium 来测试我的应用程序,但遇到了问题。

我需要创建一个测试服务器,就像使用 djangos 完成的那样,LiveServerTestCase它可以与 gunicorn 一起使用。

有谁知道我该怎么做?

注意:也有人可以确认我LiveServerTestCase是作为线程而不是进程执行的

4

2 回答 2

2

我已经阅读了代码。寻找LiveServerTestCase灵感是有道理的,但试图通过扩展或以某种方式调用来制造一些东西LiveServerTestCase是在自找麻烦并增加维护成本。

一个健壮的运行方式看起来像什么,是从具有自定义和方法的测试用例类LiveServerTestCase创建。方法:unittest.TestCasesetUpClasstearDownClasssetUpClass

  1. 使用适合测试的设置设置 Django 应用程序的实例:位于不会干扰其他任何内容的位置的数据库,记录到适当位置的日志,如果在正常操作期间发送电子邮件,则电子邮件设置将不会t 让您的系统管理员想要扼杀您,等等。

    [实际上,这是一个部署过程。由于我们希望最终部署我们的应用程序,因此上述过程是我们无论如何都应该开发的过程。]

  2. 将所需的任何固定装置加载到数据库中。

  3. 启动一个 Gunicorn 实例运行 Django 应用程序的这个实例,为此使用常用的操作系统命令。

tearDownClass:_

  1. 再次使用正常的操作系统命令关闭 Gunicorn 实例。

  2. 删除为测试而创建的数据库,删除可能已创建的任何日志文件等。

在设置和拆卸之间,我们的测试在分配给 Gunicorn 的端口上联系应用程序,如果需要,它们会加载更多的固定装置,等等。

为什么不尝试使用修改后的LiveServerTestCase?

  1. LiveServerTestCase在一个过程中包含整个测试设置:测试、WSGI 服务器和 Django 应用程序。Gunicorn 不是为这样的操作而设计的。一方面,它使用主进程和工作进程。

  2. 如果LiveServerTestCase被修改为以某种方式在外部进程中启动 Django 应用程序,那么这个类的很多好处就会消失。LiveServerTestCase 依赖于它可以只修改其进程空间中的设置或数据库连接并且这些修改将传递到 Django 应用程序的事实,因为它存在于同一个进程中。如果应用程序处于不同的进程中,这些技巧将不起作用。一旦LiveServerTestCase被修改以解决这个问题,最终结果将接近我上面概述的内容。

附加:有人可以让 Gunicorn 和 Django 在同一个进程中运行吗?

我敢肯定有人可以将它们粘合在一起,但请考虑以下内容。这肯定意味着更改 Gunicorn 的核心代码,因为 Gunicorn旨在使用主进程和工作进程。然后,当 Gunicorn 或 Django 的内部结构发生变化导致胶水破裂时,创建胶水的人将负责保持胶水的最新状态。归根结底,这样做比使用本答案开头概述的方法需要更多的工作。

于 2013-12-08T00:34:29.183 回答
1

在我的脑海中,你可以尝试覆盖LiveServerTestCase.setUpClass并结束 gunicorn 而不是LiveServerThread

于 2013-12-05T21:23:01.947 回答