PHPUnit配置必须放在项目根目录且文件名严格为phpunit.xml或phpunit.xml.dist,否则将退回到默认配置,导致bootstrap不加载、testsuites被忽略;bootstrap必须设为vendor/autoload.php,autoload-dev需正确配置psr-4映射Tests到tests/并执行composer dump-autoload --dev。

测试框架必须本地安装、配置文件必须放在根目录、autoload-dev 不是“可选优化”而是加载前提——漏掉任一环节,phpunit 就会静默失败或报 Class not found。
为什么 phpunit.xml 放在 tests/ 目录下不生效
PHPUnit 10+ 默认只扫描项目根目录的 phpunit.xml 或 phpunit.xml.dist;名字错一个字符(比如 phpunit.xml.dev)、路径错一层(比如 tests/phpunit.xml),都会退回到内置默认配置,导致 bootstrap 不加载、testsuites 被忽略、颜色和详细模式失效。
- 必须放在项目根目录,且文件名严格为
phpunit.xml或phpunit.xml.dist -
bootstrap="vendor/autoload.php"是硬性要求,不能写成bootstrap="tests/bootstrap.php"(除非你手动 require autoload) - 若用
phpunit.xml.dist,运行时需加--configuration phpunit.xml.dist显式指定,否则不读
autoload-dev 配置错误导致 Tests\ 类根本找不到
autoload-dev 不是“让测试类更方便”,而是 PHPUnit 找到 TestsExampleTest 的唯一路径。它和 require-dev 是两件事:前者管“怎么加载类”,后者管“装不装包”。两者缺一不可。
- 典型正确配置:
"autoload-dev": {"psr-4": {"Tests\": "tests/"}}—— 表示TestsFooTest对应tests/FooTest.php - 如果 tests/ 下文件用的是
test(小写)目录名,但 autoload-dev 写成"Tests\": "test/",类就永远无法自动加载 -
composer dump-autoload --dev必须执行,否则修改autoload-dev后不会更新vendor/autoload.php
require-dev 里装了 phpunit/phpunit,但 ./vendor/bin/phpunit 报 command not found
这不是权限问题,也不是 PATH 没配对,而是 Composer 没生成二进制入口——常见于安装时用了 --no-scripts、或 composer.json 里禁用了 bin-dir。
- 检查
composer.json是否含"config": {"bin-dir": "vendor/bin"}(默认存在,但可能被覆盖) - 确认安装命令是
composer require --dev phpunit/phpunit:^9.5,而非global require(全局安装不生成项目级vendor/bin/phpunit) - 运行
ls -l vendor/bin/,看是否有phpunit符号链接;没有就执行composer install --no-dev && composer install --dev强制重建
Mockery 类找不到或 eval() 报错,其实和 phpunit.xml 关系不大
这类问题根源在 autoloader 和 PHPUnit 运行时限制的配合上。Class 'Mockery' 找不到,90% 是因为 vendor/autoload.php 没被 bootstrap 加载;而 eval() is disabled,则是 PHPUnit 10+ 默认关闭动态代码生成,但 Mockery 默认依赖它。
- 确保
phpunit.xml中bootstrap指向正确的vendor/autoload.php,且该文件真实存在 - Mockery 安装后,必须在测试类开头
use Mockery;,不能只靠全局命名空间调用 - 避免
Mockery::mock()触发 eval:改用Mockery::namedMock('SomeInterface'),或在phpunit.xml中显式设processIsolation="false"
最常被跳过的一步是:改完 autoload-dev 或 phpunit.xml 后,没运行 composer dump-autoload --dev 和 ./vendor/bin/phpunit --version 验证基础通路。所有“配置看起来对但就是不跑”的问题,八成卡在这儿。


















