Часть 5: Подготовка базы данных, миграции (Тестирование ПО)

08 May 2017

00-titleОглавление

Перед вами очередная часть цикла Тестирование ПО. В предыдущей части мы развернули инфраструктуру для работы с проектом на базе Yii2-advanced-template. В этой части мы разберемся как работать с базой данных и что такое миграции.

База данных

Подготовка машины

Нам потребуется две базы данных. Одну из них мы создали на предыдущем этапе разработки. Вторую добавим сейчас. Поскольку правилом хорошего тона считается наличие отдельной базы данных для запуска тестов. Это правило позволяет достичь повторяемости результатов при непрерывном прогоне кейсов..

Можно это сделать руками, но проще всего отредактировать конфигурацию config.yaml. Добавим в секции mariadb.databases и mariadb.grants две записи. Одна из них - описание базы. Вторая - права доступа на новую базу.

mariadb:  
 ...  
 databases:  
 ...  
 mariadbnd\_r4j5mttm7uht:  
 name: tdd\_tests  
 sql: ''  
 grants:  
 ...  
 mariadbng\_puym1vumdrfg:  
 user: tdd  
 table: 'tdd\_tests.\*'  
 privileges:  
 - ALL

Теперь можно запустить провизию машины заново. Либо из командной строки, либо из меню PHPStorm (Tools->Vagrant->Provision). Через некоторое время, которое зависит от производительности вашей машины, вы увидите сообщение об успешном завершении команды.

Как проверить, что все нормально работает? Нужно зайти в систему по ssh. Сделать это можно двумя способами: при помощи команды vagrant ssh в консоли или при помощи меню PHPStorm (Tools->Start ssh session и в открывшемся окне стоит выбрать vagrant как объект для подключения). Затем подключаемся к консоли mariadb (mysql -u root -p) и вводим команду show databases.

04-show databases

Структура базы

Далее потребуется спроектировать схему таблицы user таким образом, чтобы она поддерживала все необходимые базовые возможности по работе с пользователям в yii2. Особо усердствовать на этом этапе мы не будем, а возьмем рекомендованную схему из фреймворка.

01-user table

Для того, чтобы создать таблицу выше нам потребуется написать миграцию yii2 (конечно писать мы пока ничего не будем, а возьмем готовый файл, который любезно предоставили нам разработчики advanced template). Но прежде - отредактировать конфигурационные файлы, которые содержат DSN-строки подключения. Это файлы main-local.php и test-local.php из каталога environments/dev/common/config.

Требуется поменять соответствующие строки таким образом чтобы они указывали на актуальную базу разработчика и на тестовую базу соответственно.

main-local.php

'db' =\> [  
 'class' =\> 'yii\db\Connection',  
 'dsn' =\> 'mysql:host=localhost;dbname=tdd',  
 'username' =\> 'root',  
 'password' =\> 'tdd',  
 'charset' =\> 'utf8',  
]

test-local.php

'db' =\> [  
 'dsn' =\> 'mysql:host=localhost;dbname=tdd\_tests',  
]

Развертывание конфигурации

Теперь необходимо полученную конфигурацию развернуть. Сделать это можно несколькими способами:

Выберите удобный для себя способ и разверните новую конфигурацию.

Миграции

Раньше разработчикам приходилось держать схему базы данных отдельно от проекта и по мере надобности вручную вносить изменения. Это довольно однообразный процесс на каждом этапе которого был велик риск получить расхождения схемы в базе и схемы в системе контроля версий.

Теперь необходимость в этом отпала и большинство современных фреймворков работают с так называемыми миграциями схемы базы данных. Yii2 исключением не является и поддерживает этот механизм.

Создание миграции

Для создания миграции существует консольная команда

yii migrate/create \<имя миграции\>

Разработчики шаблона заботливо создали за нас первую миграцию init которая расположена она в файле console/migrations/m130524_201442_init.php.

Все хорошо, но есть одно но - данный код предназначен для большинства имеющихся баз и поэтому задуман быть универсальным. У нас же четко определено с какой базой требуется работать. Поэтому нелишним будет изменить ряд столбцов под конкретные цели.

$this-\>createTable('', [  
 'id' =\> $this-\>primaryKey(),  
 'username' =\> $this-\>string()-\>notNull(),  
 'auth\_key' =\> $this-\>string(32)-\>notNull(),  
 'password\_hash' =\> $this-\>string()-\>notNull(),  
 'password\_reset\_token' =\> $this-\>string()-\>unique(),  
 'email' =\> $this-\>string()-\>notNull()-\>unique(),  
 'status' =\> $this-\>smallInteger()-\>notNull()-\>defaultValue(10),  
 'created\_at' =\> 'timestamp DEFAULT current\_timestamp',  
 'updated\_at' =\> 'timestamp DEFAULT current\_timestamp ON UPDATE current\_timestamp',  
], $tableOptions);  
$this-\>addCommentOnTable('', 'User table');

Кратко пройдемся по некоторым моментам

Применение миграции

Для применения конкретной миграции (или всех) требуется зайти на виртуальную машину в каталог с проектом (/var/www в нашем случае) и выполнить команду

php yii migrate/up

Система спросит вас о том, действительно ли вы хотите применить миграцию. Отвечаете утвердительно и через некоторое время вам будет показано сообщение об успешном применении нового кода.

02-migrate up

Посмотреть что получилось можно зайдя в консоль mysql и выполнив запрос на отображение схемы таблицы.

mysql -u tdd -p tdd

И сам запрос.

show create table user;

В ответ мы увидим актуальную структуру таблицы user.

03-show creat table user

Автоматизация

Чтобы каждый раз не задумываться о том, запустили мы миграции или нет стоит это дело отдать на откуп скриптам. Можно использовать секциями composer.json post-update-cmd и post-install-cmd, что мы и сделаем.

"scripts": {  
 ...  
 "post-update-cmd": [  
 "php yii migrate --interactive=0"  
 ],  
 "post-install-cmd": [  
 "php yii migrate --interactive=0"  
 ]  
}

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

Литература

Исходный код