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

PHP 测试框架 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

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

例如,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 v4 Selenium Cypress Playwright
语法简洁性 ⭐⭐⭐⭐⭐ ⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐
Laravel 集成 ⭐⭐⭐⭐⭐ ⭐⭐ ⭐⭐ ⭐⭐
多浏览器支持 ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐⭐⭐
执行速度 ⭐⭐⭐⭐ ⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐
学习曲线 ⭐⭐⭐⭐⭐ ⭐⭐ ⭐⭐⭐ ⭐⭐⭐

总结

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

核心优势总结

  • 🎯 开发体验优先:优雅的语法,降低测试编写门槛

  • 🚀 性能卓越:并行执行、测试分片,大幅提升效率

  • 🔧 Laravel 深度集成:无缝使用 Laravel 的所有测试特性

  • 🌐 现代化技术栈:基于 Playwright,支持最新浏览器特性

  • 📈 可扩展性强:从小型项目到大型企业应用都能胜任

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

相关资源

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

相关推荐
David爱编程39 分钟前
Java 守护线程 vs 用户线程:一文彻底讲透区别与应用
java·后端
小奏技术1 小时前
国内APP的隐私进步,从一个“营销授权”弹窗说起
后端·产品
小研说技术1 小时前
Spring AI存储向量数据
后端
苏三的开发日记1 小时前
jenkins部署ruoyi后台记录(jenkins与ruoyi后台处于同一台服务器)
后端
苏三的开发日记1 小时前
jenkins部署ruoyi后台记录(jenkins与ruoyi后台不在同一服务器)
后端
苏琢玉1 小时前
订单号老是撞车?我写了个通用 PHP ID 生成器
php·composer
陈三一1 小时前
MyBatis OGNL 表达式避坑指南
后端·mybatis
whitepure1 小时前
万字详解JVM
java·jvm·后端
我崽不熬夜1 小时前
Java的条件语句与循环语句:如何高效编写你的程序逻辑?
java·后端·java ee
我崽不熬夜2 小时前
Java中的String、StringBuilder、StringBuffer:究竟该选哪个?
java·后端·java ee