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