composer test不是内置命令,仅当composer.json的scripts中定义"test"键(如"test": "vendor/bin/phpunit")时才可用;核心三件事:按PHP版本装对PHPUnit(如PHP 8.1用^10.5)、phpunit.xml.dist置于根目录并设bootstrap="vendor/autoload.php"、正确配置autoload-dev映射且执行composer dump-autoload。

composer test 不是内置命令,它只在 composer.json 的 scripts 里明确定义了 "test" 键时才可用;没配就运行,会直接报错 Command "test" is not defined。真正能跑起来的核心就三件事:装 PHPUnit、写配置、配脚本。
PHPUnit 版本必须和 PHP 版本对齐
装错版本比不装还麻烦,一跑就报 Declaration of PHPUnitFrameworkTestCase::setUp(): void must be compatible 这类致命错误——不是你代码有问题,是运行时契约崩了。
- PHP 7.4 或 8.0 →
composer require --dev phpunit/phpunit:^9.6 - PHP 8.1(如 Laravel 10+)→
composer require --dev phpunit/phpunit:^10.5 - PHP 8.2+ 且确认不用
phpunit-skeleton-generator→ 可试^11.0,但别默认拉latest
永远别用 composer require --dev phpunit/phpunit 不带版本号——Composer 可能拉到不兼容的主版本,尤其在 CI 环境里直接失败。
phpunit.xml.dist 必须放在项目根目录且名字不能错
PHPUnit 默认只读当前工作目录下的 phpunit.xml 或 phpunit.xml.dist。名字差一个字符、放错位置、被 IDE 加了 --no-configuration,都会导致配置静默失效。
立即学习“PHP免费学习笔记(深入)”;
- 文件必须和
composer.json同级(即项目根目录),不能丢进tests/或config/ -
<directory>tests</directory>是相对路径,不是./tests或/tests(路径以配置文件所在目录为基准) -
bootstrap="vendor/autoload.php"必须存在且可访问,否则测试类加载失败 - 别用已废弃的
<whitelist></whitelist>(PHPUnit ≥9.3),覆盖率要写成<coverage><include><directory>src</directory></include></coverage>
composer.json 的 scripts 要跨平台稳定
脚本值写 "test": "phpunit" 是常见错误:Windows 下找不到命令,Linux/macOS 可能调到全局旧版,导致配置/自动加载全乱。
- 统一用
"test": "vendor/bin/phpunit"—— Composer 会自动选.bat(Windows)或可执行文件(其他系统) - 参数透传必须加双横线:
composer test -- --filter=MyTest,第一个--告诉 Composer “后面全给脚本”,否则--filter被自己解析并忽略 - 如果脚本指向 PHP 文件(如
"test": "php test-runner.php"),参数从$argv[2]开始;更可靠的是读getenv('COMPOSER_ARGS')(Composer ≥4.0 支持)
autoload-dev 映射不对,TestCase 就永远找不到
Class 'PHPUnitFrameworkTestCase' not found 或 Class 'TestsUnitExampleTest' not found,90% 不是 PHPUnit 没装,而是 autoload-dev 没生效或路径/命名空间不匹配。
- 确保
composer.json中有类似这样的映射:"Tests\": "tests/" - 改完必须执行
composer dump-autoload,否则 classmap 不刷新,CI 里照样报错 - 类
TestsUnitCalculatorTest必须对应文件tests/Unit/CalculatorTest.php,大小写、路径、命名空间三者严格一致 - 别把
tests/加进autoload(非 dev 段)——这会让最终用户无意中加载测试类,引发冲突
最易被忽略的是:CI 默认执行 composer install --no-dev,它只加载 autoload 段,完全忽略 autoload-dev;哪怕你配对了,没执行 dump-autoload,测试类照样 Class not found。



















