自从四个月以来,我们使用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"
或者您是否看到了我的问题的其他解决方案?
答案 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();
}