Laravel 11 官方仅支持 PHPUnit 10.5.x,不兼容 11.x;需将 composer.json 中 PHPUnit 版本锁定为 "^10.5",删除手动声明的 php-code-coverage,执行 composer update phpunit/phpunit --with-all-dependencies,并更新测试类继承路径、替换 assertArraySubset() 等废弃方法。

确认 PHPUnit 与 Laravel 11 的官方兼容性
截至 2026 年 8 月,Laravel 11 官方明确支持 PHPUnit 10.5.x,不支持 PHPUnit 11.x —— 尝试安装 ^11.0 会导致 vendor/autoload.php 加载失败或 TestCase 类无法解析。
运行 composer show phpunit/phpunit 查看当前版本;若输出含 11. 开头的版本号,必须降级。
修改 composer.json 并锁定 PHPUnit 10.5
打开 composer.json,定位到 "require-dev" 区块。
将 "phpunit/phpunit": "^11.0" 替换为 "phpunit/phpunit": "^10.5";若该行不存在,则新增这一行。
立即学习“PHP免费学习笔记(深入)”;
【必须同步删除 "phpunit/php-code-coverage" 手动声明】 —— Laravel 11 已通过 phpunit/phpunit 自动拉取兼容版覆盖率工具,手动指定旧版会引发冲突。
保存文件后,执行:composer update phpunit/phpunit --with-all-dependencies。这一步强制 Composer 重解依赖树,避免子包残留 11.x 版本。
适配 PHPUnit 10.5 的关键代码变更
方法一:更新测试基类继承路径
检查所有 tests/Feature/ 和 tests/Unit/ 下的测试类,确认 extends TestCase 前的命名空间是否为 use Tests\TestCase; —— Laravel 11 不再提供 Illuminate\Foundation\Testing\TestCase,所有测试必须继承项目根目录下 tests/TestCase.php 文件定义的类。
方法二:替换废弃断言方法
PHPUnit 10.5 移除了 assertArraySubset()。若测试中存在该调用,需改用 $this->assertContainsEquals() 或 $this->assertEquals($expected, array_intersect_key($actual, $expected)) 手动比对子集。
方法三:修复数据库事务回滚行为
Laravel 11 默认启用 RefreshDatabase 的并行安全模式,若测试类同时使用 @beforeClass 和数据库操作,需在类顶部添加 use DatabaseTransactions; trait,并移除 RefreshDatabase —— 否则 setUpBeforeClass() 中插入的数据不会被自动清理。



















