跳转到主要内容

什么是 Pest

Pest 是构建在 PHPUnit 之上的测试框架,Laravel 11 之后的新项目默认采用。它保留了 PHPUnit 丰富的断言集合,同时用基于闭包的简洁语法来编写测试。 与 PHPUnit 的主要区别:
Pest 测试仍然通过 PHPUnit 执行,可以与既有的 PHPUnit 测试共存。用 php artisan testvendor/bin/pest 运行。

describe / it / test 的用法差异

test()

最简单的定义。测试名会作为说明使用。

it()

「it should…」这种英文文体,读起来接近自然语言。

describe()

将相关测试分组。可用于共享 beforeEach() 或在文件内进行逻辑整理。
describe() 可以嵌套,但过深的嵌套会让测试难读,一般建议不超过 2 层。

Expectation API

expect() 是 Pest 特有的断言语法,可以链式叠加条件。

基本断言

针对模型的断言

and()

each() 校验数组每个元素

使用数据集进行参数化测试

对同一逻辑使用多个输入进行测试时,使用 dataset() 或行内 with()

行内数据集

命名数据集

tests/Datasets 目录中定义数据集。

使用闭包的动态数据集

使用 Mockery 编写单元测试

服务的 Mock

Spy

Spy 与 Mock 不同,它在调用真实实现的同时记录调用。

部分 Mock

只对部分方法进行 Mock,其余方法使用真实实现。

通过 HTTP Fake 测试外部 API 调用

使用 Http::fake() 可以不发起真实 HTTP 请求而对响应打桩。

基础 Fake

错误响应的测试

模拟网络故障

事件、邮件、通知的 Fake

Event::fake()

也可以只 Fake 特定事件,其它照常执行。

Mail::fake()

Notification::fake()

Artisan 命令的测试

交互式命令的测试

RefreshDatabaseLazilyRefreshDatabase

RefreshDatabase

在每个测试后回滚数据库以保持干净状态。测试套件启动时会执行迁移。

LazilyRefreshDatabase

RefreshDatabase 会对所有测试都检查迁移,而 LazilyRefreshDatabase 会延迟到实际会修改数据库的测试运行时才执行迁移。当有很多不接触数据库的测试时可加速。
多数项目选择 RefreshDatabase 更安全。当测试规模庞大且大量测试不接触数据库时,可以考虑 LazilyRefreshDatabase

代码覆盖率的度量

需要 Xdebug 或 PCOV。
覆盖率度量会显著增加测试运行时间。建议在 CI 中拆分到专门的 Job,或仅在 Pull Request 时运行。

相关页面

测试入门

了解 Laravel 中测试的基本写法以及 php artisan test 的用法。
最后修改于 2026年7月18日