Pest 的辣夏发布
“辣夏”是 Pest 2.9 的代号。
2023 年 3 月 20 日,我们自豪地推出了 Pest 2.0,标志着这是我们迄今为止最重要的版本,在撰写本文时,**下载量已超过 700 万次**。此版本展示了卓越的架构插件、并行测试速度提高了 80%、性能分析选项以及众多其他功能。
随着夏天的临近,我们很高兴地宣布即将发布的版本:备受期待的“辣夏”版本。此版本带来了一系列令人兴奋的功能,使其感觉像是一个主要版本,但实际上并非如此——它是 Pest v2.9.0——所以**只需“composer update”即可获得**。事不宜迟,让我们深入了解一下今年夏天为您准备了什么。
- **内置快照测试**,轻松测试代码的长时间输出
- **Describe 块**,用于对测试进行分组并共享设置和拆卸逻辑
- **架构测试++**,更强大的架构测试
- **类型覆盖率插件**,用于衡量代码中由类型声明覆盖的百分比
- **Drift 插件**,自动将 PHPUnit 测试转换为 Pest 测试
内置快照测试
快照测试是一种测试技术,允许您断言函数或方法的输出没有改变。这是一种测试代码库并确保代码不会意外更改的好方法。
现在,我们很自豪地宣布 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});
架构测试++
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),
类型覆盖率插件
您可能知道,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 插件
是的,您没看错。我们很自豪地宣布 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(): void10 {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 →