Недавно начал писать 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 можно переопределять и в хелперах (т.к. там есть доступ к модулям). Тогда, теоретически, можно будет переключаться между базами в процессе выполнения теста, хотя поручиться за такой метод не могу, сам его не пробовал.
Комментариев нет:
Отправить комментарий