composer 默认不生成 vendor/bin/phpunit,因需 phpunit 版本在 composer.json 中声明 "bin": ["phpunit"](如 ^10.5 或 ^9.6),旧版 ^8.x 可能缺失;可手动执行 composer bin phpunit install 或改用 php vendor/phpunit/phpunit/phpunit。

Composer 安装 PHPUnit 时为什么没生成 vendor/bin/phpunit?
因为默认安装方式不会自动创建可执行软链接,vendor/bin/phpunit 是 Composer 根据 bin 配置自动生成的——但前提是 PHPUnit 的 composer.json 里声明了 "bin" 字段,且你装的是支持该字段的版本。
- PHP 8.1+ 推荐装
phpunit/phpunit:^10.5(含"bin": ["phpunit"]);老版本如^9.6也支持,但^8.x及更早可能不声明bin,导致vendor/bin/phpunit缺失 - 运行
composer install或composer update后,检查vendor/phpunit/phpunit/composer.json是否有"bin": ["phpunit"] - 如果已安装但没生成,手动执行
composer bin phpunit install(Composer 2.5+ 支持)或删掉vendor/重装
在 composer.json 里怎么写才让 PHPUnit 可直接运行?
别只写 "require-dev",得确认它被识别为可执行工具。最稳妥的方式是显式加 "bin" 并用 scripts 封装命令。
- 在
composer.json的"require-dev"下添加:"phpunit/phpunit": "^10.5" - 同时在
"scripts"下加一行:"test": "phpunit",这样就能用composer test运行 - 避免写成
"test": "vendor/bin/phpunit"——路径硬编码在 Windows 和某些 CI 环境下容易失效 - 如果项目有自定义
phpunit.xml,确保它存在且路径正确,否则phpunit命令会退回到默认扫描逻辑,可能漏配--bootstrap或--coverage
运行 phpunit 报错 “Class 'PHPUnit\Framework\TestCase' not found” 怎么办?
这不是类没 autoload,而是 autoloader 没加载 PHPUnit 自身的类 —— 因为 PHPUnit 10+ 默认不再把自身类注册进主 autoloader,它用的是自己的 PSR-4 映射 + phpunit 二进制入口来隔离环境。
- 确认你不是用
php vendor/autoload.php手动引然后直接 new TestCase —— 这种写法在 PHPUnit 10+ 已不可靠 - 必须通过
vendor/bin/phpunit或composer test启动,它会加载 PHPUnit 自带的 bootstrap - 如果你在测试中 require 了其他文件,检查它们是否依赖了未声明的 dev 依赖(比如
phpspec/prophecy),这类包要一并加到require-dev - 运行
php -d display_errors=1 vendor/bin/phpunit --version看是否报错,能排除 CLI PHP 配置和扩展问题(如 missingxml或mbstring)
CI 环境里 vendor/bin/phpunit 找不到,但本地好好的
根本原因是 Composer 的 bin-dir 被改过,或者 CI 使用了 --no-bin-links 选项(某些旧版 GitLab CI 模板会默认加)。
立即学习“PHP免费学习笔记(深入)”;
- 检查 CI 日志里有没有
Skipped installation of bin bin/phpunit类似提示 - CI 脚本里加一步:运行
composer config bin-dir vendor/bin再composer install --no-interaction - 更稳的做法:不用依赖
vendor/bin/phpunit,改用php vendor/phpunit/phpunit/phpunit(这是实际入口文件路径,不依赖软链) - GitHub Actions 中若用
composer/installeraction,请确认版本 >= v3,v2 默认禁用 bin-links











