关于 phpunit-skill
phpunit-skill 为 PHP 开发者提供 PHPUnit 测试参考,涵盖基础测试模式及从测试数据到 CI 集成的深入实践。
主要功能
- 01测试用例与生命周期钩子
- 02断言与数据提供器
- 03模拟对象与测试替身
- 04HTTP、数据库和 CI 模式
适用场景
- 01组织隔离的 PHPUnit 测试
- 02使用严格断言检查行为
- 03测试仓储和 API 端点
- 04排查常见测试问题
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ lambdatest/ agent-skills --skill phpunit-skill安装后在 Claude Code 中输入/phpunit-skill确认已加载。
附带文件reference/advanced-patterns.mdreference/playbook.md
详细介绍
PHPUnit 测试技能
核心模式
基本测试
<?php
use PHPUnit\Framework\TestCase;
class CalculatorTest extends TestCase
{
private Calculator $calculator;
protected function setUp(): void
{
$this->calculator = new Calculator();
}
public function testAddition(): void
{
$this->assertEquals(5, $this->calculator->add(2, 3));
}
public function testDivideByZero(): void
{
$this->expectException(\DivisionByZeroError::class);
$this->calculator->divide(10, 0);
}
public function testMultipleAssertions(): void
{
$this->assertSame(4, $this->calculator->add(2, 2));
$this->assertSame(0, $this->calculator->subtract(2, 2));
$this->assertSame(6, $this->calculator->multiply(2, 3));
}
}
数据提供器
/**
* @dataProvider additionProvider
*/
public function testAdd(int $a, int $b, int $expected): void
{
$this->assertEquals($expected, $this->calculator->add($a, $b));
}
public static function additionProvider(): array
{
return [
'positive numbers' => [2, 3, 5],
'negative numbers' => [-1, -1, -2],
'zeros' => [0, 0, 0],
'mixed' => [10, -5, 5],
];
}
断言
$this->assertEquals($expected, $actual);
$this->assertSame($expected, $actual); // Strict type
$this->assertNotEquals($unexpected, $actual);
$this->assertTrue($condition);
$this->assertFalse($condition);
$this->assertNull($value);
$this->assertNotNull($value);
$this->assertCount(3, $array);
$this->assertContains('item', $array);
$this->assertArrayHasKey('key', $array);
$this->assertInstanceOf(MyClass::class, $obj);
$this->assertStringContainsString('sub', $string);
$this->assertMatchesRegularExpression('/\d+/', $string);
$this->assertEmpty($collection);
$this->assertGreaterThan(5, $value);
$this->assertJsonStringEqualsJsonString($expected, $actual);
模拟
public function testCreateUser(): void
{
$mockRepo = $this->createMock(UserRepository::class);
$mockRepo->expects($this->once())
->method('save')
->with($this->isInstanceOf(User::class))
->willReturn(new User(1, 'Alice'));
$mockEmail = $this->createMock(EmailService::class);
$mockEmail->expects($this->once())
->method('sendWelcome')
->with('[email protected]');
$service = new UserService($mockRepo, $mockEmail);
$result = $service->createUser('[email protected]', 'Alice');
$this->assertEquals(1, $result->getId());
}
生命周期
public static function setUpBeforeClass(): void { } // Once before all
protected function setUp(): void { } // Before each test
protected function tearDown(): void { } // After each test
public static function tearDownAfterClass(): void { } // Once after all
反模式
| 不佳做法 | 良好做法 | 原因 |
|---|---|---|
对严格比较使用 assertEquals | 使用 assertSame 比较类型和值 | 类型强制转换 |
| 不使用数据提供器 | 使用 @dataProvider | 避免重复 |
| 使用全局状态 | 使用 setUp()/tearDown() | 隔离 |
| 不使用分组 | 使用 @group smoke | 运行部分测试 |
设置:composer require --dev phpunit/phpunit
运行:./vendor/bin/phpunit 或 ./vendor/bin/phpunit --group smoke
配置:使用测试套件和覆盖率配置的 phpunit.xml
深入模式
生产级模式请参阅 reference/playbook.md:
| 章节 | 内容 |
|---|---|
| §1 项目设置 | composer.json、带测试套件的 phpunit.xml、覆盖率配置、项目结构 |
| §2 测试模式 | 断言、#[DataProvider]、Generator 生成值、严格比较 |
| §3 模拟 | 使用回调的 createMock、Mockery 间谍、连续返回值 |
| §4 测试替身 | 内存中的伪实现、仓储模式、测试辅助工具 |
| §5 Faker 与测试固件 | 可覆盖字段的 TestDataFactory、批量生成 |
| §6 异常测试 | 详细的异常断言、警告测试 |
| §7 HTTP 与 API 测试 | Symfony WebTestCase、身份验证、验证、分页 |
| §8 数据库测试 | 事务回滚、仓储集成、Doctrine |
| §9 CI/CD 集成 | 使用 MySQL/Redis 的 GitHub Actions、覆盖率阈值 |
| §10 调试表 | 12 个常见问题及其原因和修复方法 |
| §11 最佳实践 | 包含 14 项的生产级 PHP 测试清单 |
评论
支持 Markdown