Как проверить Доктрину Миграции?

Я работаю над проектом, который НЕ имеет копии рабочей БД в среде разработки.

Иногда у нас возникают проблемы с миграцией БД — они передаются на БД разработчика, но не работают в процессе производства / тестирования.

Часто бывает так, что данные среды Dev загружаются из Fixtures, которые используют самые последние сущности — правильно заполняя все таблицы.

Есть ли простой способ убедиться, что Doctrine Migration перейдет в производство?

Есть ли у вас / знаете ли вы какой-либо способ написать автоматические тесты, которые будут гарантировать, что данные будут перенесены должным образом без загрузки производственной / тестовой БД и выполнения миграции вручную?

Я бы не хотел загружать рабочую / тестовую БД на компьютер разработчика, чтобы я мог проверить миграцию, поскольку БД содержит личные данные, и она может быть довольно большой.

6

Решение

Во-первых, вам нужно создать образец дампа базы данных в состоянии перед миграцией. Для MySQL используйте mysqldump. Для postgres pg_dump, например:

mysqldump -u root -p mydatabase > dump-2018-02-20.sql
pg_dump -Upostgres --inserts --encoding utf8 -f dump-2018-02-20.sql mydatabase

Затем создайте абстрактный класс для всех тестов миграции (я предполагаю, что вы настроили отдельную базу данных для тестирования интеграции в config_test.yml):

abstract class DatabaseMigrationTestCase extends WebTestCase {
/** @var ResettableContainerInterface */
protected $container;
/** @var Application */
private $application;

protected function setUp() {
$this->container = self::createClient()->getContainer();
$kernel = $this->container->get('kernel');
$this->application = new Application($kernel);
$this->application->setAutoExit(false);
$this->application->setCatchExceptions(false);

$em = $this->container->get(EntityManagerInterface::class);
$this->executeCommand('doctrine:schema:drop --force');
$em->getConnection()->exec('DROP TABLE IF EXISTS public.migration_versions');
}

protected function loadDump(string $name) {
$em = $this->container->get(EntityManagerInterface::class);
$em->getConnection()->exec(file_get_contents(__DIR__ . '/dumps/dump-' . $name . '.sql'));
}

protected function executeCommand(string $command): string {
$input = new StringInput("$command --env=test");
$output = new BufferedOutput();
$input->setInteractive(false);
$returnCode = $this->application->run($input, $output);
if ($returnCode != 0) {
throw new \RuntimeException('Failed to execute command. ' . $output->fetch());
}
return $output->fetch();
}

protected function migrate(string $toVersion = '') {
$this->executeCommand('doctrine:migrations:migrate ' . $toVersion);
}
}

Пример теста миграции:

class Version20180222232445_MyMigrationTest extends DatabaseMigrationTestCase {
/** @before */
public function prepare() {
$this->loadDump('2018-02-20');
$this->migrate('20180222232445');
}

public function testMigratedSomeData() {
$em = $this->container->get(EntityManagerInterface::class);
$someRow = $em->getConnection()->executeQuery('SELECT * FROM myTable WHERE id = 1')->fetch();
$this->assertEquals(1, $someRow['id']);
// check other stuff if it has been migrated correctly
}
}
3

Другие решения

Я выяснил простые «тесты дыма» для Doctrine Migrations.

У меня есть тест PHPUnit, выполняющий следующие шаги:

  • БД дроп-тест
  • Создать тестовую БД
  • Загрузить миграции (создать схему)
  • Загрузка приспособлений (имитация производственных данных)
  • Переход на более старую версию
  • Перейдите на последнюю версию

Таким образом, я могу проверить основные проблемы, которые у нас были недавно.

Пример тестов PHPUnit можно найти в моем блоге: http://damiansromek.pl/2015/09/29/how-to-test-doctrine-migrations/

1

По вопросам рекламы [email protected]