直接用 composer require --dev phpunit/phpunit 可安装 PHPUnit,但运行失败主因是环境不匹配:全局安装未配 $PATH、误调全局命令、或 composer.json 缺 autoload-dev 配置;须按 PHP/Laravel 版本选对应 PHPUnit(如 Laravel 10+ 用 ^10.5),并执行 composer dump-autoload --dev 启用测试类自动加载。

直接用 composer require --dev phpunit/phpunit 就能装上,但装完跑不起来是常态——问题通常出在版本错配、autoload-dev 没配或误用了全局安装。
为什么 vendor/bin/phpunit 找不到或报 Class not found
这不是没装成功,而是环境链断了。常见原因有三个:
- 执行了
composer global require phpunit/phpunit,但~/.composer/vendor/bin没进$PATH; - 项目级安装了,却在终端里直接敲
phpunit(没加vendor/bin/前缀),系统找的是全局命令; -
composer.json里缺autoload-dev配置,导致测试类路径没注册,vendor/autoload.php根本不加载tests/下的文件。
验证方式:运行 vendor/bin/phpunit --version。能输出版本号,说明二进制和依赖都 OK;报 “command not found” 就是路径问题,报 “Class not found” 多半是 autoload-dev 漏了。
怎么选对 PHPUnit 版本适配 PHP 和 Laravel
盲目 require --dev phpunit/phpunit 可能拉到不兼容的版本。关键看两点:
立即学习“PHP免费学习笔记(深入)”;
- PHP 8.1+ → 用 PHPUnit 10.x(如
^10.5);PHP 8.2+ 才能用 PHPUnit 11; - Laravel 10 默认锁
^10.1,硬升到^11.0会触发Declaration of PHPUnitFrameworkTestCase::setUp(): void must be compatible这类致命错误; - 如果项目已用 Laravel Dusk 或 Pest,它们自带 PHPUnit 依赖,再手动
require可能引发冲突,优先查composer show看当前实际版本。
稳妥做法:先查自己 PHP 版本(php -v),再查框架约束(如 Laravel 10 的 composer.json 里 "phpunit/phpunit": "^10.1"),最后执行:composer require --dev phpunit/phpunit:^10.5
autoload-dev 配置漏掉会导致测试类完全不可见
PHPUnit 本身能跑,但你的 tests/Feature/ExampleTest.php 会被当成普通 PHP 文件,不参与自动加载。必须显式声明:
{
"autoload-dev": {
"psr-4": {
"Tests\": "tests/"
}
}
}
改完立刻执行:composer dump-autoload --dev
注意一定要带 --dev,否则不会处理 autoload-dev 字段。如果测试目录不是 tests/(比如叫 test/ 或 spec/),这里必须同步改路径,且大小写要和实际目录一致(Linux 下敏感)。
生产部署时如何确保 PHPUnit 不被打包进去
靠 --no-dev 参数。上线执行:composer install --no-dev --optimize-autoloader
这会跳过 require-dev 里的所有包(包括 phpunit/phpunit),同时生成优化后的 autoloader,体积更小、加载更快。
检查是否生效:部署后进 vendor/ 目录,ls -l vendor/phpunit 应该返回 “No such file or directory”。如果还有,说明 CI 脚本里漏了 --no-dev,或者用了 composer update 而非 install。
真正容易被忽略的是:本地开发时,autoload-dev 是可选的(因为测试代码不参与运行),但 CI 流水线跑测试时,它就是刚需——没配好,CI 会直接报 Class TestsFeatureExampleTest not found,连第一行都进不去。



















