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

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

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

开始课程

PHP 应用测试简介

测试是专业 PHP 开发中不可或缺的一部分。它有助于在早期阶段发现错误,简化重构,并提高代码的稳定性。PHP 生态系统拥有一套强大的工具集:从经典的 PHPUnit 到像 Pest 这样的现代框架,以及用于覆盖率分析和变异测试的专业工具。

在本文中,我们将介绍关键框架和工具,帮助您组织高质量的 PHP 项目测试。



PHPUnit — 测试基础

PHPUnit 是 PHP 单元测试的事实标准。它支持所有现代功能:断言、fixtures (setUp/tearDown)、数据提供器、异常测试、桩 (stubs) 和模拟 (mocks)。

通过 Composer 安装:

composer require --dev phpunit/phpunit


一个针对计算器类的简单测试示例:

<?phpuse PHPUnit\\Framework\\TestCase;

class CalculatorTest extends TestCase{ public function testAddition() { $calculator = new Calculator(); $this->assertEquals(4, $calculator->add(2, 2)); }

/** @dataProvider additionProvider */ public function testWithDataProvider($a, $b, $expected) { $calculator = new Calculator(); $this->assertEquals($expected, $calculator->add($a, $b)); }

public function additionProvider(): array { return [ [0, 0, 0], [1, 1, 2], [-1, 1, 0], ]; }}


PHPUnit 的关键功能:

  • 断言:assertEquals、assertTrue、assertCount、assertInstanceOf 等数十种。
  • Fixtures:用于准备和清理环境的 setUp() 和 tearDown() 方法。
  • 数据提供器:@dataProvider 注解,用于使用不同的数据集运行同一测试。
  • 异常测试:expectException() 和 expectExceptionMessage()。
  • 桩和模拟:createMock() 和 getMockBuilder() 用于隔离被测代码。


Pest — 优雅且现代

Pest 是一个构建在 PHPUnit 之上的测试框架,但语法更简洁、更具表现力。它受 Jest (JavaScript) 启发,非常适合注重测试可读性的项目。

安装:

composer require --dev pestphp/pest


在 Pest 中相同的测试示例:

<?php

use function Pest\\Faker\\fake;

test('addition works correctly', function () { $calculator = new Calculator(); expect($calculator->add(2, 2))->toBe(4);});

dataset('numbers', [ [0, 0, 0], [1, 1, 2], [-1, 1, 0],]);

test('addition with data provider', function ($a, $b, $expected) { $calculator = new Calculator(); expect($calculator->add($a, $b))->toBe($expected);})->with('numbers');


Pest 的优势:

  • 最少的样板代码 — 无需创建测试类。
  • 内置 expect()、test()、it() 函数,用于自然语言描述。
  • 从全局函数自动注册测试。
  • 支持嵌套套件 (describe) 和架构测试。


Codeception — 用于集成和 BDD 测试

Codeception 是一个通用框架,它整合了单元测试、功能测试、集成测试和验收测试。它在测试 Web 应用程序(Laravel、Symfony、Yii)和 API 时特别受欢迎。

安装:

composer require --dev codeception/codeception


一个用于网站登录的验收测试示例:

<?php$I = new AcceptanceTester($scenario);$I->amO                    

推荐