Pest v4 正式发布 革命性的浏览器测试体验

前言

PHP 最优雅的测试框架 Pest 正式发布了 v4 版本!这是该框架迄今为止最重大的升级,带来了令人瞩目的浏览器测试功能。

对于不熟悉 Pest 的开发者,Pest 是一个专为 PHP 设计的现代化测试框架,以其简洁优雅的语法而闻名。它基于 PHPUnit 构建,但提供了更加直观和易读的测试编写体验。

Pest v4 的浏览器测试特性让你能够编写优雅、可维护的浏览器测试代码,并且完美支持 Laravel 的测试 API,还能并行运行测试。这是第一次,浏览器测试写起来就像单元测试一样舒适自然。

Pest 的创建者 Nuno Maduro 在 Laracon US 大会上演示了 Pest v4 的新浏览器测试功能。

浏览器测试:测试体验的质变

核心特性概览

Pest v4 的浏览器测试功能基于现代化的 Playwright 引擎,为开发者提供了前所未有的测试体验:

  • 无缝集成 Laravel 特性:完美支持 Event::fake()assertAuthenticated() 和模型工厂
  • 数据库状态管理:支持 RefreshDatabase trait,甚至可以使用 SQLite 内存数据库
  • 多浏览器支持:Chrome、Firefox、Safari 全覆盖
  • 响应式测试:支持不同设备和视口(iPhone 14 Pro、平板电脑或自定义断点)
  • 主题切换测试:轻松测试明暗模式切换
  • 丰富的交互操作:点击、输入、滚动、选择、提交、拖拽、触摸手势等
  • 并行执行:显著提升大型测试套件的执行速度
  • 调试友好:支持截图和测试暂停功能

实际应用示例

以下是一个实际的密码重置功能测试示例:

php
it('may reset the password', function () {
    // 使用 Laravel 测试助手
    Notification::fake();

    // 数据库操作 — 使用 RefreshDatabase trait(甚至支持 SQLite 内存数据库)
    $this->actingAs(User::factory()->create());

    $page = visit('/sign-in') // 在真实浏览器中访问页面
        ->on()->mobile() // 或者 ->desktop(), ->tablet() 等
        ->inDarkMode(); // 或者 ->inLightMode()

    $page->assertSee('Sign In')
         ->click('Forgot Password?')
         ->type('email', 'nuno@laravel.com')
         ->press('Send Reset Link')
         ->assertSee('We have emailed your password reset link!')
         ->assertNoJavascriptErrors(); // 或者 ->assertNoConsoleLogs()

    Notification::assertSent(ResetPassword::class);
});

这个例子完美展现了 Pest v4 浏览器测试的优雅语法和强大功能。

快速上手

环境要求

在开始之前,请确保你的开发环境满足以下要求:

  • PHP 8.3 或更高版本
  • Composer
  • Node.js 和 npm(用于安装 Playwright)

安装步骤

要开始使用 Pest v4 的浏览器测试功能,只需要安装相应的插件:

bash
# 安装 Pest 浏览器测试插件
composer require pestphp/pest-plugin-browser --dev

# 安装 Playwright(浏览器自动化引擎)
npm install playwright@latest

# 下载浏览器二进制文件
npx playwright install

第一个浏览器测试

安装完成后,你就可以在任何地方使用 visit() 函数了。创建一个简单的测试文件:

php
// tests/Feature/HomePageTest.php
<?php

it('can visit the home page', function () {
    visit('/')
        ->assertSee('欢迎')
        ->assertNoJavascriptErrors();
});

运行测试只需要执行:

bash
./vendor/bin/pest

Pest 会自动处理其余工作:启动浏览器、导航到页面、执行你指定的操作。

烟雾测试:应用健康度的快速检查

什么是烟雾测试? 烟雾测试是一种基础的软件测试方法,用于验证应用程序的核心功能是否正常工作。就像检查房子是否有烟雾来判断是否着火一样,烟雾测试能快速发现应用中的基本问题。

在真实浏览器中进行烟雾测试从未如此简单。使用 Pest v4,你可以轻松访问应用的所有页面,确保它们不会抛出 JavaScript 错误,也不会产生控制台错误:

php
$routes = ['/', '/about', '/contact'];

visit($routes)->assertNoSmoke();

// assertNoSmoke() 是以下断言的简写:
// - assertNoJavascriptErrors()
// - assertNoConsoleLogs()

这种方式让你能够快速验证整个应用的基本功能是否正常。

视觉回归测试:UI 一致性的守护者

想要确保页面外观在版本迭代中保持一致?Pest v4 引入了视觉回归测试功能,通过 assertScreenshotsMatches() 断言实现。这个功能允许你对页面进行截图,并与基准图像进行比较,确保 UI 在代码变更过程中保持一致:

php
$pages = visit(['/', '/about', '/contact']);

$pages->assertScreenshotsMatches();

这只是 Pest v4 浏览器测试功能的冰山一角。更多详细信息,请查阅官方的浏览器测试文档。

测试分片:大规模测试的性能优化

什么是测试分片? 测试分片(Test Sharding)是一种将大型测试套件分割成多个较小部分的技术,这些部分可以在不同的进程或机器上并行执行,从而显著减少总体测试时间。

Pest v4 引入了测试分片功能,允许你将测试套件拆分为更小、更易管理的块。这对于大型应用(或运行浏览器测试时)特别有用,因为一次性运行所有测试可能会非常耗时。

