LaravelでFactoryを使ってテストデータを作成する方法
いつもご利用ありがとうございます。
この記事には広告が掲載されており、その広告費によって運営しています。
Laravel で Factory を使ってテストデータを作成する方法についてまとめました。
Factory とは?
Factory は、Laravel ではテストデータ(Seeder や PHP Unit)を作成するときに使う機能です。
モデルと関連し、あらかじめ Factory クラスを作っておくことで、
$user = User::factory()->make();
例えばこのように書くだけでテストデータを作成することができます。
Factory を使う方法
テーブルを作成する
今回テストデータを作成するusers
テーブルがある前提で進んでいきます。
テーブルを生成する方法について、以下の記事を参照してください。
⇨ Laravel でデータベースを作成する方法(マイグレーション)
User モデルに追記する(古いバージョンのみ)
現在のバージョンでは、デフォルトでモデル作成時に書かれています。
use Illuminate\Database\Eloquent\Factories\HasFactory;
class User extends Model
{
use HasFactory; //追記する
}
Factory ファイルを作成する
php artisan make:factory UserFactory
database/factories/UserFactory.php が生成されました。
そのファイルを編集していきます。
database/factories/UserFactory.php
Laravel 11 現在
public function definition(): array
{
return [
'name' => fake()->name(),
//略
];
}
ヘルパ関数fake()
を使って、人の名前のテストデータが入ります。
name()
のところをemail()
にしたらメールアドレスのテストデータを作ってくれたりします。
たくさんの関数が用意されているので、どんな関数があるかは公式で確認してみてください。
https://fakerphp.org/formatters/internet/
Laravel 6 のとき
use App\Models\User;
protected $model = User::class;
public function definition()
{
return [
'name' => $this->faker->name()
//略
]
}
シーダーファイルに書く
database/seeders/DatabaseSeeder.php
を編集します
namespace Database\Seeders;
use App\Models\User;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
public function run(): void
{
\App\Models\User::factory(100)->create(); //追記
}
}
テストデータの生成を実行
コマンドを打って実行します。
php artisan db:seed
users テーブルにデ ータが100件できていれば完成です。
Seeder との使い分け
Laravel には Seeder という機能があります。
Laravel でテストデータを用意する方法(Seeder の使い方)
機能として似ているので、勘違いする人もいると思います。
Factory はダミーデータの作成
テストデータを実際にデータベースに入れるなら Seeder
という使いわけになります。
テストデータとして作る予定のデータの定義を Factory に書いておいて、
- データベースにテストデータを入れるのであれば Seeder で実行する(今回の内容)
- PHP Unit によるテストの実行でテストデータを作成する時に使用できる
と使い分けることができます。
おわりに
Factory は慣れないと使うのをためらってしまう機能だと思いますが、とても便利でテストデータの作成、テストコードの実行、両方に共通したデータを作成できるようになるので、ぜひトライしてみてください。
できるだけ簡潔に敷居を下げた記事を目指してます!