PHPUnit 10 要求 PHP 8.1+,移除大量废弃接口和类,升级需检查PHP版本、同步更新扩展、替换弃用断言、调整phpunit.xml配置、验证第三方兼容性并注意行为变化。

PHPUnit 10 要求 PHP 8.1+,且移除了大量废弃接口和类;直接 composer update phpunit/phpunit 很可能失败或导致测试崩溃。
确认当前环境是否满足 PHPUnit 10 的最低要求
PHPUnit 10 不再支持 PHP 7.x 或 8.0。运行 php -v 检查版本,必须 ≥ 8.1。同时检查 composer show phpunit/phpunit 确认当前是 9.x(如 9.6.15),避免误判为已升级。
- PHP 8.0 及以下 → 必须先升级 PHP,否则
composer require phpunit/phpunit:^10会因平台约束被拒绝 - 项目中若用
phpunit/phpunit以外的扩展(如phpunit/php-code-coverage),它们也需同步升级到兼容 v10 的版本(如^10.1) - Composer 2.2+ 推荐,旧版可能无法正确解析 v10 的依赖约束
替换所有已弃用的断言方法和类引用
PHPUnit 10 彻底删除了 assertInternalType()、assertNotEquals()、$this->setExpectedException() 等方法,以及 PHPUnit\Framework\Assert 以外的旧命名空间别名(如 PHPUnit_Framework_TestCase)。
- 用
assertIsArray()替代assertInternalType('array', ...) - 用
assertNotSame()或assertNotEquals()(仅当语义明确时)替代已删的assertNotEquals()(注意:v10 中assertNotEquals()是保留的,但行为更严格;真正被删的是带 $delta 参数的旧重载) - 所有
extends PHPUnit_Framework_TestCase必须改为extends \PHPUnit\Framework\TestCase - 搜索整个代码库中的
getMock()、getMockBuilder()—— 它们仍存在,但推荐改用createMock()/createStub()(v9.3+ 引入,v10 中更一致)
处理 phpunit.xml 配置变更
v10 移除了 <logging></logging> 下的 type="coverage-html" 等旧格式,且默认不再生成 coverage-clover 文件;<testsuites></testsuites> 结构也更严格。
立即学习“PHP免费学习笔记(深入)”;
-
<logging></logging>块中必须用type="coverage-html"→ 改为type="coverage-html"仍可用,但输出路径需显式设target="build/coverage",否则报错 -
<filter><whitelist></whitelist></filter>已完全移除 → 改用<filter><include><directory></directory></include></filter>,并确保suffix=".php"明确声明 - 若使用
--colors=alwaysCLI 参数,v10 要求终端支持真彩色,否则可能报RuntimeException: Failed to determine color support;CI 环境建议加--no-colors
验证第三方包与插件兼容性
很多常用工具(如 phpunit-speedtrap、phpunit-finder、prophecy)在 v10 发布初期未及时适配,会导致 composer update 卡住或测试运行时报 Class not found。
- 运行
composer prohibits phpunit/phpunit:10查看哪些依赖在阻止升级 -
phpunit/php-code-coverage必须 ≥ 10.1.0;phpunit/php-file-iterator≥ 4.1.0;phpunit/php-text-template≥ 3.1.0 - 若用 Laravel,确认
orchestra/testbench≥ 8.0(对应 Laravel 10);Symfony 用户需检查symfony/phpunit-bridge是否 ≥ 6.4 - 跳过插件临时验证:先注释掉
phpunit.xml中的<extensions></extensions>,跑通基础测试后再逐个恢复
最易被忽略的是断言方法的行为变化:比如 assertEquals() 在 v10 中对浮点数比较默认启用更严格的 delta 检查,而旧测试可能依赖宽松比较;不重读变更日志直接升级,往往在 CI 上突然失败。



















