Webアプリ開発をするときは、実際の画面表示やデータ処理の動きなどを確認するためにテストデータを作成する必要があります。
テストデータは手作業で入力していっても問題ありませんが、それではあまりに非効率です。
そこで今回は、Laravel11で
シーダとファクトリを用いて
テストデータを自動で一括作成する方法
をご紹介します。
- Laravel11でテストデータを自動で一括作成する方法
- シーダとファクトリとは?
シーダとファクトリを活用するといつでも簡単にテストデータの登作成できるようになるため、効率的なアプリ開発が可能になります!
おすすめ記事
シーダとファクトリ
Laravelにはテストデータを自動作成する仕組みとして「シーダ」と「ファクトリ」の2つが用意されています。
まずは、これら2つについて簡単に解説をします。
シーダ(Seeder)とは?
シーダ(Seeder)とは、英語で「種をまく人」という意味です。
文字通りデータベースに種(テストデータ)をまくというイメージです。
シーダーを用意することで、コマンドを打つだけでテストデータを簡単に追加可能です。
ファクトリ(Factory)とは?
ファクトリ(Factory)は、データベースにテストデータを追加する際、各カラムのデフォルト値を自動設定するための仕組みです。
前節でご紹介したシーダと組み合わせることで、下記のような実装ができます。
- シーダ → モデルインスタンスを生成 + データベースへ追加
- ファクトリ → シーダーで生成されたモデルインスタンスにデフォルト値を設定
【手順】シーダとファクトリでテストデータを一括作成する
本章では、シーダとファクトリを利用して、実際に複数のテストデータを一括作成する手順を解説します。
大まかな手順は以下のとおりです!
なお、解説をするにあたっては、以下のテーブル構造を持ったTODOアプリを例に用います。
(例)TODOアプリのテーブル構造
カラム名 | 説明 |
---|---|
title | タスクのタイトル |
status | タスクの状態(1: 未着手、2:着手中、3:完了) |
due_date | タスクの期限 |
STEP1 ファクトリを作成する
以下のコマンドでファクトリを作成します。
php make:factory TaskFactory
続いて、生成されたTaskFactory.php
のdefinition()
メソッドを以下のように編集します。
use Carbon\Carbon;
use Illuminate\Support\Str;
public function definition(): array
{
return [
'title' => Str::random(20), // タスクタイトル
'status' => 1, // タスクの状態
'due_date' => Carbon::now(), // 期限日
];
}
ポイントは、テーブルの各カラムに対して、以下のようにデフォルト値を設定している点です。
- title …… Strファサードの
random()
メソッドで「20文字のランダムな文字列」を生成 - status …… 固定値「1」=「未着手」を指定
- due_date …… Carbonライブラリを使用して「今日の日付」を生成
STEP2 シーダを作成する
以下のコマンドでシーダを作成します。
php make:seeder TaskSeeder
続いて、生成されたTaskSeeder.php
のrun()
メソッドを編集します。
use App\Models\Task;
public function run(): void
{
// テストデータを「10件」作成する
Task::factory()->count(10)->create();
}
ここで重要になってくるのが、先ほど作成したファクトリファイル名が「モデル名+Factory」の形式になっていることです。
これにより、TaskモデルとTaskFactoryファクトリがLaravelによって自動的に紐づけされます。
逆に、ファクトリ名が「モデル名+Factory」の形式になっていない場合、モデルに対応するファクトリをLaravelが見つけだせず、Task::factory()
が上手く実行できなくなります。
STEP3 モデルを修正する
テストデータを自動作成する最後の準備として、モデルファイルに以下の2行を追加します。
※場合によってはすでに自動的に追加されているかもしれません。
use Illuminate\Database\Eloquent\Factories\HasFactory;
class Task extends Model
{
use HasFactory; // 追加
// ~ 省略 ~
}
ここまでの手順で、テストデータを一括作成する準備が整いました!
STEP4 シーダを実行する
以下のコマンドを実行することで、指定したシーダが実行され、「STEP1 ファクトリを作成する」で設定したデフォルト値がテストデータとしてデータベースへ自動追加されます。
php artisan db:seed --class=TaskSeeder
実行結果
なお、作成済みの複数のシーダを一括実行したい場合は、「–class」オプションを除外します。
php artisan db:seed
【補足】任意のモデルとファクトリを紐づける
「STEP2 シーダを作成する」でお伝えしたように、ファクトリファイル名を「モデル名+Factory」の形式にしなかった場合、Laravelが「どのモデルとどのファクトリが対応しているか」を判断できず、自動的な紐づけが行われません。
もしも任意のモデルとファクトリを紐づけたい場合は、以下のように手動でモデルファイルとファクトリファイルを編集する必要があります。
※以下は、SampleモデルとSampleTableFactoryファクトリを手動で紐づける例です。
Sample.php(モデル)
use Database\Factories\Administration\SampleTableFactory;
/**
* モデルの新ファクトリ・インスタンスの生成
*/
protected static function newFactory()
{
return SampleTableFactory::new();
}
SampleTableFactory.php(ファクトリ)
use App\Administration\Sample;
use Illuminate\Database\Eloquent\Factories\Factory;
class SampleFactory extends Factory
{
/**
* このファクトリに対応するモデル名
*/
protected $model = Sample::class;
}
まとめ
以上が、シーダとファクトリを使用して複数のテストデータを一括作成する方法でした。
Webアプリ開発をするときは、テストデータを作成することで動作確認などを行います。
そんなとき、テストデータをひとつひとつ手動で登録するのではなく、できるだけ効率的な方法を選択できると開発がはかどります。
Laravelにはそのための仕組みであるシーダとファクトリが用意されているため、これまで手動でテストデータを追加していたという方は、ぜひこれを機に活用してみて下さい。
この記事が少しでも参考になったなら何よりです!
当ブログではPHPやLaravel、WordPressなどの情報を発信しています。
ご興味のある方はほかの記事もご覧いただけるとうれしいです!
それでは、最後までご覧いただきありがとうございました。
コメント