12

四个月以来,我们使用 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

4 回答 4

4

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

于 2013-11-02T22:54:50.357 回答
3

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

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

于 2014-03-24T13:02:21.733 回答
2

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

展望未来,我实际上建议更多地关注测试您的 SQL。我的公司最近花了很多钱招聘 DBA,这确实扭转了我们遗留的缓慢问题。

于 2013-10-15T03:50:49.467 回答
2

根据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();
}
于 2015-08-12T16:20:53.180 回答