phpunit上手需解决命令找不到、类加载失败、断言失败三关:本地安装vendor/bin/phpunit、require autoload.php、浮点/数组/对象断言需适配php类型特性。

phpunit 不是“学完就能上手”的工具,而是边写边调、边错边改出来的肌肉记忆。它本身不难,但新手常卡在**命令跑不起来、类找不到、断言总失败**这三关——不是你不会,是环境和细节没对齐。
phpunit 命令找不到?先别装全局
直接运行 phpunit 报 “command not found”,90% 是路径或安装方式错了。
- 别用
composer global require phpunit/phpunit:新版 Composer 默认禁用全局 require,且 macOS/Linux 下 bin-dir 往往不在$PATH里 - 必须项目本地安装:
composer require --dev phpunit/phpunit,然后只认vendor/bin/phpunit - 验证是否装对:
./vendor/bin/phpunit --version能输出版本号才算成功 - 想偷懒用
composer test?得先在composer.json的scripts里加一行:"test": "phpunit"
Class 'PHPUnit\Framework\TestCase' 找不到?autoload 没生效
报这个错,不是你少写了 use,是 Composer 没加载 PHPUnit 的类。
-
tests/CalculatorTest.php开头必须有:require_once __DIR__ . '/../vendor/autoload.php';(哪怕你用了 PSR-4) - 检查
composer.json是否含"autoload-dev"配置,哪怕空着也要有:"autoload-dev": {} - 类名和文件路径必须严格匹配:类
CalculatorTest必须放在tests/CalculatorTest.php,否则vendor/autoload.php找不到它 - 别用
phpunit CalculatorTest.php直接跑单文件——它绕过自动加载机制,容易漏掉依赖
assertEquals() 总失败?PHP 的“相等”比你想的复杂
明明 var_dump($a) 和 var_dump($b) 看起来一模一样,断言却红了。这不是 PHPUnit 的 bug,是 PHP 类型系统在说话。
- 浮点数比较必须加容差:
$this->assertEquals(0.3, 0.1 + 0.2, '', 0.0001),第四个参数是 delta - 数组键顺序不同就失败?用
assertEqualsCanonicalizing()(PHPUnit ≥9.3),它会先标准化再比 - 字符串含 BOM 或 \r\n?用
bin2hex($str)看真实字节,别信肉眼 - 对象别直接
assertEquals($expectedObj, $actualObj)——它比的是引用,不是属性值;改用assertNotNull()+assertInstanceOf()+ 逐个属性断言
测试之间互相污染?setup/teardown 不是可选项
第一个测试改了某个静态变量,第二个测试就莫名其妙失败——这不是偶然,是没隔离。
- 每个测试方法都应是“干净启动、干净退出”:
setUp()里初始化依赖,tearDown()里清理状态(比如关闭 mock、重置静态属性) - 数据库测试别连真实库:用内存 SQLite、事务回滚,或干脆 mock 数据访问层
- 别在测试里
echo、var_dump、exit——它们会中断 PHPUnit 的执行流,导致后续测试跳过或状态错乱 - 测试方法不能有参数,也不能是
static或private;命名要么以test开头,要么加@test注解
assertEquals 怎么写,而是错误信息不告诉你问题在哪——phpunit 报错时,第一反应不该是查文档,而是看它提示的**具体哪行、哪个值、什么类型**。把 var_dump(gettype($x), $x) 插进去,比读十页指南管用。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











