应通过 composer require rector/rector –dev 安装为开发依赖,不可全局安装;旧版本需先 composer remove rector/rector 再重装;PHP 8.2+ 项目可加 –with-all-dependencies 解决依赖冲突;必须配置 rector.php 启用规则才能升级 PHPUnit。

怎么用 Composer 安装 Rector
Rector 不是靠 phpunit 那种全局命令安装的,它得作为项目级依赖加进 composer.json —— 否则后续没法精准适配你当前的 PHPUnit 版本和代码结构。
直接运行:
composer require rector/rector --dev
就行。别加 -g(全局),也别用 require-dev 以外的方式塞进去,否则 rector.php 配置和规则加载会出问题。
- 如果你项目里已有旧版 Rector(比如 v0.12),先
composer remove rector/rector再重装,避免规则冲突 - 某些 PHP 8.2+ 项目会因依赖冲突卡在
nikic/php-parser版本上,这时加--with-all-dependencies强制对齐 - 安装完检查
vendor/bin/rector是否可执行,而不是指望rector命令能直接敲出来(没配 PATH 就不行)
为什么必须写 rector.php 配置才能升级 PHPUnit
Rector 默认不启用任何规则,尤其 PHPUnit 升级涉及大量语义变更(比如 $this->assertEquals() → self::assertEquals()),不显式声明规则就等于白装。
最小可用配置长这样:
<?php use RectorConfigRectorConfig; use RectorPHPUnitSetPHPUnitSetList; return static function (RectorConfig $rectorConfig): void {$rectorConfig->sets([PHPUnitSetList::PHPUNIT_90]); };
-
PHPUnitSetList::PHPUNIT_90这类常量必须按你目标版本选,不是“最新”就行:升到 PHPUnit 10 要用PHPUnitSetList::PHPUNIT_100,混用会漏改或误改 - 如果项目还在用
phpunit/phpunitv7 或更老,得先手动升级 PHPUnit 到 v9+,再跑 Rector —— Rector 的规则集不向下兼容 v7 的断言写法 - 配置里别漏掉
$rectorConfig->paths([……]),否则默认只扫src/,tests/下的测试文件根本不会被处理
运行 Rector 升级时常见报错和绕过方法
最典型的是 Class "PHPUnitFrameworkTestCase" not found,这通常不是 Rector 问题,而是它在分析时加载了你的测试文件,但 autoloader 没覆盖 tests/ 目录。
立即学习 “PHP 免费学习笔记(深入)”;
- 临时解决:在
rector.php里加$rectorConfig->autoloadPaths(['tests']); - 遇到
Cannot use PHPUnitFrameworkAssert as Assert because the name is already in use:说明你代码里有use PHPUnitFrameworkAssert;和use function PHPUnitFrameworkassert*;并存,Rector 会试图全转成函数调用,删掉类引用即可 - 升级后 CI 报
Undefined method assertSame():这是 PHPUnit 10 移除了部分方法,得配合PHPUnitSetList::PHPUNIT_100+ 手动替换为assertSame()→assertIsString()等新断言
哪些 PHPUnit 语法 Rector 不会自动改
Rector 处理的是“可静态分析”的语法迁移,像 $this->expectException() 改 #[ExpectedException] 这种注解升级它不管,因为 PHP 8 属性需要手动补 use 语句且上下文敏感。
-
dataProvider方法签名变化(比如从public function provider(): array到public static function provider(): array)需人工确认,Rector 只改调用侧 - 自定义断言、MockBuilder 链式调用(如
$mock->expects(……)->method(……))基本不动,得自己对照 PHPUnit 升级文档逐个核对 - 配置文件里的
phpunit.xml标签(如<coverage>结构)完全不在 Rector 范围内,别指望它帮你迁移到phpunit.xml.dist新格式
真正麻烦的从来不是 Rector 跑不跑得通,而是它改完之后,那些没被规则覆盖的边界 case 得你一行行看日志、比对 diff、再手动补 —— 尤其当项目混用 PHPUnit 7/8/9 风格的测试写法时。