Одновременное использование двух баз данных в кодировании

Как я могу использовать две базы данных одновременно в генерации кода? Мое приложение PHP использует базу данных SQLite, но также подключается к другому приложению, которое использует базу данных MySQL.

В данный момент у меня есть это в моем файле codeception.yml:

modules:
  config:
    Db:
        dsn: 'sqlite:db.sqlite'
        dump: tests/_data/dump.sql
        populate: true
        cleanup: true

Таким образом, база данных каждый раз заполняется тестовыми данными и автоматически очищается в конце тестов. Как я могу добавить базу данных MySQL сейчас, которая делает то же самое?

Кроме того, в случае, если это возможно, в некоторых тестах я использую функцию "seeInDatabase". Как я могу указать, к какой базе данных он должен выглядеть?

Ответ 1

Посмотрите на модуль, который я внес, названный Codeception MultiDb.

Ответ 2

Мы можем сделать это довольно легко, используя классы расширения Codeception. Что мы будем делать с расширениями:

Подключитесь к событиям "до теста" и "после теста" с нашим расширением Переконфигурируйте модуль Db, чтобы указать на наш веб-сервис, повторно инициализировать модуль и выполнить Повторить для каждой веб-службы Для начала нам нужно сначала включить модуль Db в наших тестах приемки. Следуйте инструкциям по настройке модуля Db. Важно то, что мы устанавливаем заполнение и очистку на false, и этот дамп указывает на действительный файл. Мы устанавливаем заполнение и очистку на false, потому что мы не хотим, чтобы модуль Db заполнялся и очищался после каждого теста. Ну, мы вроде как делаем, но по умолчанию модуль Db обменивается только одной базой данных, где нам нужно несколько.

Во-вторых, следуйте инструкциям по созданию основного расширения кода. После того, как вы настроили свой класс, сконфигурировали и включили его в свою загрузку, вы можете использовать следующий код в качестве руководства:

class YourExtensionClass extends \Codeception\Platform\Extension {

// events to listen on
static $events = array(
'test.before' => 'beforeTest',
'test.after' => 'afterTest',
);

function beforeTest(\CodeCeption\Event\Test $e)
{
// get the test and groups
$test = $e->getTest();
$groups = $test->getScenario()->getGroups();

// only restore if annotated to do so
if (in_array('api', $groups)) {
// get the Db module
$db = $this->getModule('Db');

// re-initialize with web service one api config and execute
$webserviceOneConfig = $this->getWebServiceOneConfig($this->config);
$db->_reconfigure($webserviceOneConfig);
$db->_initialize();
$db->_before($test);

// re-initialize with web service two api config and execute
$webserviceTwoConfig = $this->getWebServiceTwoConfig($this->config);
$db->_reconfigure($webserviceTwoConfig);
$db->_initialize();
$db->_before($test);
}
}

function afterTest(\CodeCeption\Event\Test $e)
{
// get the test and groups
$test = $e->getTest();
$groups = $test->getScenario()->getGroups();

// only restore if annotated to do so
if (in_array('api', $groups)) {
// get the Db module
$db = $this->getModule('Db');

// re-initialize with web service one api config and execute
$webserviceOneConfig = $this->getWebServiceOneConfig($this->config);
$db->_reconfigure($webserviceOneConfig);
$db->_initialize();
$db->_after($test);

// re-initialize with web service two api config and execute
$webserviceTwoConfig = $this->getWebServiceTwoConfig($this->config);
$db->_reconfigure($webserviceTwoConfig);
$db->_initialize();
$db->_after($test);
}
}

private function getWebServiceOneConfig($config)
{
return array(
'dsn' => 'your first webservice db dsn',
'dump' => '/path/to/your/first/dump/file',
'populate' => true,
'cleanup' => true,
);
}

private function getWebServiceTwoConfig($config)
{
return array(
'dsn' => 'your second webservice db dsn',
'dump' => '/path/to/your/second/dump/file',
'populate' => true,
'cleanup' => true,
);
}

Если моя установка расширения работает только в том случае, если заданный тест аннотирован правильно, это:

// in a Cest
/**
* @group api
*/
public function hereIsSomeTest(WebGuy $I)
{
...
}

// in a Cept
$scenario->group('api');
$I = new WebGuy($scenario);

Я настраиваю расширение для привязки к аннотации "api", поэтому мне не приходилось настраивать и разрывать базы данных API на каждом отдельном тесте, только те, которые относятся к данным. Тем не менее, вы можете очень легко изменить в соответствии с вашими потребностями.