关于 pest-testing
为 Laravel 项目提供 Pest 4 测试编写与运行规范,涵盖单元、功能和浏览器测试,以及 Pest 4 的相关能力。
主要功能
- 01测试创建与目录规范
- 02Pest 测试风格和断言
- 03数据集与模拟指引
- 04浏览器与冒烟测试
- 05视觉回归与测试分片
- 06架构测试
适用场景
- 01按项目规范编写 Laravel 测试
- 02检查页面的 JavaScript 或控制台错误
- 03比较截图以发现视觉变化
- 04在 CI 进程间拆分测试
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ coollabsio/ coolify --skill pest-testing安装后在 Claude Code 中输入/pest-testing确认已加载。
详细介绍
Pest Testing 4
文档
如需了解 Pest 4 的详细模式和文档,请使用 search-docs。
基本用法
创建测试
所有测试都必须使用 Pest 编写。使用 php artisan make:test --pest {name}。
{name} 参数应仅包含路径和测试名称,不应包含测试套件。
- 错误:
php artisan make:test --pest Feature/SomeFeatureTest会生成tests/Feature/Feature/SomeFeatureTest.php - 正确:
php artisan make:test --pest SomeControllerTest会生成tests/Feature/SomeControllerTest.php - 错误:
php artisan make:test --pest --unit Unit/SomeServiceTest会生成tests/Unit/Unit/SomeServiceTest.php - 正确:
php artisan make:test --pest --unit SomeServiceTest会生成tests/Unit/SomeServiceTest.php
测试组织
- 单元/功能测试:
tests/Feature和tests/Unit目录。 - 浏览器测试:
tests/Browser/目录。 - 未经批准,切勿删除测试——这些是应用的核心代码。
基本测试结构
Pest 支持 test() 和 it() 函数。编写新测试前,请检查同一目录中的现有测试文件,以遵循项目惯例。如果现有测试使用 test(),就使用 test();如果使用 it(),就使用 it()。
it('is true', function () {
expect(true)->toBeTrue();
});
运行测试
- 最后定稿前,使用过滤器运行最少量的测试:
php artisan test --compact --filter=testName。 - 运行所有测试:
php artisan test --compact。 - 运行单个文件:
php artisan test --compact tests/Feature/ExampleTest.php。
断言
使用具体的断言(assertSuccessful()、assertNotFound()),而不是 assertStatus():
it('returns all', function () {
$this->postJson('/api/docs', [])->assertSuccessful();
});
| 使用 | 而非 |
|---|---|
assertSuccessful() | assertStatus(200) |
assertNotFound() | assertStatus(404) |
assertForbidden() | assertStatus(403) |
模拟
使用前导入模拟函数:use function Pest\Laravel\mock;
数据集
对于重复性测试(例如验证规则),请使用数据集:
it('has emails', function (string $email) {
expect($email)->not->toBeEmpty();
})->with([
'james' => '[email protected]',
'taylor' => '[email protected]',
]);
Pest 4 功能
| 功能 | 用途 |
|---|---|
| 浏览器测试 | 在真实浏览器中进行完整的集成测试 |
| 冒烟测试 | 快速验证多个页面 |
| 视觉回归 | 对比屏幕截图以检查视觉变化 |
| 测试分片 | 并行运行 CI |
| 架构测试 | 强制执行代码规范 |
浏览器测试示例
浏览器测试在真实浏览器中运行,以进行完整的集成测试:
- 浏览器测试位于
tests/Browser/。 - 使用 Laravel 功能,例如
Event::fake()、assertAuthenticated()和模型工厂。 - 使用
RefreshDatabase,确保每项测试的状态干净。 - 与页面交互:点击、输入、滚动、选择、提交、拖放和触摸手势。
- 如有要求,在多个浏览器(Chrome、Firefox、Safari)中测试。
- 如有要求,在不同设备/视口(iPhone 14 Pro、平板电脑)上测试。
- 适当时切换配色方案(浅色/深色模式)。
- 截取屏幕截图,或暂停测试以进行调试。
it('may reset the password', function () {
Notification::fake();
$this->actingAs(User::factory()->create());
$page = visit('/sign-in');
$page->assertSee('Sign In')
->assertNoJavaScriptErrors()
->click('Forgot Password?')
->fill('email', '[email protected]')
->click('Send Reset Link')
->assertSee('We have emailed your password reset link!');
Notification::assertSent(ResetPassword::class);
});
冒烟测试
快速验证多个页面没有 JavaScript 错误:
$pages = visit(['/', '/about', '/contact']);
$pages->assertNoJavaScriptErrors()->assertNoConsoleLogs();
视觉回归测试
捕获并对比屏幕截图,以检测视觉变化。
测试分片
将测试拆分到多个并行进程中,以加快 CI 运行速度。
架构测试
Pest 4 包含架构测试(来自 Pest 3):
arch('controllers')
->expect('App\Http\Controllers')
->toExtendNothing()
->toHaveSuffix('Controller');
常见问题
- 使用模拟前未导入
use function Pest\Laravel\mock; - 使用
assertStatus(200)而不是assertSuccessful() - 忘记为重复的验证测试使用数据集
- 未经批准删除测试
- 忘记在浏览器测试中使用
assertNoJavaScriptErrors() - 使用
make:test时,在{name}前加上Feature/或Unit/前缀
评论
支持 Markdown