Недавно начал писать acceptance тесты, используя codeception. Инструмент просто замечательный. Весьма удобный для простых тестов.
Замечу, я работаю с MongoDb, но в принципе не проблема сделать тоже самое для Mysql (или других СУБД).
Но возникла у меня одна проблема.
Структура проекта подразумевает, что на один инстанс приложения есть две базы данных (почему, пока расписывать не буду).
Так вот, в тесте мне нужно было добавить пользователя в основную базу, а затем, после выполнения определенного процесса, проверить наличие данных в дополнительной базе данных.
Готового решения для переключения между connection или databases у codeception нет. Но используя (довольно костыльный, смею заметить, способ) Group Classes, можно менять настройки модуля MongoDb (Db) при запуске/остановке тестов.
Данные классы оперируют событиями test.before., test.after. (подробнее читайте в документации).
Собственно я создал 2 класса групп
1. UserGroup - при запуске теста пишет фикстуру пользователя в БД.
Теперь в тесте необходимо определить группы для сценария
Вот таком костыльным способом у меня получилось работать сразу с двумя базами.
Могу предположить, что connection можно переопределять и в хелперах (т.к. там есть доступ к модулям). Тогда, теоретически, можно будет переключаться между базами в процессе выполнения теста, хотя поручиться за такой метод не могу, сам его не пробовал.
Замечу, я работаю с 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: truecleanup: truedump: ~
Теперь в тесте необходимо определить группы для сценария
причем порядок следования сценариев в данном случае важен./** @var $scenario \Codeception\Scenario */$scenario->group(UserGroup::$group);$scenario->group(RawSerpDbGroup::$group);$I = new CommandGuy($scenario);
Вот таком костыльным способом у меня получилось работать сразу с двумя базами.
Могу предположить, что connection можно переопределять и в хелперах (т.к. там есть доступ к модулям). Тогда, теоретически, можно будет переключаться между базами в процессе выполнения теста, хотя поручиться за такой метод не могу, сам его не пробовал.
Комментариев нет:
Отправить комментарий