Pest 的“Spicy Summer” 版本
发布于 作者 Nuno Maduro
2023 年 3 月 20 日,我们自豪地推出了 Pest 2.0,这是我们迄今为止最重大的版本,截至撰写本文时,下载量已超过 700 万次。该版本展示了出色的架构插件、并行测试速度提高 80%、性能分析选项以及众多其他功能。
随着夏季的临近,我们很高兴地宣布即将发布备受期待的 "Spicy Summer" 版本。该版本带来了大量令人兴奋的功能,会让它感觉像是主要版本,但实际上并非如此 - 它是 Pest v2.9.0 - 因此您只需执行一次“composer update”即可获得它。事不宜迟,让我们深入了解今年夏天为您准备了什么
- 内置快照测试,用于轻松测试代码的长输出
- Describe 块,用于对测试进行分组并共享设置和拆卸逻辑
- 架构测试++,更强大的架构测试
- 类型覆盖插件,用于测量由类型声明覆盖的代码百分比
- 漂移插件,用于自动将 PHPUnit 测试转换为 Pest
内置快照测试
快照测试是一种测试技术,允许您断言函数或方法的输出没有改变。这是一种测试代码库并确保代码不会意外更改的好方法。
现在,我们很自豪地宣布 Pest 将内置快照测试支持。例如,假设您的“contacts”端点每次运行时都会输出特定的 HTML。您可能会这样编写测试
it('has a contact page', function () { $response = $this->get('/contact'); expect($response)->toMatchSnapshot();});
第一次运行此测试时,它将在 tests/.pest/snapshots 中创建一个快照文件,其中包含响应内容。下次运行测试时,它会将响应与快照文件进行比较。如果响应不同,测试将失败。如果响应相同,测试将通过。
此外,给定的预期值不必是响应;它可以是任何东西。例如,您可以对数组进行快照
$array = /** Fetch array somewhere */; expect($array)->toMatchSnapshot();
当然,您可以随时使用 --update-snapshots 选项“重建”快照
./vendor/bin/pest --update-snapshots
Describe 块
自从我们发布 Pest 以来,describe 块一直是人们最需要的功能之一。这些功能是任何“功能”测试框架的基础,因为它们允许您对测试进行分组并共享设置和拆卸逻辑。
beforeEach(fn () => $this->user = User::factory()->create()); describe('auth', function () { beforeEach(fn () => $this->actingAs($this->user)); test('cannot login when already logged in', function () { // ... }); test('can logout', function () { // ... });})->skip(/* Skip the entire describe block */); describe('guest', function () { test('can login', function () { // ... }); // ...});
架构测试++
Pest 一直致力于让测试更愉快。在上次发布中,我们引入了架构预期,它允许您测试代码库的架构。该版本中,我们很自豪地宣布 Pest 通过添加新的架构预期来改进架构预期。
test('controllers') ->expect('App\Http\Controllers') ->toUseStrictTypes() ->toHaveSuffix('Controller') // or toHavePreffix, ... ->toBeReadonly() ->toBeClasses() // or toBeInterfaces, toBeTraits, ... ->classes->not->toBeFinal() // 🌶 ->classes->toExtendNothing() // or toExtend(Controller::class), ->classes->toImplementNothing() // or toImplement(ShouldQueue::class),
类型覆盖插件
您可能知道,Pest 提供了一个 --coverage 标志,允许您在终端上生成一个漂亮的覆盖率报告。该报告向您展示了哪些代码行被测试覆盖。这是一种确保测试涵盖所有代码的好方法。
为此,我们很自豪地宣布 Pest 现在将内置类型覆盖支持。这意味着您现在可以查看您的源代码是否在所有可能的地方使用“类型”。例如,假设您有一个包含以下方法的存储库
public function find($id){ return User::find($id);}
此方法缺少参数类型和返回类型。因此,如果您运行 pest --type-coverage,您将看到以下输出,并知道您需要为此方法添加类型
...app/Models\User.php .......................................... 100%app/Repositories/UserRepository.php .................. pa8, rt8 33%───────────────────────────────────────────────────────────────────Total: 91.6 % In addition, just like regular coverage, you may enforce --min type coverage percentage. For example, if you run --type-coverage --min=100, you will see the following output: ...app/Models\User.php .......................................................... 100%app/Repositories/UserRepository.php .................................. pa8, rt8 33%─────────────────────────────────────────────────────────────────────────────────── Total: 91.6 % ERROR Type coverage below expected: 91.6%. Minimum: 100.0%
漂移插件
没错,您没有看错。我们很自豪地宣布 Pest 现在将有一个名为 Drift 的类似 Laravel shift 的工具。Drift 允许您在几秒钟内将 PHPUnit 测试升级为 Pest 测试。
因此,如果您有以下测试
<?php namespace Tests\Unit; use PHPUnit\Framework\TestCase; class ExampleTest extends TestCase{ public function test_that_true_is_true(): void { $this->assertTrue(true); }}
您可以运行 ./vendor/bin/pest --drift,Pest 会自动将您的 PHPUnit 测试转换为 Pest 测试
test('true is true', function () { expect(true)->toBeTrue();});
感谢您阅读关于 Pest 2.9 的新功能!
@laravelphp 核心成员 - 创建了 @pestphp、@laravelzero、collision、larastan、pint、@openai for php、@phpinsights、termwind 等等。