必须同时配置 autoload 和 autoload-dev:autoload 加载生产代码(如 "App": "src/"),autoload-dev 加载测试代码(如 "Tests": "tests/"),且命名空间与路径严格一致,修改后需运行 composer dump-autoload;phpunit 需通过 bootstrap 加载 autoloader,CI 中禁用 --no-dev 才能生效。

composer.json 的 autoload 配置写在哪
必须写在 autoload 和 autoload-dev 两个字段里,不能只写一个。PHPUnit 测试类本身不参与生产运行,但测试用例要加载 src/ 下的业务类,也要能被 vendor/bin/phpunit 找到 —— 这就要求:业务代码走 autoload,测试代码走 autoload-dev。
常见错误是只配了 autoload,结果 phpunit 执行时报 Class 'TestsUnitExampleTest' not found;或者反过来只配 autoload-dev,导致测试里 new 个 AppServiceXxx 就报错。
-
autoload用于生产环境自动加载(如"psr-4": { "App\": "src/" }) -
autoload-dev仅在开发/测试时生效(如"psr-4": { "Tests\": "tests/" }) - 改完记得运行
composer dump-autoload,否则新配置不生效
PSR-4 映射路径必须严格匹配命名空间
比如你的测试文件在 tests/Unit/CalculatorTest.php,那它顶部必须声明 namespace TestsUnit;;如果写成 namespace TestUnit; 或漏掉 Tests\,composer 就找不到这个类。
同样,src/Service/Logger.php 必须对应 namespace AppService;(假设你配的是 "App": "src/"),少个 App 或多一层前缀都会断掉加载链。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
立即学习“PHP免费学习笔记(深入)”;
- 目录名和命名空间最后一段必须一致(
tests/Feature/→Tests\Feature\) - Windows 下大小写不敏感,Linux/macOS 会直接失败,建议本地也按大小写严格写
- 别用
classmap去“绕过”命名空间问题,它不支持动态加载,且composer dump-autoload后容易漏更新
为什么 vendor/bin/phpunit 找不到我的测试类
最常踩的坑是:没在 phpunit.xml 里指定 bootstrap,或 bootstrap 文件没触发 Composer 自动加载。
默认情况下,phpunit 不会自动 require vendor/autoload.php —— 它只读配置、跑测试、报错。所以要么在 phpunit.xml 里写:
<phpunit bootstrap="vendor/autoload.php">要么在命令行显式指定:
phpunit --bootstrap vendor/autoload.php。
- 如果用了自定义 bootstrap 文件(比如
tests/bootstrap.php),里面必须有require __DIR__.'/../vendor/autoload.php'; - 检查
phpunit.xml中的testsuite路径是否指向tests/,而不是test/或Tests/(大小写+拼写都要对) -
phpunit --list-tests能快速验证类是否被识别,比盲跑还快
autoload-dev 配置后 composer install 会跳过吗
不会跳过,但行为有区别:composer install --no-dev 时,autoload-dev 的映射会被忽略,且 vendor/autoload.php 里也不会包含这部分逻辑 —— 所以 CI 环境若用了 --no-dev,本地能跑的测试在 CI 上就会报错。
这不是 bug,是设计使然。关键是:别指望 --no-dev 下还能跑测试;CI 脚本里该装 dev 依赖就得装(composer install 不带 --no-dev)。
- 本地开发和 CI 的
composer install参数最好保持一致,避免环境差异 -
composer dump-autoload --optimize对生产有用,但对测试无益,反而可能掩盖 autoload-dev 未生效的问题 - 如果项目用 Docker,确认容器内执行的是完整安装,不是构建镜像时误加了
--no-dev
phpunit.xml 的 bootstrap 和 composer.json 中 autoload-dev 的联动关系 —— 少一个,测试类就只是磁盘上的 PHP 文件,不会变成可执行的类。


















