composer test 是 composer run-script test 的简写,自动触发 pre/post-test 钩子;需确保 phpunit 可执行、autoload 配置正确、参数用 -- 分隔、工作目录明确。

直接用 composer test 就能跑测试,前提是 composer.json 的 scripts 里定义了 "test" 键——它不是魔法,只是 Composer 把脚本名自动注册为命令的语法糖。
为什么 composer test 比 composer run-script test 更常用
Composer 会把 scripts 对象里的每个键(如 "test"、"build")自动挂载成一级命令,所以 composer test 本质就是 composer run-script test 的简写,且默认触发 pre-test 和 post-test 钩子。
- 只有脚本名含冒号、破折号等特殊字符(如
"test:unit")时,才必须用composer run-script "test:unit"或加引号的composer "test:unit" -
composer run-script默认启用钩子;若想跳过(比如调试脚本本身),得显式加--no-hooks - 手动敲
run-script容易漏掉参数分隔符--,而composer test写法更安全、更少出错
composer test 执行失败的常见原因
报错 “Command 'phpunit' not found” 或静默退出,通常不是 Composer 问题,而是脚本定义或环境没对齐:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
"test": "phpunit"要求phpunit在$PATH中可执行——但 Windows CMD 不识别$PATH,推荐改用"test": "vendor/bin/phpunit"(Linux/macOS/PowerShell 都兼容) - Windows 用户要注意:
vendor/bin/phpunit.bat才是批处理入口,直接写phpunit可能找不到命令 - 脚本值如果是数组(如
"test": ["@test:unit", "@test:static"]),需 Composer 7+ 支持;旧版本只认字符串 - 没装
phpunit/phpunit到require-dev,或没运行composer install --dev,vendor/bin/phpunit根本不存在
如何给 composer test 传参(比如过滤用例)
参数不会自动透传,漏掉 -- 分隔符,参数就被 Composer 自己吃掉了:
- 正确:
composer test -- --filter=MyTest→--filter=MyTest会传给phpunit - 错误:
composer test --filter=MyTest→ Composer 把--filter当作自身选项,可能报错或忽略 - 如果脚本是 PHP 文件(如
"test": "php test-runner.php"),参数同样走$argv,但注意$_SERVER['argv'][0]是php,实际参数从[2]开始([1]是脚本路径) - 跨平台安全取参建议用
getenv('COMPOSER_ARGS'),它返回 Composer 解析后的原始参数字符串(Composer 4.0+)
测试脚本能运行,但类找不到?重点检查 autoload 配置
本地能跑通、CI 报 Class not found,大概率是 autoload 和 autoload-dev 没配对,或 phpunit.xml.dist 漏了 <source></source>:
- 确保
composer.json中autoload的psr-4映射和你实际类的命名空间完全一致(比如类在src/Calculator.php,命名空间是MyPackage,那映射就得是"MyPackage\": "src/") -
phpunit.xml.dist必须有<source><directory>src/</directory></source>,否则覆盖率和自动加载路径会错乱 - CI 环境常加
--no-dev,此时autoload-dev不生效——别把测试基类(如tests/Support/TestCase.php)放进autoload-dev后又在src/里use它 - 快速验证:CI 脚本里加一行
composer dump-autoload --no-dev && php -r "var_dump(class_exists('MyPackage\Calculator'));"
最常被忽略的是:脚本执行时工作目录固定为 composer.json 所在位置,但很多人在脚本里写相对路径(如 ../config/test.php)却没确认当前上下文;加上 pwd 和 ls -la 调试一行,比猜半天快得多。










