composer test 不是内置命令,仅当 composer.json 的 scripts 中明确定义了 "test" 键时才存在;未定义则报错“Command 'test' is not defined”,因 Composer 本身不预置该命令,仅作脚本路由代理。

composer test 不是内置命令,它只在你明确定义了 scripts.test 时才存在;没配就跑,直接报 Command "test" is not defined。
为什么 composer test 有时根本不存在
Composer 本身不带 test 命令。它只是脚本路由代理——只有你在 composer.json 的 scripts 字段里写了 "test": "...",它才认这个命令。
- 检查
composer.json顶层是否有"scripts"对象,且内含"test"键 - 旧版 Composer(composer test:unit 这种带冒号的写法,必须用
composer run test:unit或composer run-script "test:unit" - 如果脚本名含空格或特殊字符(如
"test:ci"),务必用双引号包裹传参:composer run "test:ci" -- --verbose
"test" 脚本值该写什么:跨平台安全写法
别写 "test": "phpunit"——Windows 找不到命令,Linux/macOS 又依赖 $PATH,CI 里十次九挂。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 统一用
"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.0,老项目慎用
参数怎么传:漏掉 -- 就全错
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)
CI 里 Class not found?八成不是 PHPUnit 配错了
本地 composer test 成功、CI 报类找不到,90% 是 autoload 没对齐或 CI 没加载 dev autoload。
- CI 默认执行
composer install --no-dev,只加载autoload段,完全忽略autoload-dev——如果你的TestCase在tests/里且进了autoload-dev,但src/里又use了它,就炸 -
phpunit.xml.dist必须有三样:bootstrap="vendor/autoload.php"、<directory>tests</directory>、<source><directory>src</directory></source>;漏一个,覆盖率、IDE 跳转、甚至类加载都可能失效 - CI 脚本里统一用
composer test,别直接调./vendor/bin/phpunit——后者绕过phpunit.xml.dist的<source></source>,导致“本地能跑、CI 找不到类” - CI 中加验证命令:
composer dump-autoload --no-dev && php -r "echo class_exists('MyPackage\Calculator') ? 'ok' : 'fail';"
最易被忽略的一点:CI 中的 composer install 是否启用了 --no-dev,以及是否在运行测试前显式执行了 composer dump-autoload——这两步一旦出错,autoload 映射就是错的,后续所有测试都是空中楼阁。

















