Pest 的辣夏发布

“辣夏”是 Pest 2.9 的代号。

2023 年 3 月 20 日,我们自豪地推出了 Pest 2.0,标志着这是我们迄今为止最重要的版本,在撰写本文时,**下载量已超过 700 万次**。此版本展示了卓越的架构插件、并行测试速度提高了 80%、性能分析选项以及众多其他功能。

随着夏天的临近,我们很高兴地宣布即将发布的版本:备受期待的“辣夏”版本。此版本带来了一系列令人兴奋的功能,使其感觉像是一个主要版本,但实际上并非如此——它是 Pest v2.9.0——所以**只需“composer update”即可获得**。事不宜迟,让我们深入了解一下今年夏天为您准备了什么。

  • **内置快照测试**,轻松测试代码的长时间输出
  • **Describe 块**,用于对测试进行分组并共享设置和拆卸逻辑
  • **架构测试++**,更强大的架构测试
  • **类型覆盖率插件**,用于衡量代码中由类型声明覆盖的百分比
  • **Drift 插件**,自动将 PHPUnit 测试转换为 Pest 测试

内置快照测试

阅读完整文档:pestphp.com/docs/snapshot-testing

快照测试是一种测试技术,允许您断言函数或方法的输出没有改变。这是一种测试代码库并确保代码不会意外更改的好方法。

现在,我们很自豪地宣布 Pest 将支持内置快照测试。例如,假设您的“联系人”端点每次运行时都会输出特定的 HTML。您可能会这样编写测试

1it('has a contact page', function () {
2 $response = $this->get('/contact');
3 
4 expect($response)->toMatchSnapshot();
5});

第一次运行此测试时,它将在 tests/.pest/snapshots 中创建一个快照文件,其中包含响应内容。下次运行测试时,它会将响应与快照文件进行比较。如果响应不同,则测试将失败。如果响应相同,则测试将通过。

此外,给定的预期值不必是响应;它可以是任何东西。例如,您可以对数组进行快照

1$array = /** Fetch array somewhere */;
2 
3expect($array)->toMatchSnapshot();

当然,您可以随时使用 --update-snapshots 选项“重建”快照

1./vendor/bin/pest --update-snapshots

Describe 块

自从我们发布 Pest 以来,Describe 块一直是最受请求的功能之一。它们是任何“功能性”测试框架的基础,因为它们允许您对测试进行分组并共享设置和拆卸逻辑。

1beforeEach(fn () => $this->user = User::factory()->create());
2 
3describe('auth', function () {
4 beforeEach(fn () => $this->actingAs($this->user));
5 
6 test('cannot login when already logged in', function () {
7 // ...
8 });
9 
10 test('can logout', function () {
11 // ...
12 });
13})->skip(/* Skip the entire describe block */);
14 
15describe('guest', function () {
16 test('can login', function () {
17 // ...
18 });
19 
20 // ...
21});

架构测试++

阅读完整文档:pestphp.com/docs/arch-testing

Pest 一直致力于使测试更令人愉快。在上次发布中,我们引入了架构断言,允许您测试代码库的架构。在此版本中,我们很自豪地宣布 Pest 通过添加新的断言来改进架构断言。

1test('controllers')
2 ->expect('App\Http\Controllers')
3 ->toUseStrictTypes()
4 ->toHaveSuffix('Controller') // or toHavePreffix, ...
5 ->toBeReadonly()
6 ->toBeClasses() // or toBeInterfaces, toBeTraits, ...
7 ->classes->not->toBeFinal() // 🌶
8 ->classes->toExtendNothing() // or toExtend(Controller::class),
9 ->classes->toImplementNothing() // or toImplement(ShouldQueue::class),

类型覆盖率插件

阅读完整文档:pestphp.com/docs/type-coverage

您可能知道,Pest 提供了一个 --coverage 标志,允许您在终端上生成精美的覆盖率报告。此报告显示哪些代码行被您的测试覆盖。这是一种确保您的测试涵盖所有代码的好方法。

此外,我们很自豪地宣布 Pest 现在将支持内置类型覆盖率。这意味着您现在可以查看源代码是否在每个可能的位置都使用了“类型”。例如,假设您有一个包含以下方法的存储库

1public function find($id)
2{
3 return User::find($id);
4}

此方法缺少参数类型和返回类型。因此,如果您运行 pest --type-coverage,您将看到以下输出,并知道您需要为此方法添加类型

1...
2app/Models\User.php .......................................... 100%
3app/Repositories/UserRepository.php .................. pa8, rt8 33%
4───────────────────────────────────────────────────────────────────
5Total: 91.6 %

此外,就像常规覆盖率一样,您可以强制执行 --min 类型覆盖率百分比。例如,如果您运行 --type-coverage --min=100,您将看到以下输出

1...
2app/Models\User.php .......................................................... 100%
3app/Repositories/UserRepository.php .................................. pa8, rt8 33%
4───────────────────────────────────────────────────────────────────────────────────
5 Total: 91.6 %
6 ERROR Type coverage below expected: 91.6%. Minimum: 100.0%

Drift 插件

阅读完整文档:pestphp.com/docs/migrating-from-phpunit-guide

是的,您没看错。我们很自豪地宣布 Pest 现在将拥有一个名为 Drift 的类似 Laravel shift 的工具。Drift 将允许您在几秒钟内将 PHPUnit 测试升级到 Pest 测试。

因此,如果您有这样的测试

1<?php
2 
3namespace Tests\Unit;
4 
5use PHPUnit\Framework\TestCase;
6 
7class ExampleTest extends TestCase
8{
9 public function test_that_true_is_true(): void
10 {
11 $this->assertTrue(true);
12 }
13}

您可以运行 ./vendor/bin/pest --drift,Pest 将自动将您的 PHPUnit 测试转换为 Pest 测试

1 
2 
3test('true is true', function () {
4 expect(true)->toBeTrue();
5});

感谢您阅读关于 Pest 2.9 的新功能!如果您正在考虑为下一个项目选择一个测试框架,以下是如何尝试 Pest 的原因:为什么选择 Pest →