Codeception & Symfony - 运行 测试前的 Doctrine 迁移
Codeception & Symfony - run Doctrine migrations before tests
我有一个 Symfony 4 应用程序和一个带有 Doctrine 迁移的 Doctrine。我正在为 运行ning API 测试引入 Codeception,并且需要在测试 运行 之前 运行 迁移。由于我正在使用 Doctrine2 module I don't really want to be also including the DB module,因为测试不需要它,并且需要在两个不同的位置配置测试数据库。
我正在使用 Symfony module currently, and I noticed that the Laravel module 有一个 run_database_migrations
配置选项。
测试前在 Symfony 应用程序中处理 运行Doctrine 迁移命令的最佳方法是什么? (bin/console doctrine:migrations:migrate -n
为具体命令)
编辑 我有一个解决方案,虽然有效,但远非理想。通过使用 Codeception Customisation 我创建了以下扩展,基本上手动 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
我总是创建一个 bash 脚本或 Makefile 来执行此操作。
bash 命令
我的 ./runtests.sh
脚本包含
#!/bin/bash
./bin/console command:for:migrations
./bin/phpunit
生成文件
与 Makefile 相同
.FOO: testsuite
testsuite:
./runtests.sh
或
.FOO: testsuite
testsuite:
./bin/console command:for:migrations
./bin/phpunit
为什么我更喜欢 Makefile
最近我在我的 .bash_profile 中添加了这个脚本,它允许我从 bash 生成文件中生成的所有目标自动完成(非常简单,因为您不再需要记住所有命令,但只需 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
我花了一段时间尝试了几种不同的方法来实现这一目标。我最初使用 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
或更高版本也显示数据库和迁移命令的输出);
使用 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]);
我有一个 Symfony 4 应用程序和一个带有 Doctrine 迁移的 Doctrine。我正在为 运行ning API 测试引入 Codeception,并且需要在测试 运行 之前 运行 迁移。由于我正在使用 Doctrine2 module I don't really want to be also including the DB module,因为测试不需要它,并且需要在两个不同的位置配置测试数据库。
我正在使用 Symfony module currently, and I noticed that the Laravel module 有一个 run_database_migrations
配置选项。
测试前在 Symfony 应用程序中处理 运行Doctrine 迁移命令的最佳方法是什么? (bin/console doctrine:migrations:migrate -n
为具体命令)
编辑 我有一个解决方案,虽然有效,但远非理想。通过使用 Codeception Customisation 我创建了以下扩展,基本上手动 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
我总是创建一个 bash 脚本或 Makefile 来执行此操作。
bash 命令
我的 ./runtests.sh
脚本包含
#!/bin/bash
./bin/console command:for:migrations
./bin/phpunit
生成文件
与 Makefile 相同
.FOO: testsuite
testsuite:
./runtests.sh
或
.FOO: testsuite
testsuite:
./bin/console command:for:migrations
./bin/phpunit
为什么我更喜欢 Makefile
最近我在我的 .bash_profile 中添加了这个脚本,它允许我从 bash 生成文件中生成的所有目标自动完成(非常简单,因为您不再需要记住所有命令,但只需 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
我花了一段时间尝试了几种不同的方法来实现这一目标。我最初使用 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
或更高版本也显示数据库和迁移命令的输出);
使用 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]);