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 可以生成代码覆盖率报告(需要安装 Xdebug
或 PCOV
扩展)。
生成代码覆盖率报告
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 测试,并生成报告。