PHPUnit

作者admin

1月 22, 2025

PHPUnit 是 PHP 编程语言的单元测试框架,遵循 xUnit 架构。它的主要功能包括:

  • 自动化测试:通过编写测试用例验证代码功能。
  • 隔离测试:支持 Mock 对象和依赖注入,隔离待测单元。
  • 代码覆盖率分析:生成测试覆盖的代码行报告。
  • 集成持续集成(CI)工具:如 Jenkins、GitHub Actions。

安装 PHPUnit

1. 使用 Composer 安装

推荐通过 Composer 安装 PHPUnit:

composer require –dev phpunit/phpunit

2. 全局安装

通过下载 Phar 文件安装 PHPUnit:

wget https://phar.phpunit.de/phpunit.phar
chmod +x phpunit.phar
mv phpunit.phar /usr/local/bin/phpunit

验证安装:

phpunit –version

PHPUnit 测试的基本结构

测试用例

一个测试用例是一个扩展自 PHPUnit\Framework\TestCase 的类,每个测试方法以 test 开头,或被标记为 @test

use PHPUnit\Framework\TestCase;

class ExampleTest extends TestCase {
public function testAddition() {
$this->assertEquals(4, 2 + 2);
}
}

运行测试:

phpunit ExampleTest.php

常用断言方法

PHPUnit 提供了多种断言方法,用于验证测试结果是否符合预期。

1. 基本断言

  • assertEquals($expected, $actual):验证值是否相等。
  • assertNotEquals($expected, $actual):验证值是否不相等。
  • assertSame($expected, $actual):验证值和类型是否相同。
  • assertNotSame($expected, $actual):验证值或类型是否不同。

2. 布尔值

  • assertTrue($condition):验证值是否为 true
  • assertFalse($condition):验证值是否为 false

3. 空值

  • assertNull($actual):验证值是否为 null
  • assertNotNull($actual):验证值是否不为 null

4. 数组

  • assertCount($expectedCount, $array):验证数组元素数量。
  • assertArrayHasKey($key, $array):验证数组是否包含指定键。

5. 异常

  • expectException(Exception::class):验证是否抛出指定异常。
  • expectExceptionMessage($message):验证异常消息内容。

数据驱动测试

PHPUnit 支持数据驱动测试,即为一个测试方法提供多个输入数据集。

class DataDrivenTest extends TestCase {
/**
* @dataProvider additionProvider
*/
public function testAddition($a, $b, $expected) {
$this->assertEquals($expected, $a + $b);
}

public function additionProvider() {
return [
[1, 1, 2],
[2, 2, 4],
[3, 5, 8],
];
}
}

测试套件

测试套件是多个测试用例的集合,可以运行整个目录中的测试。

创建测试套件文件:

<!– phpunit.xml –>
<phpunit>
<testsuites>
<testsuite name=”MyTestSuite”>
<directory>tests</directory>
</testsuite>
</testsuites>
</phpunit>

运行测试套件:

phpunit –configuration phpunit.xml

代码覆盖率分析

PHPUnit 可以生成代码覆盖率报告(需要安装 XdebugPCOV 扩展)。

生成代码覆盖率报告

phpunit –coverage-html coverage

运行后会在 coverage 目录中生成 HTML 报告。

Mock 和 Stub

Mock 和 Stub 是 PHPUnit 的核心特性,用于模拟类或对象的行为:

  • Mock:验证方法调用和参数。
  • Stub:模拟返回值。

class UserService {
public function getUserById($id) {
// 模拟的真实方法
}
}

class UserServiceTest extends TestCase {
public function testGetUserById() {
$mock = $this->createMock(UserService::class);
$mock->method(‘getUserById’)
->willReturn(‘Mock User’);

$this->assertEquals(‘Mock User’, $mock->getUserById(1));
}
}

常见注解

PHPUnit 支持通过注解配置测试行为:

  • @test:标记为测试方法。
  • @dataProvider:指定数据驱动测试的提供者。
  • @depends:设置方法依赖。
  • @before@after:在每个测试方法前后执行。
  • @group:标记测试组,用于运行特定组的测试。

集成 CI/CD 流程

PHPUnit 可以与 CI/CD 工具集成,实现自动化测试。

GitHub Actions

创建 .github/workflows/phpunit.yml

name: PHPUnit Tests
on: [push, pull_request]

jobs:
test:
runs-on: ubuntu-latest
steps:
– uses: actions/checkout@v3
– name: Set up PHP
uses: shivammathur/setup-php@v2
with:
php-version: ‘8.1’
– name: Install dependencies
run: composer install
– name: Run tests
run: vendor/bin/phpunit

Jenkins

配置 Jenkins 作业运行 PHPUnit 测试,并生成报告。

作者 admin

百度广告效果展示