Symfony3中PHPUnit测试无法连接测试数据库问题咨询
数据库测试的正确姿势&你的配置问题排查
首先明确说:修改parameters.yml绝对不是数据库测试的最佳实践,反而会给自己埋坑,原因很简单:
parameters.yml是本地开发的专属配置,一般都会被.gitignore排除,团队里其他人拉代码根本看不到你的测试库配置,没法复用;- 这样会把开发和测试环境的配置混在一起,一不小心就会在开发时误连测试库,或者测试时手滑操作主库,风险极高;
- 正确的做法是用环境变量隔离测试环境配置,完全不碰开发环境的参数文件。
接下来聊聊你为啥配置了phpunit.xml.dist还是没用——问题大概率出在你的参数配置没有引用环境变量:
如果你的parameters.yml(Symfony 3及以下)或者config/packages/doctrine.yaml(Symfony 4+)里,数据库URL是硬编码的,比如:
# Symfony 3的parameters.yml parameters: database_url: mysql://username:password@localhost/symfony_main
或者
# Symfony 4+的doctrine.yaml doctrine: dbal: url: mysql://username:password@localhost/symfony_main
那哪怕你在phpunit.xml.dist里设置了DATABASE_URL环境变量,Symfony也会优先用硬编码的这个值,因为它根本没去读环境变量。
解决办法很简单,把数据库URL改成引用环境变量:
# Symfony 3的parameters.yml parameters: database_url: '%env(DATABASE_URL)%'
或者
# Symfony 4+的doctrine.yaml doctrine: dbal: url: '%env(DATABASE_URL)%'
这样一来,PHPUnit运行时,phpunit.xml.dist里设置的DATABASE_URL就会生效,自动切换到你的测试数据库symfony_tests。
另外还有几个小细节要注意:
- 如果你本地有
phpunit.xml文件(不是dist那个),它的优先级比phpunit.xml.dist高,要确保里面的配置也是正确的; - 测试前最好重置一下测试库的状态,比如用这组命令(Symfony 3用
app/console,4+用bin/console):
或者用php bin/console doctrine:database:drop --force --env=test php bin/console doctrine:database:create --env=test php bin/console doctrine:schema:create --env=testDAMA\DoctrineTestBundle这类工具,自动帮你在测试前后重置数据库,省得手动操作。
内容的提问来源于stack exchange,提问作者PrimuS
相关产品推荐
相关产品推荐

