PHPUnit 必须本地安装而非全局,因全局安装会导致多项目版本冲突、CI/协作异常及路径混乱;本地安装后通过 ./vendor/bin/phpunit 调用,配合根目录 phpunit.xml 配置(含正确 bootstrap 和 tests 目录)方可正常运行。

PHPUnit 不再随 Composer 全局安装,必须按项目本地安装,否则 phpunit 命令会报错或版本错乱。
为什么不能用 composer global require phpunit/phpunit
全局安装会导致多个项目共享同一版本,而不同项目依赖的 PHPUnit 版本常不兼容(比如 Laravel 9 要求 ^9.5,Laravel 10 要求 ^10.0)。CI 环境、团队协作、甚至 vendor/bin/phpunit 的路径行为都会出问题。
- 本地安装后,可执行文件固定在
vendor/bin/phpunit,路径明确、隔离性强 - Composer 会自动解析
phpunit/phpunit与当前 PHP 版本、其他 dev 依赖的兼容性 - 运行时通过
./vendor/bin/phpunit或php ./vendor/bin/phpunit调用,避免系统 PATH 冲突
如何用 Composer 安装指定版本的 PHPUnit
根据项目 PHP 版本和框架要求选对版本。例如:PHP 8.1+ 项目推荐用 PHPUnit 10;Laravel 9 默认适配 PHPUnit 9.5.x;若用 Symfony 6.4,需 >= PHPUnit 9.6。
- 安装最新稳定版(推荐新手):
composer require --dev phpunit/phpunit - 安装特定版本:
composer require --dev phpunit/phpunit:^9.5 - 安装但跳过脚本执行(防止某些旧项目 post-install-cmd 报错):
composer require --dev phpunit/phpunit --no-scripts
安装完成后,vendor/bin/phpunit 即可用,无需额外配置 PATH。
立即学习“PHP免费学习笔记(深入)”;
phpunit.xml 配置文件怎么写才生效
PHPUnit 10 默认只读取根目录下的 phpunit.xml 或 phpunit.xml.dist;名字错一个字符、放错目录(如放在 tests/ 下)都会导致配置被忽略,退回到默认行为。
- 最简可用配置示例(保存为项目根目录的
phpunit.xml):tests -
bootstrap必须指向自动加载入口,多数项目是vendor/autoload.php;Laravel 项目常用tests/bootstrap.php - 如果用
phpunit.xml.dist,运行时需确保它未被.gitignore排除,且没有同名的phpunit.xml覆盖它
运行测试时常见错误及修复
报错不是因为没装好,而是路径、配置、环境三者没对齐。最典型的是:
-
Class 'Tests\TestCase' not found:检查tests/下的类是否用了正确命名空间(如namespace Tests;),并确认phpunit.xml中指向正确 -
Cannot declare class XXX, because the name is already in use:通常是bootstrap文件重复加载了 autoload,或测试文件里手动require了已由 Composer 加载的类 -
Command "phpunit" not found:别输phpunit,一定要用./vendor/bin/phpunit(Linux/macOS)或vendor\bin\phpunit(Windows CMD)
本地安装 + 显式调用 + 正确配置文件位置,这三点漏掉任意一个,PHPUnit 就会“看似装了,实则不工作”。











