テストの構成

Pest.phpファイルはテストスイートセットアップを定義するために使用する設定ファイルです。このファイルはプロジェクトのtestsディレクトリにあり、テストを実行するとPestによって自動的にロードされます。このファイル内でグローバルフックまたはカスタムの期待を定義できますが、その主な目的は、テストスイートで使用される基本テストクラスを指定することです。

Pestを使用すると、テスト関数に提供されるクロージャ内で使用可能な$this変数は、特定のテストケースクラス(通常はPHPUnit\Framework\TestCase)にバインドされます。これにより、Pestの関数型スタイルで記述されたテストケースは、PHPUnitの基本的なアサーションAPIにアクセスでき、PHPUnitのテストフレームワークに精通している他の開発者とのコラボレーションが簡単になります。

1it('has home', function () {
2 echo get_class($this); // \PHPUnit\Framework\TestCase
3 
4 $this->assertTrue(true);
5});

ただし、特定のフォルダーやテストスイート全体を別の基本テストケースクラスに関連付けることで、テスト内の$thisの値を変更できます。これを実現するには、Pest.php構成ファイル内でpest()関数とin()メソッドを使用します。

1// tests/Pest.php
2pest()->extend(Tests\TestCase::class)->in('Feature');
3 
4// tests/Feature/ExampleTest.php
5it('has home', function () {
6 echo get_class($this); // \Tests\TestCase
7});

さらに、Pestはin()メソッドでglobパターンをサポートしています。これにより、1つのパターンで複数のディレクトリまたはファイルを指定できます。Globパターンは、ワイルドカードなどのさまざまなファイルパスと一致できる文字列表現です。Globパターンに詳しくない場合は、こちらのPHPマニュアルを参照してください。

1// tests/Pest.php
2pest()->extend(Tests\TestCase::class)->in('Feature/*Job*.php');
3 
4// This will apply the Tests\TestCase to all test files in the "Feature" directory that contains "Job" in their filename.

もう1つ複雑な例として、パターンを使用して異なるモジュールの複数のディレクトリを一致させ、複数のテストケースクラスとトレイトを適用します。

1// tests/Pest.php
2pest()
3 ->extend(DuskTestCase::class)
4 ->use(DatabaseMigrations::class)
5 ->in('../Modules/*/Tests/Browser');
6 
7// This will apply the DuskTestCase class and the DatabaseMigrations trait to all test files within any module's "Browser" directory.

基本テストケースクラスでpublicまたはprotectedとして定義されたメソッドは、テストクロージャ内でアクセスできます。

1use PHPUnit\Framework\TestCase as BaseTestCase;
2 
3// tests/TestCase.php
4class TestCase extends BaseTestCase
5{
6 public function performThis(): void
7 {
8 //
9 }
10}
11 
12// tests/Pest.php
13pest()->extend(TestCase::class)->in('Feature');
14 
15// tests/Feature/ExampleTest.php
16it('has home', function () {
17 $this->performThis();
18});

トレイトをテストまたはフォルダーにリンクすることは、クラスとほぼ同じです。たとえば、Laravelでは、各テストの前にデータベースをリセットするRefreshDatabaseトレイトを使用できます。トレイトをテストに含めるには、トレイト名をpest()->use()メソッドに渡します。

1<?php
2 
3use Tests\TestCase;
4use Illuminate\Foundation\Testing\RefreshDatabase;
5 
6pest()->extend(TestCase::class)->use(RefreshDatabase::class)->in('Feature');

特定のテストケースクラスまたは特性と特定のテストを関連付けるには、pest()->extend()メソッドとpest()->use()メソッドをその特定のテストファイル内で利用し、in()メソッドを使用しません。

1pest()->extend(Tests\MySpecificTestCase::class);
2 
3it('has home', function () {
4 echo get_class($this); // \Tests\MySpecificTestCase
5});

次に、テストスイートを構成するときに使用できる機能の1つとして、フォルダーをグループ化する機能があります。この機能を利用すると、--groupオプションを使用して実行するテストをフィルタリングできます:Grouping Tests