PHPUnit 是一款单元测试框架,用于在 PHP 中测试代码。通过编写测试用例,可以验证代码的正确性、可靠性和鲁棒性。掌握 PHPUnit 测试有助于提升代码质量,并确保应用程序稳定可靠地运行。
安装和设置
首先,使用 Composer 安装 PHPUnit:
composer require --dev phpunit/phpunit
然后,在项目中创建一个 tests 目录,用于存放测试用例文件。
测试用例
测试用例是 PHPUnit 中用于测试代码的基本单位。它包含一个或多个测试方法。每个测试方法都应以 "test" 开头,并验证代码的特定方面。
例如,以下测试用例测试了一个计算面积的函数:
<?php
use PHPUnitFrameworkTestCase;
class AreaCalculatorTest extends TestCase
{
public function testCalculateArea()
{
$calculator = new AreaCalculator();
$area = $calculator->calculateArea(5, 10);
$this->assertEquals(50, $area);
}
}
断言
断言用于验证测试结果是否符合预期。PHPUnit 提供了多种断言方法,例如:
- assertEquals() - 验证两个值相等
- assertTrue() - 验证一个值为真
- assertFalse() - 验证一个值不为真
依赖注入
在编写测试用例时,有时需要依赖外部类或函数。PHPUnit 提供了依赖注入机制,通过使用 @inject 注解将依赖项注入到测试用例中。
例如,以下测试用例使用依赖注入来注入 Square 类:
<?php
use PHPUnitFrameworkTestCase;
class SquareTest extends TestCase
{
/** @inject */
private Square $square;
public function testPerimeter()
{
$this->square->setSide(5);
$this->assertEquals(20, $this->square->calculatePerimeter());
}
}
Code Coverage
Code coverage 工具可用于衡量 PHPUnit 测试用例覆盖了多少代码。PHPUnit 与 Xdebug 集成,允许报告测试运行期间执行的代码行。
持续集成
持续集成 (CI) 系统可自动运行 PHPUnit 测试,并在代码更改时提供反馈。这有助于确保在代码合并到主分支之前检测和修复错误。
模拟和存根
模拟和存根是用于创建测试替身的技术。模拟对象的行为,而存根控制它们接收的参数和返回的值。这有助于在测试代码时隔离依赖项。
性能测试
PHPUnit 提供了 PHPUnit_Extensions_PerformanceExtension,用于测量测试的执行时间。这有助于识别性能瓶颈并优化代码。
最佳实践
- 编写小而集中的测试用例,专注于特定功能
- 使用断言来明确验证预期行为
- 使用依赖注入来降低测试用例与外部依赖项之间的耦合
- 测量代码覆盖率以确保测试充分覆盖了代码库
- 使用模拟和存根来隔离依赖项并提高测试可靠性
- 在 CI 系统中自动运行测试以确保持续质量