composer test不是Composer内置命令,仅当composer.json的scripts中明确定义"test"键(如"test": "vendor/bin/phpunit")时才存在;未定义则报错“Command 'test' is not defined”。

composer test 命令为什么根本不存在
它压根不是 Composer 内置命令,只是你手动在 composer.json 的 scripts 里定义的别名。没配就运行,直接报错:Command "test" is not defined。
必须显式写进 composer.json:
"scripts": {
"test": "vendor/bin/phpunit"
}
注意三点:
-
vendor/bin/phpunit是真实可执行文件路径,别写成phpunit—— Linux/macOS 下会找不到命令 - Windows 和 Linux/macOS 都能兼容,靠的是 Composer 自动调用
.bat或二进制文件,前提是路径写对 - 如果脚本值是 PHP 文件(如
"test": "php test-runner.php"),参数从$argv[2]开始取;更稳的方式是读getenv('COMPOSER_ARGS')
autoload-dev 配错 = Class not found
90% 的测试类加载失败,根源不在 PHPUnit 版本或配置文件,而在 autoload-dev 没对齐。
立即学习“PHP免费学习笔记(深入)”;
假设你有测试文件 tests/Unit/CalculatorTest.php,它必须同时满足:
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 文件路径是
tests/Unit/CalculatorTest.php(不能是test/、Tests/或tests/unit/) - 文件内声明
namespace TestsUnit;(结尾分号不能少,大小写敏感) -
composer.json中autoload-dev映射为:"Tests\": "tests/"(注意双反斜杠) - 改完后立刻执行
composer dump-autoload --dev——composer install不会自动触发这步
漏掉任一环,phpunit 就会静默失败或报 Class 'TestsUnitCalculatorTest' not found。
phpunit.xml.dist 总不生效?先看这三处
它不报错,只默默退回到默认行为(比如只扫当前目录下 *Test.php),常见失效点:
- 文件名必须是
phpunit.xml或phpunit.xml.dist,且放在和composer.json同级的项目根目录 -
<directory>tests</directory>是相对路径,基准是配置文件所在目录(即根目录);写成./tests或../tests多数情况失败 -
bootstrap="vendor/autoload.php"必须写在<phpunit>标签属性里,漏掉这句,use TestsUnitCalculatorTest就会加载失败
PHP 9.3+ 已废弃 <whitelist>,改用 <coverage><include><directory>src</directory></include></coverage>,否则覆盖率报告为空。
CI 里跑不过,但本地 OK?大概率是 --no-dev
CI 默认执行 composer install --no-dev,这会导致两件事同时失效:
-
autoload-dev映射被完全忽略 → 测试类无法加载 -
phpunit/phpunit根本不安装 →vendor/bin/phpunit不存在
CI 脚本中必须显式加 --no-interaction --prefer-dist,但**不能加 --no-dev**;如果要用,得改成:
composer install --no-interaction --prefer-dist composer dump-autoload --dev --optimize
另外,CI 环境默认不加载 .env,若测试依赖环境变量,得在 GitHub Actions 的 env: 块里显式注入,而不是靠 source .env。


















