はじめに
Laravelは、データベース駆動のアプリケーションをテストするための便利なツールとアサーションを提供します。さらに、Laravelのモデルファクトリとシーダーを使用すると、アプリケーションのEloquentモデルとリレーションシップを使用して、テスト用のデータベースレコードを簡単に作成できます。これらの強力な機能については、以下のドキュメントで説明します。
各テスト後のデータベースのリセット
さらに進む前に、前のテストのデータが後続のテストに干渉しないように、各テスト後にデータベースをリセットする方法について説明しましょう。Laravelに含まれるIlluminate\Foundation\Testing\RefreshDatabase
トレイトがこれを処理します。テストクラスでトレイトを使用するだけです:
<?php
use Illuminate\Foundation\Testing\RefreshDatabase;
uses(RefreshDatabase::class);
test('basic example', function () {
$response = $this->get('/');
// ...
});
<?php
namespace Tests\Feature;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
class ExampleTest extends TestCase
{
use RefreshDatabase;
/**
* A basic functional test example.
*/
public function test_basic_example(): void
{
$response = $this->get('/');
// ...
}
}
データベースを完全にリセットしたい場合は、`````Illuminate\Foundation\Testing\DatabaseMigrations`````または`````Illuminate\Foundation\Testing\DatabaseTruncation`````トレイトを使用できます。ただし、これらのオプションは`````RefreshDatabase`````トレイトよりもかなり遅くなります。
<a name="model-factories"></a>
## モデルファクトリ
テストを行う際、テストを実行する前にデータベースにいくつかのレコードを挿入する必要があるかもしれません。このテストデータを作成する際に各カラムの値を手動で指定する代わりに、Laravelでは各[Eloquentモデル](/read/laravel-11-x/3a3cc29cc73636fb.md)に対してデフォルト属性のセットを定義することができます。[モデルファクトリ](/read/laravel-11-x/b855b4c5002193e6.md)を使用して。
モデルファクトリを作成し、利用する方法について詳しくは、完全な[モデルファクトリのドキュメント](/read/laravel-11-x/b855b4c5002193e6.md)を参照してください。モデルファクトリを定義したら、テスト内でファクトリを利用してモデルを作成できます:
``````php
use App\Models\User;
test('models can be instantiated', function () {
$user = User::factory()->create();
// ...
});
`
use App\Models\User;
public function test_models_can_be_instantiated(): void
{
$user = User::factory()->create();
// ...
}
シーダーの実行
機能テスト中にデータベースシーダーを使用してデータベースを埋めたい場合は、seed
メソッドを呼び出すことができます。デフォルトでは、seed
メソッドはDatabaseSeeder
を実行し、これにより他のすべてのシーダーが実行されるはずです。あるいは、seed
メソッドに特定のシーダークラス名を渡すこともできます:
<?php
use Database\Seeders\OrderStatusSeeder;
use Database\Seeders\TransactionStatusSeeder;
use Illuminate\Foundation\Testing\RefreshDatabase;
uses(RefreshDatabase::class);
test('orders can be created', function () {
// Run the DatabaseSeeder...
$this->seed();
// Run a specific seeder...
$this->seed(OrderStatusSeeder::class);
// ...
// Run an array of specific seeders...
$this->seed([
OrderStatusSeeder::class,
TransactionStatusSeeder::class,
// ...
]);
});
<?php
namespace Tests\Feature;
use Database\Seeders\OrderStatusSeeder;
use Database\Seeders\TransactionStatusSeeder;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
class ExampleTest extends TestCase
{
use RefreshDatabase;
/**
* Test creating a new order.
*/
public function test_orders_can_be_created(): void
{
// Run the DatabaseSeeder...
$this->seed();
// Run a specific seeder...
$this->seed(OrderStatusSeeder::class);
// ...
// Run an array of specific seeders...
$this->seed([
OrderStatusSeeder::class,
TransactionStatusSeeder::class,
// ...
]);
}
}
また、LaravelにRefreshDatabase
トレイトを使用する各テストの前にデータベースを自動的にシードするよう指示することもできます。これを実現するには、基本テストクラスに$seed
プロパティを定義します:
<?php
namespace Tests;
use Illuminate\Foundation\Testing\TestCase as BaseTestCase;
abstract class TestCase extends BaseTestCase
{
/**
* Indicates whether the default seeder should run before each test.
*
* @var bool
*/
protected $seed = true;
}
``````php
use Database\Seeders\OrderStatusSeeder;
/**
* Run a specific seeder before each test.
*
* @var string
*/
protected $seeder = OrderStatusSeeder::class;
`
利用可能なアサーション
Laravelは、PestまたはPHPUnitの機能テスト用にいくつかのデータベースアサーションを提供します。これらのアサーションについては、以下で説明します。
assertDatabaseCount
データベース内のテーブルが指定された数のレコードを含むことを確認します:
$this->assertDatabaseCount('users', 5);
assertDatabaseHas
データベース内のテーブルが指定されたキー/値のクエリ制約に一致するレコードを含むことを確認します:
$this->assertDatabaseHas('users', [
'email' => '',
]);
assertDatabaseMissing
データベース内のテーブルが指定されたキー/値のクエリ制約に一致するレコードを含まないことを確認します:
$this->assertDatabaseMissing('users', [
'email' => '',
]);
assertSoftDeleted
``````php
$this->assertSoftDeleted($user);
`
assertNotSoftDeleted
``````php
$this->assertNotSoftDeleted($user);
`
assertModelExists
指定されたモデルがデータベースに存在することを確認します:
use App\Models\User;
$user = User::factory()->create();
$this->assertModelExists($user);
assertModelMissing
指定されたモデルがデータベースに存在しないことを確認します:
use App\Models\User;
$user = User::factory()->create();
$user->delete();
$this->assertModelMissing($user);
expectsDatabaseQueryCount
``````php
$this->expectsDatabaseQueryCount(5);
// Test...
`