phpunit 10 是主流稳定版本,要求测试类继承 testcase、命名规范、方法聚焦单一行为;断言需语义精准,善用数据提供器和模拟机制隔离依赖。

PHPUnit 10 是当前主流且稳定支持 PHP 8.1+ 的版本,编写测试用例的核心在于**隔离验证、结构清晰、断言精准**。不需要写一堆样板代码,重点是让每个测试只专注一个行为,失败时能快速定位问题。
创建标准测试类与方法
测试类必须继承 PHPUnit\Framework\TestCase,放在 tests/ 目录下,路径与源码对应(如 src/Service/OrderService.php → tests/Service/OrderServiceTest.php)。测试方法以 test 开头,或使用 #[Test] 属性(PHPUnit 10 推荐)。
- 类名用 PascalCase,结尾带
Test,例如OrderServiceTest - 方法名描述行为而非实现,如
testThrowsExceptionWhenQuantityIsNegative() - 避免在构造函数中初始化被测对象,改用
setUp()方法确保每次测试干净独立
常用断言要选对场景
断言不是越多越好,而是匹配实际校验意图。PHPUnit 10 提供语义明确的方法,避免用 assertEquals 硬套所有情况。
- 比较返回值是否等于预期:用
$this->assertSame(42, $result)(类型+值严格一致)或$this->assertEquals(42, $result)(宽松相等) - 验证布尔逻辑:用
$this->assertTrue($user->isActive()),比assertEquals(true, ...)更直观 - 检查异常是否抛出:在方法前加
#[ExpectedException(InvalidArgumentException::class)],或在方法内调用$this->expectException(InvalidArgumentException::class) - 确认数组结构:用
$this->assertArrayHasKey('email', $data)或$this->assertContains('admin', $roles)
用数据提供器覆盖多组输入
避免复制粘贴多个 testAddWithXAndY() 方法。把不同参数组合抽成静态提供器,一套逻辑跑全场景。
- 定义
public static function additionCases(): array,返回类似[ [2, 3, 5], [-1, 1, 0], [0, 0, 0] ]的二维数组 - 在测试方法上添加
#[DataProvider('additionCases')] - 方法签名改为
public function testAddReturnsCorrectSum(int $a, int $b, int $expected): void - 执行时 PHPUnit 自动调用三次,每组参数单独计为一个测试用例
模拟外部依赖保证测试稳定
数据库、HTTP 客户端、邮件服务这些不稳定因素必须隔离。PHPUnit 10 内置 createMock() 和 createStub(),无需额外装 Mockery。
- 模拟接口依赖:
$mailer = $this->createMock(MailerInterface::class); - 设定期望行为:
$mailer->expects($this->once())->method('send')->with($this->isInstanceOf(Email::class)); - 替换进被测对象:
$service = new OrderService($mailer, $logger); - 这样测试不发真实邮件,也不连数据库,快且可重复
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











