应使用项目级安装 composer require --dev phpunit/phpunit 并配置 autoload-dev,避免全局安装路径未加入 $PATH 或自动加载失效;需按 PHP 和框架版本选对 PHPUnit 版本(如 Laravel 10+ 用 ^10.5),勿误装已废弃的 phpunit-skeleton-generator。

直接用 composer require --dev phpunit/phpunit 就能装上最新稳定版 PHPUnit,但实际项目中常因 PHP 版本、依赖冲突或自动加载问题导致 vendor/bin/phpunit 执行失败——这不是安装没成功,而是环境没对齐。
为什么 phpunit 命令找不到或报错 Class not found
常见于全局安装(composer global require phpunit/phpunit)后未将 ~/.composer/vendor/bin 加入 $PATH,或项目级安装后误用全局命令。更典型的是:项目已存在 autoload-dev 配置缺失,导致 PHPUnit 的测试类无法被自动加载。
- 确认安装方式是项目级(推荐):
composer require --dev phpunit/phpunit
- 检查
composer.json中是否包含:"autoload-dev": { "psr-4": { "Tests\\": "tests/" } } - 执行
composer dump-autoload强制刷新自动加载映射 - 勿混用
--global和--dev;二者配置隔离,路径和依赖不互通
如何指定 PHPUnit 版本适配 PHP 8.2+ 或 Laravel 10+
PHPUnit 10 要求 PHP ≥ 8.1,但默认 composer require --dev phpunit/phpunit 可能拉取到不兼容的高版本(如 v11 需 PHP 8.2+),而 Laravel 10 默认锁定了 ^10.1。盲目升级会触发 Declaration of PHPUnit\Framework\TestCase::setUp(): void must be compatible 类型错误。
- 查清当前 PHP 版本:
php -v - Laravel 10+ 项目建议显式指定:
composer require --dev phpunit/phpunit:^10.5
- PHP 8.2+ 且无框架约束,可选 v11:
composer require --dev phpunit/phpunit:^11.0
- 安装后验证:
vendor/bin/phpunit --version,输出应与预期一致
断言库(phpunit/phpunit)和测试骨架(phpunit/phpunit-skeleton-generator)别搞混
phpunit-skeleton-generator 是旧版工具,自 PHPUnit 9.3 起已废弃,不再维护。它曾用于根据接口生成测试类模板,但现在完全由 IDE 或手动编写替代。新手容易误装它,结果发现命令不存在或与新版 PHPUnit 不兼容。
立即学习“PHP免费学习笔记(深入)”;
- 只需安装
phpunit/phpunit,它已内置全部断言方法($this->assertEquals()、$this->assertTrue()等) - 不要运行
phpunit-skelgen—— 这个命令在 v10+ 中已被移除 - 若需快速创建测试类,用 IDE 的“Generate Test”功能,或手写一个继承
PHPUnit\Framework\TestCase的类即可
真正卡住人的往往不是“怎么装”,而是装完之后 vendor/bin/phpunit tests/ExampleTest.php 报 Class 'Tests\ExampleTest' not found —— 这说明 tests/ 目录没被 autoload-dev 正确注册,或者文件命名/命名空间没对上。多花 30 秒核对 composer.json 里的 autoload-dev 和测试文件的 namespace,比重装十遍都管用。











