Codeception & Symfony - запуск миграции Doctrine перед тестированием - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть приложение Symfony 4 и Doctrine с миграциями Doctrine.Я представляю Codeception для запуска тестов API, и мне нужно запустить миграцию до запуска тестов.Поскольку я использую модуль Doctrine2 , я не хочу также включать модуль DB , так как он не нужен для тестов и потребует настройки тестовой базы данных в двух разныхместоположения.

В настоящее время я использую модуль Symfony , и я заметил, что у модуля Laravel есть опция конфигурации run_database_migrations.

Как лучше всего выполнить команду переноса Doctrine в приложении Symfony перед тестами?(bin/console doctrine:migrations:migrate -n - это конкретная команда).


Редактировать У меня есть решение, которое, хотя и работает, далеко не идеально.Используя Codeception Customization , я создал следующее расширение, которое, в основном, вручную exec s базовых команд Symfony.

class DatabaseMigrationExtension extends Extension
{
    public static $events = [
        Events::SUITE_BEFORE => 'beforeSuite',
    ];

    public function beforeSuite(SuiteEvent $e)
    {
        echo(exec('bin/console doctrine:database:drop --force') . PHP_EOL);
        echo(exec('bin/console doctrine:database:create') . PHP_EOL);
        echo(exec('bin/console doctrine:migrations:migrate -n') . PHP_EOL);
    }
}

Edit 2 TheЦель этого состоит в основном в том, чтобы реплицировать аналогичную функциональность тому, что делает модуль DB Codeception, что позволяет вам предоставлять дамп SQL базы данных, который он автоматически использует в тестах, но вместо этого использовать миграции Doctrine для обработки базы данных.- https://codeception.com/docs/modules/Db#sql-data-dump

Ответы [ 2 ]

0 голосов
/ 28 апреля 2018

Я потратил некоторое время, пытаясь достичь этого несколькими способами.Первоначально я использовал RunProcess , однако это, казалось, вызывало спорадические проблемы с удалением и повторным созданием БД, несмотря на использование конфигурации спящего режима.В итоге я просто обновил существующее расширение, чтобы вместо него использовать модуль CLI, и оно работает как нужно (без необходимости создавать сценарии или выполнять несколько команд) и без необходимости использовать exec.

Окончательное расширение;

class DatabaseMigrationExtension extends Extension
{
    public static $events = [
        Events::SUITE_BEFORE => 'beforeSuite',
    ];

    public function beforeSuite()
    {
        try {
            /** @var \Codeception\Module\Cli $cli */
            $cli = $this->getModule('Cli');

            $this->writeln('Recreating the DB...');
            $cli->runShellCommand('bin/console doctrine:database:drop --if-exists --force');
            $cli->seeResultCodeIs(0);
            $cli->runShellCommand('bin/console doctrine:database:create');
            $cli->seeResultCodeIs(0);

            $this->writeln('Running Doctrine Migrations...');
            $cli->runShellCommand('bin/console doctrine:migrations:migrate --no-interaction');
            $cli->seeResultCodeIs(0);

            $this->writeln('Test database recreated');
        } catch (\Exception $e) {
            $this->writeln(
                sprintf(
                    'An error occurred whilst rebuilding the test database: %s',
                    $e->getMessage()
                )
            );
        }
    }
}

и зарегистрировано;

// codeception.yml
extensions:
    enabled:
        - \DatabaseMigrationExtension

Выход (-vvили выше также отображает вывод команд DB & Migration);

0 голосов
/ 26 апреля 2018

Я всегда создаю сценарий bash для этого или Makefile.

команда bash

Мои ./runtests.sh сценарии содержат

#!/bin/bash
./bin/console command:for:migrations
./bin/phpunit

Makefile

То же самое с Makefile

.FOO: testsuite
testsuite:
    ./runtests.sh

или

.FOO: testsuite
testsuite:
    ./bin/console command:for:migrations
    ./bin/phpunit

, почему я предпочитаю Makefile

Недавно я добавил этот скрипт в свой .bash_profile, который позволяет мне автозаполнять изbash все цели, сделанные в make-файле (очень просто, потому что вам больше не нужно запоминать все команды, а просто make и tab).

complete -W "` grep -oE '^ [a-zA-Z0-9 _.-] +: ([^ =] | $) 'Makefile | sed' s / [^ a-zA-Z0-9 _.-] * $ // '`" make

Таким образом, .. вы можете создать цель, например:

  • runtests
  • runtests_with_fixtures
  • миграции
  • runtests_with_migrations
  • ...

и т. Д.

Я предлагаю создать собственный и простой способ выполнения команд.


Вот способвыполнить все или только одну команду usgin make

.FOO: dropforce
dropforce:
    bin/console doctrine:database:drop --force

.FOO: dbcreate
dbcreate:
    bin/console doctrine:database:create

.FOO: migrate
migrate:
    bin/console doctrine:migrations:migrate

.FOO: suite
suite: dropforce dbcreate migrate
...