Codeception и Symfony - запускайте миграции Doctrine перед тестами

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

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

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


Редактировать У меня есть решение, которое хоть и работает, но далеко не идеально. Используя Настройка кодирования, я создал следующее расширение, которое в основном вручную exec выполняет базовые команды 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);
    }
}

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
9
0
2 274
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Для этого я всегда создаю сценарий 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_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

Спасибо за подробный ответ - я рад продвигаться по этому пути в качестве запасного варианта, но в идеале я хочу, чтобы обработка базы данных (создание, перенос) выполнялась набором тестов, а не извне, поскольку набор тестов уже действует в тестовая среда (не для разработчиков) и обрабатывает очистку / разборку. Приведенное выше хакерское решение делает это за меня, поэтому для запуска тестов не требуется никакой предварительной настройки, все это обрабатывается в тестовой команде и настраивает БД в соответствии с переменными тестового окружения, под которыми также запускаются сами тесты.

Chris Brown 26.04.2018 14:32
Ответ принят как подходящий

Я потратил некоторое время, пытаясь достичь этого несколькими способами. Первоначально я использовал 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);

С Codeception 4 вы можете сделать это без модуля Cli:

$symfony = $this->getModule('Symfony');

$symfony->runSymfonyConsoleCommand('doctrine:database:drop',['--if-exists'=>true, '--force'=>true]);
$symfony->runSymfonyConsoleCommand('doctrine:database:create');
$symfony->runSymfonyConsoleCommand('doctrine:migrations:migrate', ['--no-interaction'=>true]);

Другие вопросы по теме