拉维公司;PHPUnit:允许进程隔离以防止Mysql连接过多错误

拉维公司;PHPUnit:允许进程隔离以防止Mysql连接过多错误,mysql,phpunit,laravel,laravel-4,Mysql,Phpunit,Laravel,Laravel 4,四个月以来,我们用Laravel 4构建了一个复杂的web应用程序,具有良好的单元测试覆盖率。现在我们有159个测试和592个断言来防止回归,并允许我们轻松地重构我们的应用程序 图片不错,但几天以来,我们在最后的测试中出现了以下错误: PDOException: SQLSTATE[HY000] [1040] Too many connections 原因很简单:所有测试都在同一个进程中运行,MySQL在同一时间只允许一定数量的访问。现在,我们有太多的测试。如果我在测试套件中间删除了几个测试,最

四个月以来,我们用Laravel 4构建了一个复杂的web应用程序,具有良好的单元测试覆盖率。现在我们有159个测试和592个断言来防止回归,并允许我们轻松地重构我们的应用程序

图片不错,但几天以来,我们在最后的测试中出现了以下错误:

PDOException: SQLSTATE[HY000] [1040] Too many connections
原因很简单:所有测试都在同一个进程中运行,MySQL在同一时间只允许一定数量的访问。现在,我们有太多的测试。如果我在测试套件中间删除了几个测试,最后一个测试通过。 解决方案可能是在进程隔离中运行PHPUnit,如下面的配置中所示,但Laravel测试似乎不是这样启动的。我在每次测试中都会发现另一个错误:

PHPUnit_Framework_Exception: Notice: Constant LARAVEL_START already defined in /.../.../autoload.php on line 3


因此,我的问题是:我如何配置Laravel测试以使用
processIsolation=“true”
,或者您是否看到了解决我问题的其他解决方案?
我将查看模拟并删除您的MySQL依赖项:


展望未来,我建议您将更多的精力放在测试SQL上。我的公司最近花了一大笔钱雇佣DBA,这确实扭转了我们传统的缓慢状态。

现在您可以使用DB::connection()->setPdo(null)在测试中关闭连接,这应该可以解决问题。如果这不起作用,您可以在任何扩展Laravel的测试用例的测试中执行
unset($this->app['db'])

对于Laravel 4,您可以在tearDown()函数中使用\db::disconnect('connection')。见以下文件:

“如果由于超过underyling PDO实例的最大连接数限制而需要断开与给定数据库的连接,请使用断开方法”

根据

这在Laravel 5.1中运行良好

public function tearDown()
{
    $this->beforeApplicationDestroyed(function () {
        DB::disconnect();
    });

    parent::tearDown();
}

您是否解决了此问题?您可以查看此讨论:了解更多信息。基本上,我不能同时配置Laravel和PHPUnit来处理processIsolation,所以我只是在MySQL配置中将max_connections设置为1000。不是很漂亮,但是很管用。谢谢你的建议,但是我真的很想测试我的数据库,原因有几个。我想测试迁移,我有很多需要DB访问的功能测试,它们接近集成测试。另一点是,经典web应用程序90%的工作是保存、访问和显示数据。如果你没有在测试中检查数据库,我认为你错过了一些东西“如果你没有在测试中检查数据库,我认为你错过了一些东西…”虽然这是真的,这并不意味着你必须同时运行单元测试和集成测试。这可能很好,但
setPdo
方法只接受PDO的一个实例作为参数…是的,泰勒编辑了我的PR,似乎,我添加了一个替代答案,这是我目前使用的答案。它很有效!我把
unset($this->app['db'])
放在我的拆卸中,就这样。这个旧的解决方案不适用于当前版本的Laravel(4.2或5.0)。可以使用@efinal的解决方案,它非常有效。