Я пишу тесты интеграции/базы данных для приложения Zend Framework 3 с помощью
- zendframework/zend-test
3.1.0
, - phpunit/phpunit
6.2.2
и - phpunit/dbunit
3.0.0
Мои тесты не работают из-за
Connect Error: SQLSTATE[HY000] [1040] Too many connections
Я установил некоторые точки останова и заглянул в базу данных:
SHOW STATUS WHERE `variable_name` = 'Threads_connected';
И я действительно видел через 100
открытые соединения.
Я сократил их, отключив в tearDown()
:
protected function tearDown()
{
parent::tearDown();
if ($this->dbAdapter && $this->dbAdapter instanceof Adapter) {
$this->dbAdapter->getDriver()->getConnection()->disconnect();
}
}
Но у меня все еще есть 80
открытые соединения.
Как уменьшить количество подключений базы данных в тестах до минимального?
подробнее
(1) У меня много тестов, где я dispatch
URI. Каждый такой запрос вызывает по крайней мере один запрос базы данных, который вызывает новое подключение к базе данных. Эти соединения, похоже, не закрыты. Это может вызвать большинство соединений. (Но я еще не нашел способ закрыть приложение после того, как запрос обработан.)
(2) Одной из проблем может быть мое тестирование против базы данных:
protected function retrieveActualData($table, $idColumn, $idValue)
{
$sql = new Sql($this->dbAdapter);
$select = $sql->select($table);
$select->where([$table . '.' . $idColumn . ' = ?' => $idValue]);
$statement = $sql->prepareStatementForSqlObject($select);
$result = $statement->execute();
$data = $result->current();
return $data;
}
Но вызов $this->dbAdapter->getDriver()->getConnection()->disconnect()
перед return
ничего не дал.
Пример использования в методе тестирования:
public function testInputDataActionSaving()
{
// The getFormParams(...) returns an array with the needed input.
$formParams = $this->getFormParams(self::FORM_CREATE_CLUSTER);
$createWhateverUrl = '/whatever/create';
$this->dispatch($createWhateverUrl, Request::METHOD_POST, $formParams);
$this->assertEquals(
$formParams['whatever']['some_param'],
$this->retrieveActualData('whatever', 'id', 2)['some_param']
);
}
(3) Еще одна проблема может возникнуть в PHPUnit (или моей конфигурации?). (Striken out, потому что "PHPUnit не делает ничего, связанного с подключениями к базе данных". см. этот.) В любом случае, даже если это не проблема PHPUnit, факт в том, что после строки
$testSuite = $configuration->getTestSuiteConfiguration($this->arguments['testsuite'] ?? null);
в PHPUnit\TextUI\Command
Я получаю 31
новые соединения.