フック

Pestのフックは、料理を準備する際のステップと似ています。まず、材料を集めて準備し、次に料理を作り、最後に後片付けをします。同様に、フックを使用すると、テストデータの設定、テスト環境の初期化、テスト完了後のリソースのクリーンアップなど、各テストまたはファイルの前後で特定のアクションを実行できます。

Pestでフックを使用すると、テストプロセスを効率化し、反復作業を自動化できます。小規模プロジェクトの単体テストを作成する場合でも、大規模アプリケーションの複雑なテストスイートを構築する場合でも、フックは時間の節約とテストの品質向上に役立ちます。

さらに、特定のテストグループに対してのみフックを実行したい場合は、describe()関数内にフックを含めることができます。

1beforeEach(function () {
2 //
3});
4 
5describe('something', function () {
6 beforeEach(function () {
7 //
8 });
9 
10 //
11});
12 
13test('something', function () {
14 //
15});

Pestで使用できるフックのリストを次に示します。

beforeEach()

現在のファイル内のすべてのテストの前に、指定されたクロージャを実行します。これにより、各テストの前に必要なセットアップまたは構成が完了していることが保証されます。

1beforeEach(function () {
2 // Prepare something before each test run...
3});

beforeEach()フックを使用すると、現在のファイル内のすべてのテストで共有されるプロパティを初期化できます。たとえば、beforeEach()を使用して、各テストが実行される前に$repositoryプロパティを初期化し、ファイル内の後続のテストで利用できるようにすることができます。

1beforeEach(function () {
2 $this->userRepository = new UserRepository();
3});
4 
5it('may be created', function () {
6 $user = $this->userRepository->create();
7 
8 expect($user)->toBeInstanceOf(User::class);
9});

afterEach()

現在のファイル内のすべてのテストの後、指定されたクロージャを実行します。これにより、テスト中に変更された可能性のあるリソースや状態をクリーンアップできます。

1afterEach(function () {
2 // Clear testing data after each test run...
3});

したがって、上記の例を使用すると、beforeEach()フックを使用して$userRepositoryプロパティを初期化する場合、afterEach()フックを使用して、必要に応じて各テスト後に「クリーン」にすることができます。これにより、オブジェクトが使用している可能性のあるリソースがテスト間で解放またはリセットされ、干渉や不要な動作を防ぐことができます。

1afterEach(function () {
2 $this->userRepository->reset();
3});

オプションで、after()メソッドを使用して、特定のテスト後にクリーンアップタスクを実行できます。これは、ファイル内のすべてのテストで共有されるのではなく、単一のテストに固有のリソースをクリーンアップする必要がある場合に役立ちます。

1it('may be created', function () {
2 $this->userRepository->create();
3 
4 expect($user)->toBeInstanceOf(User::class);
5})->after(function () {
6 $this->userRepository->reset();
7});

beforeAll()

現在のファイル内でテストが実行される前に、指定されたクロージャを1回実行します。これにより、すべてのテストに適用される必要なセットアップまたは初期化を実行できます。

1beforeAll(function () {
2 // Prepare something once before any of this file's tests run...
3});

beforeEach()フックとは異なり、$this変数はbeforeAll()フックでは使用できないことに注意することが重要です。これは、フックがテストが実行される前に実行されるため、変数が参照できるテストクラスまたはオブジェクトのインスタンスがないためです。

afterAll()

現在のファイル内のすべてのテストが完了した後、指定されたクロージャを1回実行します。これにより、必要なクリーンアップまたはティアダウンタスクを実行できます。

1afterAll(function () {
2 // Clean testing data after all tests run...
3});

beforeAll()メソッドと同様に、$this変数はafterAll()フックでは使用できません。これは、afterAll()フックは通常、ファイル内のすべてのテストが完了した後に実行されるため、変数が参照できるテストインスタンスまたはオブジェクトがもうないためです。


フックを使用してテストの前提条件を設定し、クリーンアップアクションを実行する方法を習得したら、次は「データセット」について説明します。これにより、さまざまな入力またはパラメーターを使用して同じテストを実行できます。データセットを使用すると、さまざまな条件やエッジケースでコードを徹底的にテストし、すぐに明らかにならない可能性のあるバグを特定して修正できます:データセット →