必须用composer require --dev phpunit/phpunit:^9.6(PHP 7.4/8.0)或^10.5(PHP 8.1+)锁版本,配autoload-dev映射tests/并执行dump-autoload,运行./vendor/bin/phpunit。

直接用 composer require --dev phpunit/phpunit 就能装上,但跑不起来的绝大多数情况,不是没装,而是版本错、路径错、autoload 没刷、或用了全局命令。
怎么装才不会踩坑
装 PHPUnit 不是“执行一条命令就完事”,关键在匹配 PHP 版本和锁死主版本号:
- 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+ 且无框架强约束 → 可试
composer require --dev phpunit/phpunit:^11.0,但确认没引用已移除的phpunit-skeleton-generator - 别只写
phpunit/phpunit不带版本 —— Composer 可能拉 v11,而你本地是 PHP 8.1,立刻报Declaration of PHPUnitFrameworkTestCase::setUp(): void must be compatible - 装完立刻验证:
./vendor/bin/phpunit --version,输出版本号必须和你指定的一致
为什么 ./vendor/bin/phpunit 是唯一可靠入口
敲 phpunit 报 command not found 是正常现象。Composer 从不把二进制文件扔进系统 PATH,它只放 vendor/bin/ 下:
- Linux/macOS:始终用
./vendor/bin/phpunit - Windows:用
vendorinphpunit - 别用
composer global require phpunit/phpunit—— 全局安装后,phpunit命令读不到当前项目的phpunit.xml和autoload.php,测试类找不到、覆盖率炸掉、CI 直接失败 - 想简化调用?在
composer.json的scripts里加"test": "phpunit",之后运行composer test即可
phpunit.xml 和 autoload-dev 怎么配才生效
没 phpunit.xml 不是不能跑,而是大概率漏测、误扫 vendor 或 src 里的非测试文件;没配对 autoload-dev,Class 'PHPUnitFrameworkTestCase' not found 就是板上钉钉:
立即学习“PHP免费学习笔记(深入)”;
-
phpunit.xml必须放在和composer.json同级的项目根目录,名字不能是phpunit.xml.dist或多一个空格 - 最简可用配置至少含
bootstrap="vendor/autoload.php"和<directory>tests</directory> -
composer.json中必须有"autoload-dev": {"psr-4": {"Tests\": "tests/"}},且改完后手动运行composer dump-autoload - 测试文件路径得匹配:比如
tests/ExampleTest.php,类名必须是TestsExampleTest,继承PHPUnitFrameworkTestCase(不是旧版的PHPUnit_Framework_TestCase)
常见报错一眼定位原因
报错信息看着吓人,其实就几个固定源头:
-
Class 'PHPUnitFrameworkTestCase' not found→ 不是没装 PHPUnit,是autoload-dev没配或没刷,或phpunit.xml里漏了bootstrap="vendor/autoload.php" -
No tests executed→ 默认扫描规则没命中tests/,要么没phpunit.xml,要么<directory></directory>写错了路径(注意是相对phpunit.xml位置) -
Cannot declare class X, because the name is already in use→ 测试文件里手动写了require或include,和 Composer autoloader 冲突,删掉手写的引入 -
Command "phpunit" is not defined→vendor/bin/phpunit文件根本不存在,先确认是否在项目根目录、是否执行过composer install
真正卡住人的地方,往往不是断言怎么写,而是 phpunit.xml 少了个引号、composer require 漏了 --dev、或者以为全局装一次就能一劳永逸。这些细节不盯住,跑十次 phpunit 都白搭。



















