PHP 测试:框架与工具
代码质量是成功 Web 项目的基础。对于 PHP 开发者而言,测试已不再是可选项,而是开发过程中的必要环节。本文将介绍三个关键工具:PHPUnit(行业标准)、Pest(现代极简主义)和 Codeception(集成测试)。您将学习如何编写单元测试、使用模拟对象以及在 PHP 项目中实施 TDD。
1. PHPUnit — PHP 测试的基石
PHPUnit 是 PHP 单元测试的事实标准。它被包含在 Symfony、Laravel 及其他流行框架中。
安装与基础测试
composer require --dev phpunit/phpunit一个针对计算器类的简单测试示例:
// src/Calculator.phpclass Calculator { public function add($a, $b) { return $a + $b; }}
// tests/CalculatorTest.phpuse PHPUnit\\Framework\\TestCase;
class CalculatorTest extends TestCase { public function testAddition() { $calc = new Calculator(); $this->assertEquals(4, $calc->add(2, 2)); }}使用模拟对象
PHPUnit 提供了内置的模拟(mock)创建机制:
public function testUserRepository() { $mockRepo = $this->createMock(UserRepository::class); $mockRepo->method('findById') ->willReturn(new User(1, 'Alice'));
$service = new UserService($mockRepo); $result = $service->getUser(1); $this->assertEquals('Alice', $result->getName());}2. Pest — 优雅的测试语法
Pest 是 PHPUnit 的一个封装,提供了更简洁、更具可读性的语法。非常适合注重测试编写速度的项目。
安装与示例
composer require --dev pestphp/pest与 PHPUnit 对比:同样的测试在 Pest 中如下所示:
// tests/CalculatorTest.phpit('calculates addition', function () { $calc = new Calculator(); expect($calc->add(2, 2))->toBe(4);});高级功能
- Higher Order Tests — 无嵌套的调用链
- Architecture Testing — 检查类结构
- Snapshot Testing — 与基准数据比较
3. Codeception — 用于集成测试和功能测试
Codeception 将单元测试、功能测试和验收测试整合在一个框架中。支持 Selenium、Symfony、Laravel、Yii 甚至 WordPress。
测试结构
codecept generate:cest acceptance LoginCest一个针对 Laravel 的功能测试示例:
// tests/functional/UserCest.phpclass UserCest { public function testLogin(FunctionalTester $I) { $I->amOnPage('/login'); $I->fillField('email', 'user@example.com'); $I->fillField('password', 'secret'); $I->click('Login'); $I->see('Dashboard'); }}4. 其他工具
- Mockery — 灵活的模拟对象库(PHPUnit 内置模拟的替代方案)
- PHPStan / Psalm — 静态分析,在运行测试前发现错误
- Infection — 变异测试:检查测试本身的质量
- PHP CodeSniffer — 确保符合 PSR-12 标准
5. 实践示例:API 服务的 TDD
我们为一个订单服务实现一个简单的 TDD(测试驱动开发)循环:
步骤 1. 编写测试
// tests/OrderServiceTest.phppublic function testCrea