Как писать юнит-тесты для скриптов которые работают с базами данных?

Добрый день, подскажите пожалуйста какие существуют подходы если нужно протестировать части веб-приложения которые работают с базой данных изменяя ее содержимое, но которые не меняют структуру таблиц
  • Вопрос задан
  • 465 просмотров
Пригласить эксперта
Ответы на вопрос 1
27cm
@27cm
TODO: Написать статус
Тест перед запуском создает чистую базу данных специально для тестов.
Если код упростить, это выглядит примерно так:
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}");
    }
}


Работает довольно шустро.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы