データベーステスト
はじめに
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\RefreshDatabase
トレイトは、スキーマが最新である場合にデータベースをマイグレートしません。代わりに、データベーストランザクション内でテストを実行します。したがって、このトレイトを使用しないテストケースでデータベースに追加されたレコードはまだ存在する可能性があります。
データベースを完全にリセットしたい場合は、Illuminate\Foundation\Testing\DatabaseMigrations
または Illuminate\Foundation\Testing\DatabaseTruncation
トレイトを代わりに使用できます。ただし、これらのオプションは RefreshDatabase
トレイトよりもかなり遅くなります。
モデルファクトリ
テスト時に、テストを実行する前にデータベースにいくつかのレコードを挿入する必要がある場合があります。このテストデータを作成する際に各列の値を手動で指定する代わりに、Laravel では、モデルファクトリを使用して、各 Eloquent モデル のデフォルト属性セットを定義できます。
モデルファクトリを作成して利用する方法について詳しく学ぶには、完全なmodel factory documentationを参照してください。モデルファクトリを定義したら、テスト内でモデルを作成するためにファクトリを利用できます:
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();
// ...
}