必须手动指定PHPUnit版本:PHP 7.4/8.0用^9.6,8.1用^10.5,8.2+可试^11.0;始终通过./vendor/bin/phpunit运行;确保composer.json含autoload-dev配置并执行dump-autoload;用--generate-configuration生成phpunit.xml。

直接运行 composer require --dev phpunit/phpunit 就行,但版本必须手动锁死
装不上、装了跑不了、一跑就报 Declaration of PHPUnitFrameworkTestCase::setUp(): void must be compatible —— 90% 是因为没指定版本,让 Composer 自己选了个和你 PHP 不兼容的。
PHP 版本决定你能用哪个 PHPUnit 主版本:
- PHP 7.4 或 8.0 →
composer require --dev phpunit/phpunit:^9.6 - PHP 8.1(比如 Laravel 10+ 默认)→
composer require --dev phpunit/phpunit:^10.5 - PHP 8.2+ 且无框架强约束 → 可试
composer require --dev phpunit/phpunit:^11.0,但注意 v11 已彻底移除phpunit-skeleton-generator,别再找phpunit-skelgen命令
不写 ^9.6 而只写 phpunit/phpunit,Composer 可能拉 v11.0.0,而你本地是 PHP 8.1,立刻报错。这不是安装失败,是版本硬冲突。
./vendor/bin/phpunit 是唯一可靠入口,别信 phpunit 命令
终端敲 phpunit 报 command not found?正常。Composer 从不把命令加进系统 PATH,它只放进项目自己的 vendor/bin/。
立即学习“PHP免费学习笔记(深入)”;
正确做法永远是:
- Linux/macOS:
./vendor/bin/phpunit - Windows:
vendorinphpunit - 想偷懒统一调用?在
composer.json的scripts里加一行:"test": "phpunit",之后运行composer test即可
千万别 composer global require phpunit/phpunit:不同项目要不同版本时,全局只有一个 phpunit 可执行文件,必然打架;CI 环境默认也不认全局 bin 目录。
Class 'PHPUnitFrameworkTestCase' not found 真相是 autoload-dev 没生效
这个错误不是 PHPUnit 没装好,而是你的测试类根本没被自动加载,或者 PHPUnit 自身的类没加载进来。
必须检查三件事:
-
composer.json里有这段吗?"autoload-dev": { "psr-4": { "Tests\": "tests/" } } - 改完
autoload-dev后,运行过composer dump-autoload吗?漏这步,类就永远“不存在” - 测试文件里写的是
use PHPUnitFrameworkTestCase;,不是老式的extends PHPUnit_Framework_TestCase(v9+ 已弃用)
另外,phpunit.xml 里 bootstrap="vendor/autoload.php" 这行不能删——没它,use AppTestSomeClass 也会报错。
生成 phpunit.xml 别手写 DTD,用命令一键初始化最稳
手动写配置容易少斜杠、多空格、写错 namespace,反而比不配还麻烦。直接运行:
./vendor/bin/phpunit --generate-configuration
它会引导你填测试目录、是否启用颜色、要不要 coverage,最后生成一个可用的 phpunit.xml。之后只需确认两处:
-
<directory>tests/</directory>是否指向你放测试的目录 - 如果用了自定义启动逻辑(比如初始化 DB),确保
bootstrap属性指向正确的文件,且那个文件本身不会抛错
新版 PHPUnit(9.6+)默认忽略 DTD 声明,手写反而可能触发 XML 解析失败。真正卡住人的地方,往往不是不会写断言,而是 phpunit.xml 少了个斜杠、composer require 漏了 --dev、或者误以为全局装一次就能一劳永逸。



