为什么需要测试分片?

  • 🚀 提升速度:并行执行测试,大幅减少等待时间
  • 💰 节省成本:在 CI 环境中更高效地利用计算资源
  • 🔧 提高稳定性:减少单个测试进程的内存压力和超时风险

这个特性在 CI 平台上尤其有价值。在 GitHub Actions 等环境中,你无法再进行垂直扩展,而是需要水平扩展。这意味着你可以在多台机器上并行运行测试,显著加速测试套件的执行。

使用方法

要开始使用测试分片,可以在运行 Pest 时使用 --shard 选项:

bash
# GitHub 工作流一
./vendor/bin/pest --shard=1/4

# GitHub 工作流二
./vendor/bin/pest --shard=2/4

# GitHub 工作流三
./vendor/bin/pest --shard=3/4

# GitHub 工作流四
./vendor/bin/pest --shard=4/4

你还可以将其与 --parallel 选项结合使用,以真正最大化测试套件的执行速度:

bash
./vendor/bin/pest --shard=1/4 --parallel

CI 配置示例

在 GitHub Actions 中设置分片配置非常简单,只需确保每个作业运行测试套件的不同分片:

yaml
strategy:
  matrix:
    shard: [1, 2, 3, 4]

name: Tests (Shard ${{ matrix.shard }}/4)

steps:
  - name: Run tests
    run: pest --parallel --shard ${{ matrix.shard }}/4

类型覆盖率:性能的飞跃

还记得等待类型覆盖率运行的日子吗?那些日子一去不复返了!Pest v4 引入了全新的类型覆盖率引擎,性能相比之前版本有了显著提升。

性能提升数据

  • 首次运行速度提升 2 倍
  • 后续运行几乎瞬时完成

这意味着你可以快速检查类型覆盖率,无需长时间等待,让开发工作流程更加高效。

此外,类型覆盖率现在也支持分片功能。你可以像运行测试一样,使用 --shard 选项运行类型覆盖率检查。

代码规范检查:Profanity 插件

Pest v4 引入了一个新功能:检查测试代码中的不当内容(带有侮辱性词语)。这对于维护干净、专业的代码库特别有用,尤其是在协作环境中。

使用方法

首先安装 Profanity 插件:

bash
composer require pestphp/pest-plugin-profanity --dev

然后在运行 Pest 时添加 --profanity 选项:

bash
./vendor/bin/pest --profanity

PestPHP

如果代码中包含不当内容,它们会以红色高亮显示,并显示相应的行号和发现的不当词汇。

例如,pr31(f*ck) 表示在第 31 行发现了 "fuck" 这个词。

环境条件测试:灵活的测试控制

Pest v4 引入了根据环境条件跳过测试的能力。你可以使用 skipLocally() 在本地运行时跳过测试,或使用 skipOnCi() 在 CI 服务器上跳过测试:

php
it('does not run locally', function () {
    // 这个测试在本地运行时会被跳过
})->skipLocally();

it('does not run on CI', function () {
    // 这个测试在 CI 服务器上会被跳过
})->skipOnCi();

这个功能让你能够更精确地控制测试的执行环境,提高测试效率。

其他重要改进

架构期望增强

  • 新增 not->toHaveSuspiciousCharacters() 架构期望,帮助识别代码中的潜在可疑字符
  • 该架构期望现在默认在 PHP 架构预设中启用

新的验证期望

  • 新增 toBeSlug 期望,帮助验证字符串是否为有效的 URL slug

基于 PHPUnit 12

Pest v4 基于 PHPUnit 12 构建,这意味着你可以获得 PHPUnit 的所有最新功能和改进。务必查看 PHPUnit 12 的发布公告以了解更多详情。

升级指南

如果你已经在使用早期版本的 Pest,官方提供了详细的升级指南。对于新用户,可以查看官方的安装指南获取分步说明。

实际应用场景

Pest v4 的浏览器测试功能特别适合以下场景:

  • 电商网站:测试购物流程、支付流程、用户注册登录
  • 管理后台:验证数据表格、表单提交、权限控制
  • SPA 应用:测试路由跳转、状态管理、API 交互
  • 移动端适配:验证响应式设计在不同设备上的表现
  • 多语言网站:测试国际化功能和语言切换

与其他工具的对比

特性Pest v4SeleniumCypressPlaywright
语法简洁性⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
Laravel 集成⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
多浏览器支持⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
执行速度⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
学习曲线⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐

总结

Pest v4 的发布标志着 PHP 测试生态系统的一个重要里程碑。浏览器测试功能的引入,让端到端测试变得像编写单元测试一样简单优雅。结合测试分片、性能优化和各种实用功能,Pest v4 为现代 PHP 开发提供了完整的测试解决方案。

核心优势总结

  • 🎯 开发体验优先:优雅的语法,降低测试编写门槛
  • 🚀 性能卓越:并行执行、测试分片,大幅提升效率
  • 🔧 Laravel 深度集成:无缝使用 Laravel 的所有测试特性
  • 🌐 现代化技术栈:基于 Playwright,支持最新浏览器特性
  • 📈 可扩展性强:从小型项目到大型企业应用都能胜任

无论你是 Laravel 开发者还是 PHP 生态系统的其他参与者,现在都是开始使用 Pest 进行测试的最佳时机。Pest v4 的发布为 PHP 开发者带来了更优雅、更高效的测试体验!

相关资源

技术标签#PHP #Testing #Laravel #Pest #BrowserTesting #E2E #Playwright

CatchAdmin
后端开发工程师,前端入门选手,略知相关服务器知识,偏爱❤️ Laravel & Vue
本作品采用《CC 协议》,转载必须注明作者和本文链接