<p>我已经读过密码了。从<code>LiveServerTestCase</code>中寻找灵感是有道理的,但是试图通过扩展或调用{<cd1>}来做一些事情是在自找麻烦并增加维护成本。在</p>
<p>一种健壮的运行方法是从<code>unittest.TestCase</code>创建一个具有自定义<code>setUpClass</code>和<code>tearDownClass</code>方法的测试用例类。<code>setUpClass</code>方法:</p>
<ol>
<li><p>设置Django应用程序的一个实例,设置适合测试的设置:一个位于不会干扰其他任何东西的位置的数据库,记录到适当的位置,如果电子邮件是在正常操作期间发送的,则使用不会使系统管理员想要扼杀您的电子邮件设置,等等</p>
<p>[实际上,这是一个部署过程。由于我们希望最终部署我们的应用程序,因此我们应该开发上述流程<em></li>
<li><p>将所需的任何设备加载到数据库中。</p></li>
<li><p>启动一个Gunicorn实例,使用通常的OS命令运行Django应用程序的这个实例。</p></li>
</ol>
<p><code>tearDownClass</code>:</p>
<ol>
<li><p>再次使用正常的操作系统命令关闭Gunicorn实例。</p></li>
<li><p>删除为测试而创建的数据库,删除可能已创建的任何日志文件,等等。</p></li>
</ol>
<p>在安装和拆卸之间,我们的测试与分配给Gunicorn的端口上的应用程序联系,如果需要,它们会加载更多的夹具等</p>
<p>为什么不尝试使用修改的<code>LiveServerTestCase</code>?在</p>
<ol>
<li><p><code>LiveServerTestCase</code>将整个测试设置包含在一个进程中:测试、WSGI服务器和Django应用程序。Gunicorn不是为这样的操作而设计的。首先,它使用主进程和工作进程。</p></li>
<li><p>如果<code>LiveServerTestCase</code>被修改为以某种方式在外部进程中启动Django应用程序,那么这个类的许多好处就不存在了。<code>LiveServerTestCase</code><em>依赖于这样一个事实,即它可以在其进程空间中修改设置或数据库连接,并且这些修改将传递到Django应用程序,因为它位于同一进程中。如果应用程序处于不同的进程中,这些技巧将无法工作。一旦修改<code>LiveServerTestCase</code>来处理这个问题,最终结果与我上面概述的结果非常接近。</p></li>
</ol>
<p><strong>另外:</strong>有人能让Gunicorn和Django运行在同一个进程中吗?在</p>
<p>我相信有人可以把它们粘在一起,但请考虑以下几点。这当然意味着更改Gunicorn的<em>核心</em>代码,因为Gunicorn的设计<em>是为了使用主进程和工作进程。然后,当Gunicorn或Django的内部结构发生变化,导致胶水断裂时,这个创造胶水的人将负责保持这种胶水的最新状态。在一天结束的时候,做这件事比使用这个答案开头概述的方法需要更多的工作。在</p>