У меня проблемы с «слишком большим количеством соединений» для тестов PHPUnit для ZF3 и Doctrine, потому что я выполняю ~ 200 тестов на выполнение PHPUnit. Я уже нашел несколько вопросов и ответов о переполнении стека, но не об этой работе.PHPUnit тесты и Doctrine, слишком много соединений
Моя установка: ZF2/ZF3, Doctrine 2 и PHPUnit.
У меня есть базовый тест-класс для всех тестов и установку и демонтаж функции выглядят следующим образом:
public function setUp()
{
$this->setApplicationConfig(Bootstrap::getConfig());
Bootstrap::loadAllFixtures();
if (!static::$em) {
echo "init em";
static::$em = Bootstrap::getEntityManager();
}
parent::setUp();
....
}
public function tearDown()
{
parent::tearDown();
static::$em->flush();
static::$em->clear();
static::$em->getConnection()->close();
$refl = new \ReflectionObject($this);
foreach ($refl->getProperties() as $prop) {
if (!$prop->isStatic() && 0 !== strpos($prop->getDeclaringClass()->getName(), 'PHPUnit_')) {
$prop->setAccessible(true);
$prop->setValue($this, null);
}
}
gc_collect_cycles();
}
public static function (Bootstrap::)loadAllFixtures()
{
static::$em->getConnection()->executeUpdate("SET foreign_key_checks = 0;");
$loader = new Loader();
foreach (self::$config['data-fixture'] as $fixtureDir) {
$loader->loadFromDirectory($fixtureDir);
}
$purger = new ORMPurger(static::$em);
$executor = new ORMExecutor(static::$em, $purger);
$executor->execute($loader->getFixtures());
$executor = null;
$purger = null;
static::$em->getConnection()->executeUpdate("SET foreign_key_checks = 1;");
static::$em->flush();
static::$em->clear();
}
Я мониторинг моего локального сервера MySQL с innotop и количества соединений увеличивается.
У вас есть идеи, что мне не хватает?
Спасибо, Александр
Update 14.02.2017: Я изменил функцию использовать static::$em
и добавил Bootstrap::loadAllFixtures
метод.
Если я добавлю static::$em->close()
в метод tearDown
, все последующие тесты завершатся ошибкой с сообщением типа «EntityManager уже закрыт». echo "init em";
вызывается только один раз и отображается для первого теста. Есть ли возможность проверить, открывает ли приложение приложение, не закрывая его? Мои тестовые примеры основаны на AbstractHttpControllerTestCase
Почему вы не используете одно и то же соединение для каждого теста? Может использовать функцию 'setUpBeforeClass()' и установить '$ this-> em' в статику как:' static :: $ em'. В зависимости от того, сколько тестов определено для каждого класса, что должно помочь. – segFault
Ответ @sebastianForsberg - это, вероятно, путь, но затем не забывайте, что $ em-> clear() после каждого теста в противном случае у вас могут быть неожиданные результаты. – LBA
Я изменил свои тесты на использование static :: $ em, но это не решает проблему. С каждым выполненным тестом количество подключений увеличивается на 1. Есть ли способ проверить, не закрывает ли приложение все соединения? –