ホーム > Laravel > LaravelでFactoryを使ってテストデータを作成する方法
Laravel

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 に書いておいて、

  1. データベースにテストデータを入れるのであれば Seeder で実行する(今回の内容)
  2. PHP Unit によるテストの実行でテストデータを作成する時に使用できる

と使い分けることができます。

おわりに

Factory は慣れないと使うのをためらってしまう機能だと思いますが、とても便利でテストデータの作成、テストコードの実行、両方に共通したデータを作成できるようになるので、ぜひトライしてみてください。

できるだけ簡潔に敷居を下げた記事を目指してます!

フィードバックのお願い
この記事のフィードバックがありましたらYoutubeの適当な動画にコメントしていただいたり、お問い合わせからご連絡ください。