You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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账号创建测试库,再给普通用户授权:

  1. 先通过root账号创建测试库,执行命令时输入root密码test:
    php bin/console doctrine:database:create --env=test --connection=mysql://root:test@127.0.0.1:3306/db_test
    
  2. 进入运行中的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_前缀库的权限,避免后续新增测试库、预发库重复操作:

  1. 在项目根目录新建docker/mariadb/init.sql文件,写入初始化授权逻辑:
    GRANT ALL PRIVILEGES ON `db\_%`.* TO 'user'@'%';
    FLUSH PRIVILEGES;
    
  2. 修改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
    
  3. 重建数据库容器(注意:该操作会清空现有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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 17:24:21