Symfony + PHPUnit环境下测试结束后自动删除测试数据库的实现方案
解决方案
有两种常用的实现方案,可根据使用场景选择:
方案1:在bootstrap.php中注册 shutdown 回调(最通用)
直接在你现有tests/bootstrap.php文件的末尾添加如下代码即可:
// 注册全局回调,PHP进程结束时自动删除测试数据库 register_shutdown_function(function () { passthru('php bin/console doctrine:database:drop --env=test --force --if-exists'); });
这个方案适配所有PHPUnit启动方式:不管你是直接跑phpunit命令、还是用IDE启动测试,只要加载了这个bootstrap文件,测试跑完(包括测试中途报错、断言失败、甚至手动按Ctrl+C中断测试)都会触发回调执行删库逻辑,和你现有的启动前删库逻辑完全对应。
你当前引入的dama/doctrine-test-bundle事务自动回滚逻辑和该方案完全无冲突,不需要做额外适配。
方案2:使用Composer脚本钩子(适合统一管理命令场景)
如果你平时都是通过Composer命令启动测试,可以直接在composer.json的scripts区块添加后置钩子:
{ "scripts": { "test": "phpunit", "post-test": "php bin/console doctrine:database:drop --env=test --force --if-exists" } }
后续只要通过composer run test启动测试,测试执行完成后Composer会自动运行后置命令删除测试数据库。
注意事项
如果你使用ParaTest做并行测试,不同测试进程会生成带不同TEST_TOKEN后缀的独立测试库,上述两种方案默认只会删除当前进程对应的测试库,如果你需要清理所有测试库,可以把删库命令替换为匹配_test后缀的批量删除逻辑即可。
内容的提问来源于stack exchange,提问作者techws
相关产品推荐
相关产品推荐

