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

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

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

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

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

class UserGroup extends CodeceptionPlatformGroup
{
    static $group = 'user';

    /**
     * @param CodeceptionEventTest $e
     */
    public function _before(CodeceptionEventTest $e)
    {
        $this->writeln("inserting user");
        /** @var CodeceptionModuleMongoDb $db */
        $db = $this->getModule('MongoDb');
        $data = $criteria = ["key" => "user", 'value' => User::getUserData()];
        $db->haveInCollection(User::collectionName(), $data);
        $db->_before($e->getTest());
    }

    /**
     * @param CodeceptionEventTest $e
     */
    public function _after(CodeceptionEventTest $e)
    {
        /** @var CodeceptionModuleMongoDb $db */
        $db = $this->getModule('MongoDb');
        $db->_after($e->getTest());
    }
}

2. RawSerpDbGroup — при запуске теста подменяет coonection подключаясь к дургой БД.

class RawSerpDbGroup extends CodeceptionPlatformGroup
{
    static $group = 'raw-serp-db';
    /**
     * @param CodeceptionEventTest $e
     */
    public function _before(CodeceptionEventTest $e)
    {
        $this->writeln("connect to raw-serp-db");
        /** @var CodeceptionModuleMongoDb $db */
        $db = $this->getModule('MongoDb');
        $db->_reconfigure($this->config);
        $db->_initialize();
        $db->_before($e->getTest());
    }

    /**
     * @param CodeceptionEventTest $e
     */
    public function _after(CodeceptionEventTest $e)
    {
        /** @var CodeceptionModuleMongoDb $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 CodeceptionScenario */
$scenario->group(UserGroup::$group);
$scenario->group(RawSerpDbGroup::$group);

$I = new CommandGuy($scenario);

причем порядок следования сценариев в данном случае важен.

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

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

Реклама

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: