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に組み込みのスナップショットテストサポートが追加されたことを誇りに思います。例として、「contacts」エンドポイントが実行されるたびに特定の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ブロックは最も要望の多かった機能の1つです。これは、テストをグループ化し、セットアップとティアダウンロジックを共有できるため、あらゆる「機能」テストフレームワークにとって基本的なものです。

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に、LaravelのshiftのようなツールであるDriftが追加されたことを誇りに思います。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なのか →