18 мая 2014 г.

Мой новый блог

Блоггер довольно неудобен (или просто я не умею его готовить) если нужно добавлять код.
Поэтому я перешел на новый блог.

Он находится здесь - http://madmis.com.ua/

12 мая 2014 г.

Codeception - тестируем используя несколько баз данных

Недавно начал писать acceptance тесты, используя codeception. Инструмент просто замечательный. Весьма удобный для простых тестов.

Замечу, я работаю с MongoDb, но в принципе не проблема сделать тоже самое для Mysql (или других СУБД).

Но возникла у меня одна проблема.
Структура проекта подразумевает, что на один инстанс приложения есть две базы данных (почему, пока расписывать не буду).
Так вот, в тесте мне нужно было добавить пользователя в основную базу, а затем, после выполнения определенного процесса, проверить наличие данных в дополнительной базе данных.

Готового решения для переключения между connection или databases у codeception нет. Но используя (довольно костыльный, смею заметить, способ)  Group Classes, можно менять настройки модуля MongoDb (Db) при запуске/остановке тестов.
Данные классы оперируют событиями test.before.test.after.  (подробнее читайте в документации).

Собственно я создал 2 класса групп
1. UserGroup - при запуске теста пишет фикстуру пользователя в БД.

class UserGroup extends \Codeception\Platform\Group
{
    static $group = 'user';

    /**
     * @param \Codeception\Event\Test $e
     */
    public function _before(\Codeception\Event\Test $e)
    {
        $this->writeln("inserting user");

        /** @var \Codeception\Module\MongoDb $db */
        $db = $this->getModule('MongoDb');
        $data = $criteria = ["key" => "user", 'value' => User::getUserData()];
        $db->haveInCollection(User::collectionName(), $data);
        $db->_before($e->getTest());
    }

    /**
     * @param \Codeception\Event\Test $e
     */
    public function _after(\Codeception\Event\Test $e)
    {
        /** @var \Codeception\Module\MongoDb $db */
        $db = $this->getModule('MongoDb');
        $db->_after($e->getTest());
    }
}
2. RawSerpDbGroup - при запуске теста подменяет coonection подключаясь к дургой БД.

class RawSerpDbGroup extends \Codeception\Platform\Group
{
    static $group = 'raw-serp-db';

    /**
     * @param \Codeception\Event\Test $e
     */
    public function _before(\Codeception\Event\Test $e)
    {
        $this->writeln("connect to raw-serp-db");

        /** @var \Codeception\Module\MongoDb $db */
        $db = $this->getModule('MongoDb');
        $db->_reconfigure($this->config);
        $db->_initialize();
        $db->_before($e->getTest());
    }

    /**
     * @param \Codeception\Event\Test $e
     */
    public function _after(\Codeception\Event\Test $e)
    {
        /** @var \Codeception\Module\MongoDb $db */
        $db = $this->getModule('MongoDb');
        $db->_after($e->getTest());
    }
}
Сами настройки подключения хранятся в конфиге
codeception.yml
extensions:
    enabled: [RawSerpDbGroup, UserGroup]
    config:
        RawSerpDbGroup:
            dsn: 'mongodb://localhost:27017/db-r-s'
            user: ~
            password: ~
            populate: true
            cleanup: true
            dump: ~

Теперь в тесте необходимо определить группы для сценария
/** @var $scenario \Codeception\Scenario */
$scenario->group(UserGroup::$group);
$scenario->group(RawSerpDbGroup::$group);
$I = new CommandGuy($scenario);
причем порядок следования сценариев в данном случае важен.

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

Могу предположить, что connection можно переопределять и в хелперах (т.к. там есть доступ к модулям). Тогда, теоретически,  можно будет переключаться между базами в процессе выполнения теста, хотя поручиться за такой метод не могу, сам его не пробовал.








8 мая 2014 г.

MongoDB и резервное копирование

бекап всей БД :
1
mongodump -h localhost -d DATABASE_NAME -o BACKUP_FOLDER
бекап определённых коллекций:
1
mongodump --db blog --collection posts
восстановление бекапа:
1
mongorestore -h localhost -d DATABASE_NAME BACKUP_FOLDER