composer test不是内置命令,仅当composer.json的scripts中定义了"test"键时才可用;核心需三步:装phpunit(按php版本选^9.6/^10.5/^11.0)、配phpunit.xml.dist(根目录、bootstrap="vendor/autoload.php"、tests)、写脚本"test": "vendor/bin/phpunit"并用--透传参数。

composer test 不是内置命令,它只在 composer.json 的 scripts 里明确定义了 "test" 键时才可用;没配就运行,会直接报错 Command "test" is not defined。真正能跑起来的核心就三件事:装 PHPUnit、写配置、配脚本。
怎么装 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+ 且无历史包袱 → 可试
^11.0,但确认项目没用已移除的phpunit-skeleton-generator
永远别用 composer require --dev phpunit/phpunit 不带版本号——Composer 可能拉到不兼容的主版本,尤其在 CI 环境里直接失败。
phpunit.xml.dist 怎么放才被识别
PHPUnit 默认只读当前工作目录下的 phpunit.xml 或 phpunit.xml.dist。名字错一个字符、放错位置、被 IDE 插件加 --no-configuration,都会导致配置静默失效。
- 文件必须放在项目根目录,不能丢进
tests/或config/ -
<directory></directory>值写tests,不是./tests或/tests(路径以配置文件所在目录为基准) -
bootstrap="vendor/autoload.php"必须存在,否则测试类加载失败 - 别用已废弃的
<whitelist></whitelist>(PHPUnit ≥9.3),覆盖率要写成<coverage><include><directory>src</directory></include></coverage>
composer.json 里 scripts 怎么写才跨平台稳定
脚本值写 "test": "phpunit" 是常见错误:Windows 下找不到 phpunit 命令,Linux/macOS 可能调到全局安装的旧版,导致配置/自动加载全乱。
- 统一用
"test": "vendor/bin/phpunit"—— Composer 会自动选.bat(Windows)或可执行文件(其他系统) - 参数透传必须加双横线:
composer test -- --filter=MyTest,第一个--告诉 Composer “后面全给脚本”,否则--filter被 Composer 自己解析并忽略 - 如果脚本指向 PHP 文件(如
"test": "php test-runner.php"),参数从$argv[2]开始;更可靠的是读getenv('COMPOSER_ARGS')(Composer 4.0+ 支持)
CI 里跑通了,本地却 Class not found?先查这三点
这不是 PHPUnit 版本问题,而是环境一致性断点。
-
autoload-dev配了"Tests\": "tests/",但没运行composer dump-autoload—— classmap 没刷新,测试类照样找不到 -
phpunit.xml.dist里的<directory>tests</directory>是相对路径,但实际文件是tests/Unit/CalculatorTest.php,而类名是TestsUnitCalculatorTest,大小写或命名空间路径稍有偏差就报错 - CI 默认不加载
.env,如果测试依赖环境变量(如数据库连接),得在 GitHub Actions 的env:块里显式注入,而不是靠source .env(每个run是独立 shell)
最易被忽略的是 composer dump-autoload 没进 CI 流程 —— 即使 autoload-dev 配对了,没刷新 classmap,Class not found 就必然发生。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











