Composer怎么安装Rector PHPUnit_Composer如何用Rector自动升级PHPUnit测试代码到最新版本语法【技巧】

2次阅读

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

Composer 怎么安装 Rector PHPUnit_Composer 如何用 Rector 自动升级 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/phpunit v7 或更老,得先手动升级 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(): arraypublic static function provider(): array)需人工确认,Rector 只改调用侧
  • 自定义断言、MockBuilder 链式调用(如 $mock->expects(……)->method(……))基本不动,得自己对照 PHPUnit 升级文档逐个核对
  • 配置文件里的 phpunit.xml 标签(如 <coverage> 结构)完全不在 Rector 范围内,别指望它帮你迁移到 phpunit.xml.dist 新格式

真正麻烦的从来不是 Rector 跑不跑得通,而是它改完之后,那些没被规则覆盖的边界 case 得你一行行看日志、比对 diff、再手动补 —— 尤其当项目混用 PHPUnit 7/8/9 风格的测试写法时。

星耀云
版权声明:本站原创文章,由 星耀云 2026-03-24发表,共计2061字。
转载说明:转载本网站任何内容,请按照转载方式正确书写本站原文地址。本站提供的一切软件、教程和内容信息仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。
text=ZqhQzanResources