максимальное соединение MySql достигнуто во время тестов

Когда я запускаю свой набор тестов PHPUnit, я достиг максимального ограничения соединения (200) для MySQL.

Оперативным решением было установить max_connection на 500, но я ищу лучшее решение в контексте Zend Framework 2.

Я попытался поставить какой-то метод tearDown, но не повезло, что это бесполезное или неполное решение.

Это пример кода:

protected function tearDown()
{
// i have two entitymanager
$this->getObjectManager()->get('doctrine.connection.orm_alternate')->close();
$this->getObjectManager()->get('doctrine.connection.orm_default')->close();
$this->application = null;
gc_collect_cycles();
parent::tearDown();
}

Я также пытался использовать processIsolation, чтобы установить true, но некоторые тесты были настолько длинными, что я предположил, что моя консоль зависла или что-то в этом роде ….

Как с помощью соединения doctrine2 и Zend Framework, как я могу предотвратить это «слишком много соединений» во время тестов PHPunit?

до сих пор с советами @awons я пытался изменить
$this->getObjectManager()->get('doctrine.connection.orm_alternate')->close();

в
$this->getObjectManager()->get('doctrine.entitymanager.orm_alternate')->close();

Я проверил, назывался ли демонтаж, да.

Что-то, чего я не понимаю: в каждом тесте создается новый экземпляр моих соединений, почему это не тот же экземпляр? (как синглтон или реестр)?
Но этот экземпляр никогда не закрывается, даже если он не используется после прохождения теста.

Я что-то пропускаю, но не знаю что.

12

Решение

Я решил похожую проблему, прежде чем сделать это следующим образом:

protected static $my_db_for_testing

public static function setUpBeforeClass()
{
//create your DB connection once, here.
$self::$my_db_for_testing = new DbConnectionWhatever()
}

protected function setUp()
{
$this->my_obj_to_test = new MyObject();
$this->my_obj_to_test->setDb($this->my_db_for_testing);
}public function testOne()
{
//normal test here
}

public static function tearDownAfterClass()
{
//close the DB connection here
}

}

4

Другие решения

Мы всегда настраиваем с такими настройками, как:

переменная набора = max_connections = 1500

set-variable = max_user_connections = 300

Где есть < 10 пользователей, которые будут подключаться к серверу. Это оставляет соединения открытыми для супер пользователей. У нас обычно есть 2-3 пользователя приложений для наших серверов MySQL. Таким образом, с 3, только 900 подключений могут быть использованы нашими пользователями. Вы можете дополнительно ограничить подключения для каждого пользователя, если вы хотите настроить его еще больше.

3

Нужно ли проводить тесты на MySql?

С Doctrine вы можете использовать базу данных sqlite для тестирования. Если нет особой необходимости использовать MySql, это метод, который может улучшить ваш процесс тестирования и изолировать вас от проблем вне ваших реальных модульных тестов.

Кроме того, вы можете увидеть увеличение скорости, выполнив тесты с базой данных в памяти.

3

Я рекомендую прочитать главу арматура. Чтобы избежать создания нового соединения для каждого теста, используйте setUpBeforeClass() установить соединение с БД один раз и повторно использовать это соединение для каждого из ваших тестов.

<?php
class DatabaseTest extends PHPUnit_Framework_TestCase
{
protected static $dbh;

public static function setUpBeforeClass()
{
self::$dbh = new PDO('sqlite::memory:');
}

public static function tearDownAfterClass()
{
self::$dbh = NULL;
}
}
?>
3
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector