phpunit安装需按php版本选择对应小版本号,配好phpunit.xml(根目录、bootstrap指向vendor/autoload.php)、autoload-dev映射tests命名空间,并用vendor/bin/phpunit运行。

直接用 composer require --dev phpunit/phpunit 装上,再配好 phpunit.xml 和 autoload-dev,就能跑通第一个测试——但 90% 的人卡在版本错配、路径没对上、或 vendor/autoload.php 没被加载这三件事上。
装 PHPUnit 必须按 PHP 版本锁死小版本号
装错版本比不装还麻烦,报错全是类型声明冲突,比如 Declaration of PHPUnitFrameworkTestCase::setUp(): void must be compatible。这不是你代码有问题,是 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+ 且确认不用
phpunit-skeleton-generator→ 可试^11.0,但别默认拉最新版 - 装完立刻验证:
./vendor/bin/phpunit --version,输出的版本号必须和你指定的一致
phpunit.xml 文件必须手写,且只认根目录下的名字
PHPUnit 默认只读 phpunit.xml 或 phpunit.xml.dist,名字差一个字母、多一个空格,它就静默退回到默认扫描逻辑——结果往往是 No tests executed。
- 文件必须放在和
composer.json同级的项目根目录 - 最简可用内容只有三行(注意
bootstrap不能少):<?xml version="1.0" encoding="UTF-8"?><phpunit bootstrap="vendor/autoload.php"><testsuites><testsuite name="default"><directory>tests</directory></testsuite></testsuites></phpunit>
-
<directory>tests</directory>是相对路径,不是./tests或tests/带斜杠结尾也行,但别写成绝对路径 - 别加 DTD 声明,新版 PHPUnit 会跳过甚至报错
autoload-dev 不配对,TestCase 就永远找不到
Class 'PHPUnitFrameworkTestCase' not found 这类错误,90% 不是 PHPUnit 没装,而是 Composer 根本没把你的测试类和 PHPUnit 的命名空间映射进自动加载器。
- 在
composer.json的autoload-dev下加一条:"autoload-dev": { "psr-4": { "Tests\": "tests/" } } - 改完必须手动执行
composer dump-autoload—— Composer 不会自动重载 JSON 变更 - 测试文件得放对位置:
tests/ExampleTest.php,类名得是TestsExampleTest,继承PHPUnitFrameworkTestCase(不是旧版的PHPUnit_Framework_TestCase) - 别在测试文件里手写
require或include,和 autoloader 冲突会导致Cannot declare class X
运行测试只能走 vendor/bin/phpunit,别碰全局命令
敲 phpunit 报 command not found 是正常的;敲了却跑错配置、找不到类、覆盖率失效,那基本是用了全局安装的 PHPUnit。
- Linux/macOS:必须用
./vendor/bin/phpunit - Windows:用
vendorinphpunit - 想只跑一个文件?直接跟路径:
./vendor/bin/phpunit tests/ExampleTest.php - CI 环境记得加
--no-coverage,避免因缺 xdebug 导致失败 - 如果想省事,可在
composer.json的scripts里加"test": "phpunit",之后运行composer test即可(前提是已设好 PATH 或用 composer 自带的执行器)
真正难的不是写断言,而是 phpunit.xml 少了个引号、composer require 漏了 --dev、或者以为装一次全局就能到处用——这些细节不盯住,测试连入口都进不去。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











