Laravel & PHPUnit: позволяет изолировать процесс, чтобы предотвратить Mysql Слишком много ошибок подключения
С четырех месяцев мы создаем сложное веб-приложение с Laravel 4 с хорошим охватом unit test. Теперь у нас есть 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"
или вы видите другое решение моей проблемы?
Ответы
Ответ 1
Для Laravel 4 вы можете использовать \DB:: disconnect ('connection') в своей функции tearDown(). См. Doc здесь: http://laravel.com/docs/database#accessing-connections
"Если вам необходимо отключиться от данной базы данных из-за превышения предела max_connections для PDU для несовершеннолетних, используйте метод отключения
Ответ 2
Теперь вы можете выполнить DB:: connection() → setPdo (null), чтобы закрыть соединение в ваших тестах tearDown, tha должен его решить. Если это не сработает, вы можете сделать unset($this->app['db'])
в любом тесте, проходящем Laravel TestCase.
Ответ 3
Я бы посмотрел на Mocks и убрал вашу зависимость от MySQL: https://github.com/padraic/mockery#mocking-public-static-methods
В будущем я бы предпочел больше сосредоточиться на тестировании вашего SQL. Моя фирма недавно потратила немало нанимающих администраторов баз данных, которые действительно превратили нашу давнюю медлительность.
Ответ 4
По 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();
}