Ответ 1
Посмотрите на модуль, который я внес, названный Codeception MultiDb.
Как я могу использовать две базы данных одновременно в генерации кода? Мое приложение PHP использует базу данных SQLite, но также подключается к другому приложению, которое использует базу данных MySQL.
В данный момент у меня есть это в моем файле codeception.yml:
modules:
config:
Db:
dsn: 'sqlite:db.sqlite'
dump: tests/_data/dump.sql
populate: true
cleanup: true
Таким образом, база данных каждый раз заполняется тестовыми данными и автоматически очищается в конце тестов. Как я могу добавить базу данных MySQL сейчас, которая делает то же самое?
Кроме того, в случае, если это возможно, в некоторых тестах я использую функцию "seeInDatabase". Как я могу указать, к какой базе данных он должен выглядеть?
Посмотрите на модуль, который я внес, названный Codeception MultiDb.
Мы можем сделать это довольно легко, используя классы расширения 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 на каждом отдельном тесте, только те, которые относятся к данным. Тем не менее, вы можете очень легко изменить в соответствии с вашими потребностями.