PHP 测试:框架与工具概览(PHPUnit、Pest、Codeception)

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

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                    

推荐