Symfony 6单元测试无法创建test环境数据库报1044访问拒绝错误
问题根因
1044 访问被拒错误由两个核心问题共同导致:
- 你的Docker部署的MariaDB在初始化时,通过环境变量创建的普通用户
user,仅被授予了开发库db的权限,没有测试库db_test的创建、访问权限。 - 你的
.env.test中DATABASE_URL虽然写的数据库名是db,但Symfony Doctrine Bundle在测试环境默认开启dbname_suffix配置,会自动给数据库名追加_test后缀,实际尝试连接的是db_test库,最终触发无权限报错。同时测试环境直接连开发库本身就是错误配置,测试的写操作、数据重置会污染开发环境数据。
解决步骤
1. 修正测试环境数据库配置
修改.env.test中的DATABASE_URL,明确指定测试库名为db_test,修改后完整内容如下:
KERNEL_CLASS='App\Kernel' APP_SECRET='$ecretf0rt3st' SYMFONY_DEPRECATIONS_HELPER=999999 PANTHER_APP_ENV=panther PANTHER_ERROR_SCREENSHOT_DIR=./var/error-screenshots DATABASE_URL="mysql://user:test@127.0.0.1:3306/db_test?serverVersion=mariadb-10.5.8"
注意:不要直接复用dev环境的数据库连接,测试用例的写操作、数据fixture加载会清空/修改库内数据,必须和开发、生产库物理隔离。
2. 给数据库用户授予测试库权限
按需选择以下任意一种方案即可:
方案A:临时授权快速修复
直接使用root账号创建测试库,再给普通用户授权:
- 先通过root账号创建测试库,执行命令时输入root密码
test:php bin/console doctrine:database:create --env=test --connection=mysql://root:test@127.0.0.1:3306/db_test - 进入运行中的MariaDB容器给普通用户授权:
# 先通过docker ps查看db容器的实际名称,替换命令中的<db容器名> docker exec -it <db容器名> mysql -uroot -ptest # 容器内数据库连接成功后执行授权语句 GRANT ALL PRIVILEGES ON db_test.* TO 'user'@'%'; FLUSH PRIVILEGES; exit;
方案B:修改Docker配置永久生效(推荐长期使用)
修改配置让MariaDB初始化时就给业务用户授予所有db_前缀库的权限,避免后续新增测试库、预发库重复操作:
- 在项目根目录新建
docker/mariadb/init.sql文件,写入初始化授权逻辑:GRANT ALL PRIVILEGES ON `db\_%`.* TO 'user'@'%'; FLUSH PRIVILEGES; - 修改
docker-compose.yml中db服务的volume配置,挂载初始化脚本:services: db: image: mariadb ports: - "3306:3306" environment: MYSQL_USER: user MYSQL_DATABASE: db MYSQL_PASSWORD: test MYSQL_ROOT_PASSWORD: test volumes: - db-data:/var/lib/mysql # 新增挂载初始化脚本 - ./docker/mariadb/init.sql:/docker-entrypoint-initdb.d/init.sql - 重建数据库容器(注意:该操作会清空现有db库的所有本地数据,请提前备份):
docker-compose down -v docker-compose up -d
3. 验证配置
配置修改完成后,先清除test环境缓存,再重新执行建库、测试命令:
php bin/console cache:clear --env=test php bin/console doctrine:database:create --env=test # 若有数据库迁移、测试fixture可按需执行 php bin/console doctrine:migrations:migrate --env=test -n ./vendor/bin/phpunit --testsuite "Project Test Suite"
额外排查点
如果完成以上操作后仍报错,逐一检查以下项:
- 确认项目根目录下不存在
.env.test.local文件,或该文件内的DATABASE_URL没有覆盖你修改的测试库配置(Symfony环境配置加载优先级中,.env.<env>.local优先级高于.env.<env>) - 确认本地3306端口没有被其他本机安装的MySQL/MariaDB服务占用,可通过
telnet 127.0.0.1 3306验证数据库连通性 - 检查测试用例方法命名:PHPUnit默认只会执行方法名以
test开头的测试方法,你当前写的getAllUsers方法不会被识别执行,需要改名为testGetAllUsers,或给方法添加/** @test */注解。
内容的提问来源于stack exchange,提问作者Arthur
相关产品推荐
相关产品推荐

