Laravel8のFactoryを使ってテストデータを作成する方法

Laravel8のFactoryを使ってテストデータを作成する方法を解説します。
Laravel8になって、Factoryの書き方が少し変わったので、そちらの紹介をしていきます。

細かい解説については、公式サイトの方で紹介されております。
是非確認してみてください。

データベースのテスト Laravel8

しかし、公式サイトは、Laravelへの(Factory・Seederへの)理解が十分であれば、サラッと理解できるかもしれません。
経験がまだ浅い方(私のように)には少しとっつき辛い部分もあると思います。

ざっくりとした、概要から解説していきたいと思います。

LaravelのFactoryとは何か

まず、Factoryとは何か。簡単に言うと、Laravelのデータベーステストにおいて、簡単に、そして大量にデータベースにデータを登録するための機能です。
Seederという機能はご存知でしょうか。
こちらも、データベースにテストデータを登録していく機能です。

Seederを単体で使う場合には、データを1つづつ自前で 記述していく必要があります。そこで、Factoryという機能をSeederと一緒に使うことによって、自前で記述しないで、Factoryに一定の指示をした通りに、ランダムなデータを大量に作成してくれます。

あまり理解できない人がいるでしょうか。

Seeder:登録したいデータを、そのまんま記述します。

user_id = 1 / name="taro" / email="taro@gmail.com"
user_id = 2 / name="jiro" / email="jiro@gmail.com"
user_id = 3 / name="saburo" / email="saburo@gmail.com"

Factory :必要な要素だけ指定して、ランダムにデータを作成

user_id = int型 / name = string型 / email = string型@gmail.com
3件データを作成

みたいな感じで、指定するとランダムでデータを作成してくれます。

Laravel8でのFactoryを活用したテストデータの作成方法を解説

まずは、ざっくりとした流れを解説していきます。

1; Factoryでデータ定義を作る
2:seederでファクトリーを設定
3: DatabaseSeeder で seeder callする
4: php artisan db:seed

1:Factoryでデータ定義を作る

Factoryですることは、作成するデータの定義を設定することです。
どんなカラムが存在しており、カラムのデータ型は何か、どんな値を設定したいのか(例えば、10桁のランダム文字列 など)などを指定していきます。

Factoryを設定するためには、Factoryファイルを作成する必要があります。
コマンドでファイルを作成していきます。

ChatMessageに利用するデータをFactoryを活用して作成していきます。
Modelは ChatMessage です。

 php artisan make:factory ChatMessageFactory 

これで、ChatMessageFactory のファイルが作成されます。

Laravel8での変更点としては、まずはこのデFactoryファイルでのデータ定義部分が変更されています。

public function definition(){}の中にデータの定義を記載していきます。

public function definition()
{
    return [
        'chat_room_id' => $this->faker->numberBetween($min = 1, $max = 10),
        'user_id' => $this->faker->randomDigit,
        'message' => Str::random(10),
        'created_at' => date('Y-m-d H:i:s'),
        'updated_at' => date('Y-m-d H:i:s'),
    ];
} 

chat_room_id、user_id、message、created_at、updated_atはデータベースのカラムの名称です。

これらのカラムに対して、fakerというものを使って、データの定義を決定していきます。

$this->faker->numberBetween($min = 1, $max = 10),

最低数が1、最大数が10の整数値 を作ってという指示です。

$this->faker->randomDigit,

ランダムの整数値 を作ってという指示です。

'message' => Str::random(10),

ランダムの10桁の文字列を作って、という指示です。

date('Y-m-d H:i:s'),

時刻表示の定義に合わせて、時間のデータを作って、という指示です。

こんな感じで、Factoryファイルでは、データの定義を記述していきます。

データの定義についたは、下記にて様々なデータ定義方法が記述されているので、自分のデータベースのカラムにあった指定をしてみてください。

https://github.com/fzaninotto/Faker

2:seederでファクトリーを設定

次にSeederで、Factoryを設定していきます。

ここも、Laravel8で記述方法が変わった部分かと思います。

まずは、Seederのファイルをコマンドで作成していきます。

 php artisan make:seed ChatMessageTableSeeder 

こちらのコマンドで、 ChatMessageTableSeeder ファイルが作成されます。

ChatMessageTableSeeder の全体を記述しておきます。
ここでのポイントは
ポイント①;eloquentを呼び出す
ポイント②:eloquentからfactoryを呼び出して、データ作成個数を設定する

下記が ChatMessageTableSeeder の全体です。

 <?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;

// ChatMessage を呼び出し
use App\Models\ChatMessage;

class ChatMessageTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        ChatMessage::factory()->count(3)->create();
    }
}

 

->count(3) このメソッドで、作成するデータの個数を指定します。

3: DatabaseSeeder で seeder callする

ここまで、きたら後はすんなりいくと思います。

デフォルトである、DatabaseSeeder ファイルに対して、 ChatMessageTableSeeder を呼び出します。

記述方法は、public function run()メソッドの中でcallします。

     public function run()
    {
        $this->call(ChatMessageTableSeeder::class);
    } 

4: php artisan db:seed

最後に、php artisan db:seed をしてください。
これで、データベースを確認してください。
Factoryで指定したテストデータが作成されているかと思います。

以上です。
Laravel8で、変更された部分があるので、解説していきました。
是非、Factoryを使って、テストデータを作成してみ下さい。