phpunit单元测试核心是为单个行为编写独立、可重复、断言明确的测试方法,强调“输入-预期输出”清晰表达而非追求覆盖率;需安装phpunit、建tests目录、类名以test结尾并继承testcase;测试方法以test开头或用@test注解,用assertequals等断言;用setup/teardown管理共享状态;对外部依赖使用mock隔离。

编写 PHPUnit 单元测试用例,核心是为被测代码的**单个行为**写一个独立、可重复、断言明确的测试方法。重点不是“写满覆盖率”,而是让每个测试清晰表达“输入什么,预期输出/状态是什么”。
1. 确保环境和基础结构就绪
先确认项目已安装 PHPUnit(推荐通过 Composer):
- 运行 composer require --dev phpunit/phpunit(PHP 8.1+ 推荐 ^10.0)
- 在项目根目录创建 tests/ 目录,与 src/ 平行
- 测试类命名以 Test 结尾(如 CalculatorTest.php),放在 tests/ 下
- 测试类需继承 PHPUnit\Framework\TestCase
2. 编写一个标准测试方法
每个测试方法必须以 test 开头(或用 @test 注解),且无参数、返回 void:
- 方法名尽量描述行为,例如 testAddReturnsSumOfTwoPositiveNumbers()
- 使用 $this->assertEquals($expected, $actual) 等断言验证结果
- 避免在测试中做逻辑判断或循环;一个测试只专注一个场景
use PHPUnit\Framework\TestCase;
class CalculatorTest extends TestCase
{
public function testAddReturnsSumOfTwoPositiveNumbers()
{
$calculator = new Calculator();
$result = $calculator->add(2, 3);
$this->assertEquals(5, $result);
}
}
3. 合理使用 setUp() 和 tearDown()
当多个测试需要相同前置对象或状态时,用 setUp() 统一准备,tearDown() 清理(如关闭连接、重置静态变量):
- setUp() 在每个测试方法执行前自动调用(非构造函数)
- 不要在 setUp() 中做耗时操作或外部依赖初始化(应考虑依赖注入或测试替身)
- 若只需一次初始化,可用 setUpBeforeClass()(静态方法,注意生命周期)
4. 处理依赖与外部交互
真实业务常涉及数据库、HTTP 请求、文件系统等。单元测试应隔离外部影响:
- 用 Mock 对象 替换依赖类,控制其返回值或验证是否被调用
- 例如:$mockLogger = $this->createMock(LoggerInterface::class);
- 对数据库操作,优先测试 Repository 接口契约,用内存数组或 SQLite 内存库替代真实 DB
- 避免在单元测试中真正发 HTTP 请求——那是集成测试范畴
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











