应选择project本地安装(不加-g),因不同项目需兼容phpunit不同版本,避免全局冲突;ci/cd中composer install自动处理依赖,vendor/bin/phpunit路径明确,且--dev确保仅开发时加载。

PHP自带的测试工具根本不是“测试工具”,它只是assert()和一堆手动var_dump()的集合;真要写可维护、可自动化的测试,必须上PHPUnit——而它现在早就不需要手动下载或配置autoload了,Composer一行就能拉下来跑起来。
用Composer安装PHPUnit时,该选global还是project本地?
绝大多数项目应该选本地安装(即不加-g),原因很实际:
- 不同项目可能依赖不同版本的PHPUnit(比如老项目还在用
phpunit/phpunit:^9,新项目已上^10),global装一个版本会互相打架 - CI/CD流程里,
composer install自动装好依赖,无需额外配置全局环境 -
vendor/bin/phpunit路径明确,脚本和IDE都能准确定位,不会因PATH混乱导致执行错版本
正确命令就是:composer require --dev phpunit/phpunit。加--dev确保它只出现在require-dev里,上线打包时不会被带上。
phpunit.xml配置里最容易漏掉的三件事
没配phpunit.xml也能跑测试,但一到真实项目就会卡住。这三个配置项不填,轻则路径报错,重则测试全跳过:
-
bootstrap属性没设:如果测试前需加载自动加载器或全局函数(比如vendor/autoload.php),不指定就报Class not found -
testsuites下没声明<directory></directory>:默认只扫tests/,但有人习惯放test/或spec/,不显式写就会“零测试发现” - 没配
coverage的include:想看覆盖率时,若源码路径(如src/)不在<include></include>里,报告里全是空白
最小可用配置示例:
<?xml version="1.0" encoding="UTF-8"?><phpunit bootstrap="vendor/autoload.php"><testsuites><testsuite name="Unit"><directory>tests/</directory></testsuite></testsuites><coverage processuncoveredfiles="true"><include><directory suffix=".php">src/</directory></include></coverage></phpunit>
写第一个测试时,TestCase继承和命名约定不能妥协
PHPUnit靠类名和文件名双约束来自动发现测试,松一点就找不到:
- 测试类必须继承
PHPUnit\Framework\TestCase(注意命名空间,PHP 8+不能用老的PHPUnit_Framework_TestCase) - 类名必须以
Test结尾(如CalculatorTest),且文件名得严格匹配:CalculatorTest.php - 每个测试方法必须是
public,且以test开头(如testAddReturnsSum()),或用@test注解
别图省事写function test()——它不会被识别;也别把测试类放在src/下还指望自动扫描到。
真正麻烦的从来不是装上PHPUnit,而是让它的自动发现机制和你的项目结构对上号。路径、命名、命名空间,三者差一个字符,phpunit就安静地告诉你“0 tests executed”。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











