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. Моя фирма недавно потратила немало нанимающих администраторов баз данных, которые действительно превратили нашу давнюю медлительность.