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を使って、テストデータを作成してみ下さい。