はじめに

Laravelは、データベース駆動のアプリケーションをテストするための便利なツールとアサーションを提供します。さらに、Laravelのモデルファクトリとシーダーを使用すると、アプリケーションのEloquentモデルとリレーションシップを使用して、テスト用のデータベースレコードを簡単に作成できます。これらの強力な機能については、以下のドキュメントで説明します。

各テスト後のデータベースのリセット

さらに進む前に、前のテストのデータが後続のテストに干渉しないように、各テスト後にデータベースをリセットする方法について説明しましょう。Laravelに含まれるIlluminate\Foundation\Testing\RefreshDatabaseトレイトがこれを処理します。テストクラスでトレイトを使用するだけです:

  1. <?php
  2. use Illuminate\Foundation\Testing\RefreshDatabase;
  3. uses(RefreshDatabase::class);
  4. test('basic example', function () {
  5. $response = $this->get('/');
  6. // ...
  7. });
  1. <?php
  2. namespace Tests\Feature;
  3. use Illuminate\Foundation\Testing\RefreshDatabase;
  4. use Tests\TestCase;
  5. class ExampleTest extends TestCase
  6. {
  7. use RefreshDatabase;
  8. /**
  9. * A basic functional test example.
  10. */
  11. public function test_basic_example(): void
  12. {
  13. $response = $this->get('/');
  14. // ...
  15. }
  16. }
  1. データベースを完全にリセットしたい場合は、`````Illuminate\Foundation\Testing\DatabaseMigrations`````または`````Illuminate\Foundation\Testing\DatabaseTruncation`````トレイトを使用できます。ただし、これらのオプションは`````RefreshDatabase`````トレイトよりもかなり遅くなります。
  2. <a name="model-factories"></a>
  3. ## モデルファクトリ
  4. テストを行う際、テストを実行する前にデータベースにいくつかのレコードを挿入する必要があるかもしれません。このテストデータを作成する際に各カラムの値を手動で指定する代わりに、Laravelでは各[Eloquentモデル](/read/laravel-11-x/3a3cc29cc73636fb.md)に対してデフォルト属性のセットを定義することができます。[モデルファクトリ](/read/laravel-11-x/b855b4c5002193e6.md)を使用して。
  5. モデルファクトリを作成し、利用する方法について詳しくは、完全な[モデルファクトリのドキュメント](/read/laravel-11-x/b855b4c5002193e6.md)を参照してください。モデルファクトリを定義したら、テスト内でファクトリを利用してモデルを作成できます:
  6. ``````php
  7. use App\Models\User;
  8. test('models can be instantiated', function () {
  9. $user = User::factory()->create();
  10. // ...
  11. });
  12. `
  1. use App\Models\User;
  2. public function test_models_can_be_instantiated(): void
  3. {
  4. $user = User::factory()->create();
  5. // ...
  6. }

シーダーの実行

機能テスト中にデータベースシーダーを使用してデータベースを埋めたい場合は、seedメソッドを呼び出すことができます。デフォルトでは、seedメソッドはDatabaseSeederを実行し、これにより他のすべてのシーダーが実行されるはずです。あるいは、seedメソッドに特定のシーダークラス名を渡すこともできます:

  1. <?php
  2. use Database\Seeders\OrderStatusSeeder;
  3. use Database\Seeders\TransactionStatusSeeder;
  4. use Illuminate\Foundation\Testing\RefreshDatabase;
  5. uses(RefreshDatabase::class);
  6. test('orders can be created', function () {
  7. // Run the DatabaseSeeder...
  8. $this->seed();
  9. // Run a specific seeder...
  10. $this->seed(OrderStatusSeeder::class);
  11. // ...
  12. // Run an array of specific seeders...
  13. $this->seed([
  14. OrderStatusSeeder::class,
  15. TransactionStatusSeeder::class,
  16. // ...
  17. ]);
  18. });
  1. <?php
  2. namespace Tests\Feature;
  3. use Database\Seeders\OrderStatusSeeder;
  4. use Database\Seeders\TransactionStatusSeeder;
  5. use Illuminate\Foundation\Testing\RefreshDatabase;
  6. use Tests\TestCase;
  7. class ExampleTest extends TestCase
  8. {
  9. use RefreshDatabase;
  10. /**
  11. * Test creating a new order.
  12. */
  13. public function test_orders_can_be_created(): void
  14. {
  15. // Run the DatabaseSeeder...
  16. $this->seed();
  17. // Run a specific seeder...
  18. $this->seed(OrderStatusSeeder::class);
  19. // ...
  20. // Run an array of specific seeders...
  21. $this->seed([
  22. OrderStatusSeeder::class,
  23. TransactionStatusSeeder::class,
  24. // ...
  25. ]);
  26. }
  27. }

また、LaravelにRefreshDatabaseトレイトを使用する各テストの前にデータベースを自動的にシードするよう指示することもできます。これを実現するには、基本テストクラスに$seedプロパティを定義します:

  1. <?php
  2. namespace Tests;
  3. use Illuminate\Foundation\Testing\TestCase as BaseTestCase;
  4. abstract class TestCase extends BaseTestCase
  5. {
  6. /**
  7. * Indicates whether the default seeder should run before each test.
  8. *
  9. * @var bool
  10. */
  11. protected $seed = true;
  12. }
  1. ``````php
  2. use Database\Seeders\OrderStatusSeeder;
  3. /**
  4. * Run a specific seeder before each test.
  5. *
  6. * @var string
  7. */
  8. protected $seeder = OrderStatusSeeder::class;
  9. `

利用可能なアサーション

Laravelは、PestまたはPHPUnitの機能テスト用にいくつかのデータベースアサーションを提供します。これらのアサーションについては、以下で説明します。

assertDatabaseCount

データベース内のテーブルが指定された数のレコードを含むことを確認します:

  1. $this->assertDatabaseCount('users', 5);

assertDatabaseHas

データベース内のテーブルが指定されたキー/値のクエリ制約に一致するレコードを含むことを確認します:

  1. $this->assertDatabaseHas('users', [
  2. 'email' => '',
  3. ]);

assertDatabaseMissing

データベース内のテーブルが指定されたキー/値のクエリ制約に一致するレコードを含まないことを確認します:

  1. $this->assertDatabaseMissing('users', [
  2. 'email' => '',
  3. ]);

assertSoftDeleted

  1. ``````php
  2. $this->assertSoftDeleted($user);
  3. `

assertNotSoftDeleted

  1. ``````php
  2. $this->assertNotSoftDeleted($user);
  3. `

assertModelExists

指定されたモデルがデータベースに存在することを確認します:

  1. use App\Models\User;
  2. $user = User::factory()->create();
  3. $this->assertModelExists($user);

assertModelMissing

指定されたモデルがデータベースに存在しないことを確認します:

  1. use App\Models\User;
  2. $user = User::factory()->create();
  3. $user->delete();
  4. $this->assertModelMissing($user);

expectsDatabaseQueryCount

  1. ``````php
  2. $this->expectsDatabaseQueryCount(5);
  3. // Test...
  4. `