必须加--dev参数安装PHPUnit,phpunit.xml须置于根目录并严格命名,autoload-dev需显式映射中文路径且运行composer dump-autoload生效;否则将出现命令缺失、类找不到或配置静默失效。

直接运行 ./vendor/bin/phpunit 就能跑测试,但中文环境里报错、乱码、路径不识别、类找不到——90% 不是编码问题,而是 composer.json 里没加 --dev、phpunit.xml 没放对位置、或 autoload-dev 映射漏了中文路径支持。
composer require 必须带 --dev 参数
不加 --dev,phpunit/phpunit 会被写进 require 段,导致 composer install --no-dev(CI/上线常用)后命令直接消失,报 Command not found: phpunit。这不是 PATH 或权限问题,是依赖根本没装上。
-
composer require --dev phpunit/phpunit:^10.5(PHP 8.1+)或^9.6(PHP 7.4–8.0) - 已误装进
require?先composer remove phpunit/phpunit,再重装 - 别用
composer global require:不同项目 PHP 版本不同,全局只能留一个phpunit,CI 和新同事 clone 后必挂
phpunit.xml 必须在项目根目录且命名严格匹配
PHPUnit 默认只读当前工作目录下的 phpunit.xml 或 phpunit.xml.dist。文件名多一个空格、少一个点、放错层级(比如丢进 tests/),它就静默退回到默认行为:只扫当前目录下 *Test.php,完全忽略你写的配置。
- 文件必须放在和
composer.json同级的根目录,不能是tests/phpunit.xml或phpunit.xml.php -
<phpunit>标签里必须有bootstrap="vendor/autoload.php",否则use TestsUnitExampleTest会报Class not found -
<directory>tests</directory>是相对路径,以配置文件所在目录为基准;写成./tests或../tests多数失败 - PHP 9.3+ 已废弃
<whitelist>,覆盖率为空?改用<coverage><include><directory>src</directory></include></coverage>
autoload-dev 映射必须覆盖 tests 目录且路径兼容中文
即使 phpunit.xml 正确,只要 autoload-dev 没生效,或测试类路径与命名空间不一致,就会报 Class 'TestsUnitExampleTest' not found。中文路径本身没问题,但映射必须显式声明。
立即学习“PHP免费学习笔记(深入)”;
-
composer.json中确保有:"autoload-dev": { "psr-4": { "Tests\": "tests/" } }(Windows 下反斜杠需双写) - 测试文件路径必须匹配命名空间:例如
tests/Unit/用户验证Test.php→ 命名空间必须是TestsUnit,类名是用户验证Test(PHP 允许中文类名,但需确保文件系统支持 UTF-8) - 改完
composer.json后,必须手动运行composer dump-autoload,否则新增映射不会写入vendor/autoload.php - 如果项目根目录含中文(如
/Users/张三/my-project),确认终端当前 shell 编码为 UTF-8(Linux/macOS 可查locale | grep UTF)
运行时必须用 ./vendor/bin/phpunit,不能只敲 phpunit
Composer 从不把 phpunit 加进系统 $PATH,它只放在项目本地的 vendor/bin/ 下。敲 phpunit 报 command not found 是正常现象——不是装失败,是路径没对上。
- Linux/macOS:用
./vendor/bin/phpunit(注意开头的./) - Windows CMD:用
vendorinphpunit - PowerShell:用
.endorinphpunit - 想简化?在
composer.json的scripts里加:"test": "phpunit",之后运行composer test即可 - 指定配置?加
-c参数:./vendor/bin/phpunit -c phpunit.xml
真正卡住人的地方,往往不是断言写错,而是 phpunit.xml 少了个引号、composer require 漏了 --dev、或者以为改完 composer.json 就自动生效——dump-autoload 这一步跳过,所有映射都白配。



















