我正在使用PHPUnit (9.5)withSymfony (5.3).
对于我的测试,我使用config/packages/test/doctrine.yaml中的默认测试数据库配置:
doctrine:
dbal:
# "TEST_TOKEN" is typically set by ParaTest
dbname_suffix: '_test%env(default::TEST_TOKEN)%'
所以我的测试使用与prod相同的数据库,后缀为'_test'。
我添加了一些代码到tests/bootstrap.php在每次测试运行之前自动创建/重置数据库:
// delete database if exists, then create
passthru('php bin/console doctrine:database:drop --env=test --force --if-exists');
passthru('php bin/console doctrine:database:create --env=test');
// run migrations
passthru('php bin/console doctrine:migrations:migrate --env=test -n');
和我使用dama/doctrine-test-bundle对于每个测试的自动事务。
运行得很好,但是我有一个问题:
是否有一种方法可以在测试运行结束时删除数据库?(就像我在bootstrap.php中做的那样)
我知道你的bootstrap.php文件在测试前运行,你需要一个解决方案来在测试后启动一些东西。
首先,创建一个删除测试数据库的命令。
无论如何,如果您不在显式测试环境中(因为这意味着您在生产环境中),请非常小心命令中的代码停止所有执行。
然后,您可以更改编写器。Json文件,以便在一系列脚本测试后启动创建的命令。
下面是一个例子
"scripts": {
"test-and-remove": [
"@putenv APP_ENV=test",
"phpunit --configuration phpunit.xml",
"php bin/console app:drop-test-database"
],
然后你只需要通过这个新命令启动你的测试:
composer test-and-remove