如何解决Laravel运行parallel并行测试时无数据库创建权限的错误
错误原因
Laravel 运行 php artisan test --parallel 并行测试时,会为每个测试进程自动创建独立的隔离数据库,命名规则为 {配置的DB_DATABASE}_test_{进程号},避免不同进程的测试数据互相干扰。本次报错是因为 .env.test 中配置的数据库用户 test 没有 PostgreSQL 的创建数据库权限,无法自动生成进程对应的测试库。
修复方案
方案1:授予数据库用户建库权限(本地开发推荐)
登录 PostgreSQL 超级用户(默认账号为 postgres),执行以下 SQL 命令给 test 用户开通建库权限:
ALTER USER test CREATEDB;
配置完成后重新执行并行测试命令即可,Laravel 会自动创建所有需要的进程级测试库。
方案2:预创建测试库(权限管控严格场景推荐)
如果不希望给 test 用户开通建库权限,可以手动预先创建所有进程需要的测试库:
- 首先确认并行测试的进程数:默认等于设备 CPU 核心数,也可以通过命令
php artisan test --parallel --processes=N手动指定 N 个进程 - 用超级用户登录 PostgreSQL,依次创建对应数量的测试库并指定所有者为
test,示例(以4个进程为例):
CREATE DATABASE test_db_test_1 OWNER test; CREATE DATABASE test_db_test_2 OWNER test; CREATE DATABASE test_db_test_3 OWNER test; CREATE DATABASE test_db_test_4 OWNER test;
创建完成后再运行并行测试即可正常执行。
可选配置:自定义并行测试数据库命名规则
如果需要修改默认的测试库命名规则,可在项目 app/Providers/AppServiceProvider.php 的 boot 方法中添加以下配置:
use Illuminate\Testing\ParallelTesting; public function boot() { ParallelTesting::databasesUsing(function (int $token) { // 可自定义数据库名称规则,$token 为进程编号 return 'custom_test_db_' . $token; }); }
注意:如果执行测试时没有正确加载
.env.test配置,可以在命令末尾添加--env=test参数强制指定测试环境。
内容的提问来源于stack exchange,提问作者mohammad
相关产品推荐
相关产品推荐

