テストの構成
Pest.php
ファイルはテストスイートセットアップを定義するために使用する設定ファイルです。このファイルはプロジェクトのtests
ディレクトリにあり、テストを実行するとPestによって自動的にロードされます。このファイル内でグローバルフックまたはカスタムの期待を定義できますが、その主な目的は、テストスイートで使用される基本テストクラスを指定することです。
Pestを使用すると、テスト関数に提供されるクロージャ内で使用可能な$this
変数は、特定のテストケースクラス(通常はPHPUnit\Framework\TestCase
)にバインドされます。これにより、Pestの関数型スタイルで記述されたテストケースは、PHPUnitの基本的なアサーションAPIにアクセスでき、PHPUnitのテストフレームワークに精通している他の開発者とのコラボレーションが簡単になります。
1it('has home', function () {2 echo get_class($this); // \PHPUnit\Framework\TestCase3 4 $this->assertTrue(true);5});
ただし、特定のフォルダーやテストスイート全体を別の基本テストケースクラスに関連付けることで、テスト内の$this
の値を変更できます。これを実現するには、Pest.php
構成ファイル内でpest()
関数とin()
メソッドを使用します。
1// tests/Pest.php2pest()->extend(Tests\TestCase::class)->in('Feature');3 4// tests/Feature/ExampleTest.php5it('has home', function () {6 echo get_class($this); // \Tests\TestCase7});
さらに、Pestはin()メソッドでglobパターンをサポートしています。これにより、1つのパターンで複数のディレクトリまたはファイルを指定できます。Globパターンは、ワイルドカードなどのさまざまなファイルパスと一致できる文字列表現です。Globパターンに詳しくない場合は、こちらのPHPマニュアルを参照してください。
1// tests/Pest.php2pest()->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.php2pest()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.php13pest()->extend(TestCase::class)->in('Feature');14 15// tests/Feature/ExampleTest.php16it('has home', function () {17 $this->performThis();18});
トレイトをテストまたはフォルダーにリンクすることは、クラスとほぼ同じです。たとえば、Laravelでは、各テストの前にデータベースをリセットするRefreshDatabase
トレイトを使用できます。トレイトをテストに含めるには、トレイト名をpest()->use()
メソッドに渡します。
1<?php2 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\MySpecificTestCase5});
次に、テストスイートを構成するときに使用できる機能の1つとして、フォルダーをグループ化する機能があります。この機能を利用すると、--group
オプションを使用して実行するテストをフィルタリングできます:Grouping Tests