понедельник, 13 июля 2015 г.

§2.8 Тестирование в Yii 2 для новичков. Подключение базы данных в Codeception

С подключением базы данных для тестов промучился целую неделю! Но в конце-концов получилось.
Прочитал, что тестовая база данных должна быть отдельной от рабочий базы. Хорошо - создал базу данных catalog_test. А рабочая база данных - catalog. Изначально рабочая база пустая, в ней ничего нет. Все таблицы и данные в миграциях.
Первая миграция удаляет все таблицы из базы (за исключением таблицы миграций, в которой хранится состояние этих миграций, какие уже были применены). Применив (или откатив) эту миграцию получаем пустую базу данных. Какие бы там ни были таблицы - все начисто стирается. Тут был один момент, определить из какой базы данных стирать: из рабочей или из тестовой. Не нашел ничего лучше, чем распарсить dns запись:
 
$dbname = explode("=", Yii::$app->getDb()->dsn);

$dbname = $dbname[2];

echo 'Активная база данных: '. $dbname;

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

Настройка codeception

В файле /var/www/yii2/basic/tests/codeseption.yml
Прописываем url до индекс файла-тестов:
 
test_entry_url: http://yii2.lamp/index-test.php

и добавляем модуль Db:
modules:

  config:

    Db:

      dsn: mysql:host=localhost;dbname=catalog_test

      user: root

      password: 8246

      dump: codeception/_data/dump.sql

В дамп надо записать базу данных с созданием таблиц и вставкой данных (включая таблицу миграций) как есть на текущий момент, и обновлять этот дамп, если были применены новые миграции. Перед каждым тестом этот дамп создает тестовую базу аднных заново. Если вы сняли дамп с рабочий базы, проверьте, там не должно остаться названия рабочей базы данных! Поменяйте название базы данных в дампе на тестовую.
В файле /var/www/yii2/basic/tests/codeseption/unit.suite.yml активируем модуль Db
 
modules:

    enabled: [Asserts, Db]

Теперь в файле  /var/www/yii2/basic/tests/codeseption/config/config.php прописываем подключение к базе данных (по аналогии с /var/www/yii2/basic/config/db.php)
 
'components' => [

 'db' => [

     'dsn' => 'mysql:host=localhost;dbname=catalog_test',

     'username' => 'root',

     'password' => 'root',

     'charset' => 'utf8',

     'tablePrefix' => 'tbl_',

 ]

],

Я сам не уловил, для чего прописывать подключение в двух разных файлах, может для разных видов тестов используются разные модули?
Теперь нужно сделать (так как мы подключали модули)
 codecept build    
Применить миграции на тестовую базу данных, это делается так:
php /var/www/yii2/basic/tests/codeception/bin/yii migrate
Теперь можно создавать тесты, проверяющие код, который использует базу данных.
Продолжение следует.

4 комментария:

  1. Добрый день! Спасибо за эти примеры. А где можно скачать ваш дамп? Ссылка приведенная здесь http://psyhos.blogspot.com/2012/10/blog-post.html не работает.

    Спасибо,
    Алексей

    ОтветитьУдалить
    Ответы
    1. Ссылку поправил, теперь работает. Но это дамп каталога который был создан на Yii1.

      На Yii2 дамп этот:
      http://psyhos.bl.ee/catalog/dump.sql

      Удалить
  2. а где подключается этот файл
    /var/www/yii2/basic/tests/codeseption/config/config.php
    ?

    ОтветитьУдалить
    Ответы
    1. Я тут еще не особо разобрался..

      Удалить