Тест перед запуском создает чистую базу данных специально для тестов.
Если код упростить, это выглядит примерно так:
protected function setUp() {
parent::setUp();
// Файл с дампом базы в tmp-директории
$dumpFile = tempnam('path/to/project/local/test-tmp', 'autotests_dump_');
// В начало файла с дампом пишем команды для пересоздания тестовой базы
$sql = "DROP DATABASE IF EXISTS `autotests_dbname`;\n"
. "CREATE DATABASE `autotests_dbname` DEFAULT CHARACTER SET = utf8;\n"
. "USE `autotests_dbname`;\n";
$this->exec('echo ' . escapeshellarg($sql) . ' > ' . escapeshellarg($dumpFile));
// Делаем дамп с основной базы только структура таблиц, триггеры и т.п.
// Это может быть локальная dev база.
$this->exec('mysqldump --no-create-db --no-data --routines local_dev_dbname >> ' . escapeshellarg($dumpFile));
// Добавляем в дамп файл bootstrap.sql c командами
// для наполнения базы минимально необходимыми данными
$this->exec('cat path/to/project/tests/bootstrap.sql >> ' . escapeshellarg($dumpFile));
// Создаём тестовую базу
$this->exec('mysql < ' . escapeshellarg($dumpFile));
}
private function exec($cmd) {
exec($cmd, $out, $err);
if ($err) {
throw new Exception("Command execution failed: {$cmd}");
}
}
Работает довольно шустро.