Laravel& PHPUnit:允许进程隔离以防止Mysql连接错误太多

时间:2013-07-24 13:27:34

标签: mysql phpunit laravel laravel-4

自从四个月以来,我们使用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
<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
     backupStaticAttributes="false"
     bootstrap="bootstrap/autoload.php"
     colors="true"
     convertErrorsToExceptions="true"
     convertNoticesToExceptions="true"
     convertWarningsToExceptions="true"
     processIsolation="true"
     stopOnFailure="false"
     syntaxCheck="false"
>

</phpunit>

所以我的问题是:如何配置Laravel测试以使用processIsolation="true"或者您是否看到了我的问题的其他解决方案?

4 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

对于Laravel 4,您可以在tearDown()函数中使用\ DB :: disconnect('connection')。请参阅此处的文档:http://laravel.com/docs/database#accessing-connections

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

答案 2 :(得分:2)

我会看看Mocks并删除你的MySQL依赖:https://github.com/padraic/mockery#mocking-public-static-methods

展望未来,我实际上建议更多地关注测试SQL。我公司最近花了大量资金聘请DBA,这真的让我们的遗产变得迟钝。

答案 3 :(得分:1)

根据http://www.neontsunami.com/posts/too-many-connections-using-phpunit-for-testing-laravel-51

这在Laravel 5.1中运作良好

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

    parent::tearDown();
}