PHPUnit 10 要求 PHP ≥ 8.1,PHP 7.4 用 ^9.6,8.1 用 ^10.1,8.2+ 可用 ^10.5 或 ^11.0;必须配 phpunit.xml.dist、autoload-dev 和 ./vendor/bin/phpunit 入口。

直接装 phpunit/phpunit:^10,但必须匹配 PHP 版本
PHPUnit 10 要求 PHP ≥ 8.1,如果你用的是 PHP 8.0 或更低版本,硬装 ^10 会直接报错:Declaration of PHPUnitFrameworkTestCase::setUp(): void must be compatible——这不是你代码写错了,是版本不兼容的语法冲突。
- PHP 8.1–8.1:稳妥起见用
composer require --dev phpunit/phpunit:^10.1 - PHP 8.2+:可用
^10.5或^11.0(但注意 ^11.0 需 PHP 8.2+) - PHP 7.4:别碰 ^10,降级到
^9.6,否则运行时 fatal error - 装之前先确认:
php -v;装的时候显式带版本号,比默认拉最新更可控
./vendor/bin/phpunit 是唯一可靠入口,别信 phpunit 命令
Composer 默认把命令放在 vendor/bin/ 下,不会自动加进系统 $PATH。你在终端敲 phpunit 报 Command "phpunit" is not defined,大概率是误用了全局命令,或本地 alias 没生效。
- 始终用完整路径:
./vendor/bin/phpunit(Linux/macOS)或vendorinphpunit(Windows) - 想图方便?在
composer.json里加脚本:"scripts": {"test": "phpunit"},然后运行composer test—— 这个phpunit是 Composer 自动解析到 vendor/bin 的,安全 - 别用
composer global require phpunit/phpunit:不同项目 PHP 版本一变,全局命令立刻失效,CI 里也根本跑不通
phpunit.xml.dist 不是可选项,是启动测试的开关
没这个文件,./vendor/bin/phpunit 默认只扫当前目录下 *Test.php,根本找不到 tests/ExampleTest.php,报 No tests executed。
- 用内置命令生成基础配置:
./vendor/bin/phpunit --generate-configuration,它会问你测试目录、bootstrap 文件等,一路回车就能生成phpunit.xml.dist - 关键配置项必须有:
bootstrap="vendor/autoload.php"(确保加载被测类)、<testsuites><testsuite directory="tests/"></testsuite></testsuites> - 路径全用相对路径,别写
/home/user/project/tests这种绝对路径,CI 和别人 clone 下来就废了 - 记得在
composer.json中配好autoload-dev,例如:"Tests\": "tests/",然后执行composer dump-autoload
让 composer install 后自动跑测试?钩子得写对,还得防失败中断
想在依赖装完后顺手跑一遍测试,靠 composer.json 的 post-install-cmd,但写错就静默失效,或者测试一挂整个安装流程就退出。
立即学习“PHP免费学习笔记(深入)”;
- 正确写法(数组格式,推荐):
"post-install-cmd": ["@php vendor/bin/phpunit --no-coverage"] - CI 环境默认可能禁用 scripts,要显式加
--no-scripts才会跳过;本地调试时确认没加这个参数 - 如果希望“安装成功,测试失败也不中断”,得用 shell 处理:
"post-install-cmd": ["sh -c 'vendor/bin/phpunit || true'"] - 更稳的做法是封装成独立脚本(如
bin/run-tests.php),在里面捕获异常、记录日志、始终返回 0 —— 尤其适合团队协作和 CI
真正卡住人的从来不是“怎么装”,而是 PHP 版本、autoload-dev 映射、phpunit.xml 路径三者没对齐。这三处任一出错,都会表现为“命令找不到”或“Class not found”,但错误提示根本不告诉你问题在哪。











