必须将phpunit.xml中xsi:noNamespaceSchemaLocation更新为https://schema.phpunit.de/10.5/phpunit.xsd,否则启动警告或IDE拒绝加载;bootstrap="vendor/autoload.php"不可省略且路径须正确;whitelist已移除,覆盖率需用<coverage><include><directory>src</directory></include></coverage>配置;autoload-dev必须严格匹配tests/目录结构并执行dump-autoload。

phpunit.xml 里 xsi:noNamespaceSchemaLocation 必须更新到 10.5
PHPUnit 10.5 发布后,旧版配置文件中 xsi:noNamespaceSchemaLocation 指向的 XSD 地址会失效,导致 vendor/bin/phpunit 启动时警告 Schema validation failed,甚至某些 IDE(如 PHPStorm)拒绝加载配置。
必须手动把这一行从类似 https://schema.phpunit.de/9.6/phpunit.xsd 改为 https://schema.phpunit.de/10.5/phpunit.xsd。别用 latest 或 10 —— PHPUnit 官方不维护泛版本别名,只对主次版本号提供精确 XSD。
- 检查方式:
grep "xsi:noNamespaceSchemaLocation" phpunit.xml - 改完立刻生效,无需重装或 dump-autoload
- 如果用
./vendor/bin/phpunit --generate-configuration生成新配置,它默认写对这个地址,但不会覆盖已有文件
bootstrap="vendor/autoload.php" 不能省略,且路径必须可访问
PHPUnit 10 默认不再 fallback 到隐式自动加载,bootstrap 属性现在是硬性要求。漏写、拼错、或指向不存在的路径(比如 bootstrap="autoload.php"),会导致所有测试类报 Class 'TestsUnitExampleTest' not found —— 不是命名空间问题,是 autoloader 根本没启动。
-
bootstrap值必须是相对路径(以phpunit.xml所在目录为基准),且文件存在:ls -l vendor/autoload.php - 别写成
bootstrap="./vendor/autoload.php"——.是冗余的,部分环境解析失败 - 如果你用了自定义 bootstrap 脚本(如初始化数据库连接),确保它内部也显式 require
vendor/autoload.php,否则 PHPUnit 自身类(如PHPUnitFrameworkTestCase)仍无法加载
whitelist 已彻底移除,覆盖率配置必须用 <coverage> 块
PHPUnit 10 完全删除了 <whitelist> 标签,继续保留它会导致配置解析失败,报错 Element 'whitelist' is not allowed,然后静默跳过覆盖率收集。
立即学习“PHP免费学习笔记(深入)”;
正确写法是把原来 whitelist 里的 <directory> 移到 <coverage><include> 下,并确认 <coverage> 是顶层标签(与 <testsuites> 同级):
<coverage>
<include>
<directory>src</directory>
</include>
</coverage>
-
<directory>src</directory>是相对路径,基准仍是phpunit.xml所在目录 - 别再用
<exclude>包裹tests/—— PHPUnit 10 默认排除tests/和vendor/,显式 exclude 反而可能干扰 - 运行时加
--coverage-html coverage才会生成报告;不加参数时,<coverage>配置只是声明,不触发计算
composer.json 的 autoload-dev 必须匹配 tests/ 目录结构
升级到 PHPUnit 10 后,use TestsUnitCalculatorTest; 这类语句报错,往往不是 PHPUnit 版本问题,而是 composer.json 里 autoload-dev 没配对。
例如:测试文件放在 tests/Unit/CalculatorTest.php,类声明为 class CalculatorTest extends PHPUnitFrameworkTestCase,那么 autoload-dev 必须写成:
"autoload-dev": {
"psr-4": {
"Tests\": "tests/"
}
}
- 路径结尾不加斜杠(
"tests/"✅,"tests"❌)—— Composer 要求 PSR-4 映射路径以 / 结尾 - 命名空间末尾必须带反斜杠(
"Tests\"✅,"Tests"❌)—— PHP 解析命名空间时严格区分 - 改完立即执行
composer dump-autoload --dev,否则vendor/autoload.php不会注册这个映射
autoload-dev 和 phpunit.xml 两处路径约定的耦合:一个写错,另一个就失效,错误信息却完全不提示关联性。



















