2017-02-12 14 views
4

У меня проблемы с «слишком большим количеством соединений» для тестов 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

+1

Почему вы не используете одно и то же соединение для каждого теста? Может использовать функцию 'setUpBeforeClass()' и установить '$ this-> em' в статику как:' static :: $ em'. В зависимости от того, сколько тестов определено для каждого класса, что должно помочь. – segFault

+1

Ответ @sebastianForsberg - это, вероятно, путь, но затем не забывайте, что $ em-> clear() после каждого теста в противном случае у вас могут быть неожиданные результаты. – LBA

+0

Я изменил свои тесты на использование static :: $ em, но это не решает проблему. С каждым выполненным тестом количество подключений увеличивается на 1. Есть ли способ проверить, не закрывает ли приложение все соединения? –

ответ

0

Ваш метод tearDown выглядит так, как будто он должен сделать трюк. Я просто делаю это и никогда не испытывал этого вопроса

protected function tearDown() 
{ 
    parent::tearDown(); 

    $this->em->close(); 
    $this->em = null; 
} 

Что делает Bootstrap :: loadAllFixtures метод? Существует ли какое-либо соединение db, которое может быть упущено?

+0

'static :: $ em-> close()' приведет к ошибкам в следующих тестах, поскольку «EntityManager уже закрыт». 'Bootstrap :: loadAllFixtures()' теперь показан выше. Если я прокомментирую этот вызов функции, тесты могут потерпеть неудачу, но номер соединения все еще увеличивается. –