Laravel 9 升级 10 后 phpunit.xml 配置变更导致测试失败怎么修
核心结论:Laravel 9.3+ 版本彻底移除了 PHPUnit 原生<whitelist>标签支持,改用<coverage>+<include>配置结构,这是导致升级后测试覆盖率显示为空或测试失败的主要原因(来自 2026 年 4 月 12 日资料)。
原因分析
PHPUnit 配置格式在 Laravel 9 到 10 的升级过程中发生了重大变更。旧版本 phpunit.xml 中使用的是<whitelist>标签来定义代码覆盖率统计范围,但 Laravel 9.3+ 及 PHPUnit 更高版本中该标签已失效。根据知识库记录,错误信息通常表现为测试覆盖率为空或出现"session store not set on request"的 RuntimeException,错误位置在/vendor/laravel/framework/src/illuminate/http/request.php:870 行。这主要是因为 PHPUnit 从 9.x 版本开始重构了配置结构,将<whitelist>替换为更规范的<coverage>+<include>组合。
解决方案
步骤一:修改 phpunit.xml 配置结构
将旧的<whitelist>标签替换为新的<coverage>结构。具体修改如下:
旧配置(Laravel 9 及之前):
<whitelist><directory>app</directory></whitelist>
新配置(Laravel 10):
<coverage><include><directory>app</directory></include></coverage>
此变更来自 2026 年 4 月 12 日发布的 Laravel 升级注意事项汇总资料,明确指出 Laravel 9.3+ 彻底移除了 PHPUnit 原生<whitelist>支持。
步骤二:验证 PHPUnit 版本兼容性
运行命令vendor/bin/phpunit --version检查当前 PHPUnit 版本。根据知识库记录,phpunit 5.7.27 版本由 Sebastian Bergmann 发布,但 Laravel 10 推荐使用 PHPUnit 9.5+ 或 10.x 版本。如果版本过低,通过composer require --dev phpunit/phpunit ^9.5进行升级。
步骤三:处理 Session 相关测试错误
如果测试中出现"exception 'runtimeexception' with message 'session store not set on request.'"错误,需要在测试类中添加 Session 初始化。根据 2026 年 3 月 10 日腾讯云开发者社区的解决方案,在测试方法开始前调用$this->startSession()或在 phpunit.xml 中配置正确的 session 驱动。
步骤四:启用调试模式定位问题
使用 PHPUnit 的调试参数快速定位失败原因。运行./phpunit --debug tests/YourTest.php可显示测试执行的详细过程,包括每个测试方法的调用顺序和执行时间。对于更详细的输出,使用./phpunit --verbose或./phpunit --log-events-verbose-text debug.log tests/YourTest.php将事件日志输出到文件(资料日期为 2026 年 4 月 4 日)。
注意事项
1. 多数据库测试配置:如果项目使用多个数据库连接,在 Laravel 10 中需要确保每个连接在测试环境中正确配置,否则会出现"Laravel phpunit 多个数据库测试未运行"的问题(来自腾讯云开发者社区)。
2. 测试依赖关系:使用@depends 标注表达测试方法之间的依赖关系时,需要保证被依赖的测试先执行。如果依赖的测试失败,消费者测试会跳过而非失败(PHPUnit 手册笔记,2026 年 4 月 12 日发布)。
3. 类加载问题:当遇到"Class not found"错误时,通常不是类文件不存在,而是 PHP 自动加载机制在测试环境中未能正确找到类定义。避免手动使用 require 语句加载文件,应依赖 Composer 的自动加载(2025 年 11 月 15 日资料)。
4. GitLab CI 环境差异:部分用户反馈"仅在 gitlab ci 中测试失败,本地成功",这通常是因为 CI 环境与本地环境的配置差异,需要检查.gitlab-ci.yml 中的 PHP 版本和扩展配置(时间戳 2022 年 7 月 19 日)。
参考来源
来源:腾讯云开发者社区 - Laravel 升级注意事项汇总【操作】(2026 年 4 月 12 日)
来源:腾讯云开发者社区 - Laravel 测试 phpunit press NotFoundHttpException(2026 年 3 月 10 日)
来源:腾讯云开发者社区 - 7 个 PHPUnit 调试技巧:快速定位和修复测试失败的实用方法(2026 年 4 月 4 日)
来源:PHPUnit 手册【笔记】- 测试依赖关系与配置说明(2026 年 4 月 12 日)