composer test 不是内置命令,仅当 composer.json 的 scripts 中定义了 test 才可用;未定义时会报错“command 'test' is not defined”。

直接用 composer test 跑测试没问题,但前提是 composer.json 里真有 "test" 这个脚本,且它指向一个能执行的命令——它不是 Composer 自带功能,只是你配了它,Composer 才认得。
为什么 composer test 有时根本不存在
Composer 不预置 test 命令。它只在你显式定义 "scripts": { "test": "..." } 后,才把 test 挂成一级命令。没定义就运行,会报错 Command "test" is not defined.。
- 检查
composer.json是否在顶层有"scripts"字段,且内含"test"键 - 旧版 Composer(composer test 语法,必须用
composer run-script test - 脚本名含冒号(如
"test:unit")时,composer test:unit会被当作子命令解析失败,必须写composer run test:unit或composer run-script "test:unit"
"test" 脚本值该写什么:跨平台安全写法
别写 "test": "phpunit" —— Windows CMD 下找不到命令,Linux/macOS 又依赖 $PATH,极不可靠。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 统一用
"test": "vendor/bin/phpunit":所有平台都认这个路径(Windows 实际调的是vendor/bin/phpunit.bat) - 如果用了 PHPUnit 10+,建议加
--colors=always避免 CI 中颜色被禁用导致断言输出混乱 - 想跑特定目录?直接写死:
"test": "vendor/bin/phpunit tests/Unit",比传参更可控 - 数组写法(如
"test": ["@test:unit", "@test:feature"])需 Composer 7+,老项目慎用
参数怎么传:漏掉 -- 就全错
composer test -- --filter=MyTest 和 composer test --filter=MyTest 表现完全不同。
- 前者:双短横
--告诉 Composer “后面全是给脚本的参数”,--filter=MyTest会透传给phpunit - 后者:Composer 把
--filter当作自身选项处理,大概率报错或静默忽略 - PHP 脚本类测试入口(如
"test": "php test-runner.php")中,参数从$argv[2]开始;更稳的方式是读getenv('COMPOSER_ARGS')(Composer 4.0+)
类找不到?autoload 和 phpunit.xml.dist 得对齐
本地 composer test 成功,CI 失败报 Class 'MyPackageCalculator' not found,90% 是 autoload 配置和 PHPUnit 引导没咬合。
-
composer.json的"autoload"和"autoload-dev"必须正确映射命名空间与路径,且运行过composer dump-autoload -
phpunit.xml.dist(注意不是.xml)必须存在,且含bootstrap="vendor/autoload.php" -
<source><directory>src</directory></source>要和autoload里的psr-4路径一致,否则代码覆盖率或自动加载失效 - CI 环境常加
--no-dev,确保autoload-dev里的测试类不会混进生产 autoloader
真正麻烦的从来不是写一行 "test": "vendor/bin/phpunit",而是让这个命令在 Windows、Mac、CI、不同 Composer 版本下都稳定触发正确的 autoloader、正确的参数、正确的工作目录——这些细节一旦错位,错误表现往往静默或误导性极强。










