この記事ではLaravelにてFactory(ファクトリ)を利用してテストで利用できるダミーデータまたは、初期データの作成の方法を解説します。
Factory(ファクトリ)とは何?
Factory(ファクトリ)と聞いてもピンとこない方や、何をするものなのか分からない方、結構いらっしゃるのではないでしょうか。
Factory(ファクトリ)とは、公式(日本語版)では色々説明が書いてありますが、要するにモデルを利用したダミーデータやテストデータを作ることができる機能です。
例えば以下のようなデータを作成できたりします。
- 在庫管理DBのとある商品レコードの名前や所持個数をランダムで作成
- ランダムなダミーレコードを1000レコードを一気に作成
- テスト用のクリーンなユーザーを作成
各種準備
早速Factory(ファクトリ)を作成していきましょう。
Model(モデル)を作成
Factory(ファクトリ)はModel(モデル)に対して作成するため、Model(モデル)がない場合は作成して下さい。
今回は以下のような定義のModel(モデル)を使用します。モデル名はFruits(フルーツ)です。
カラム名 | 型 | 説明 |
---|---|---|
id | bigint | ID |
name | varchar(255) | 名称 |
color | varchar(255) | 色 |
price | int | 価格 |
Modelとマイグレーションの作成方法
作成方法が分からない、コマンドを打つのが面倒、という方用に記載しておきます。
まずはファイル作成。
php artisan make:migration create_fruits_table
php artisan make:model Fruit
Bash次にマイグレーションファイルを以下のように修正
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('fruits', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('color');
$table->integer('price');
});
}
PHPマイグレーションを実行
php artisan migrate
BashFactory(ファクトリ)を作成
artisanコマンドのmake:factoryにて作成していきます。
php artisan make:factory Fruit
Bash以下のように表示されて、ファイルが作成されたと思います。
INFO Factory [database/factories/FruitFactory.php] created successfully.
BashFactory(ファクトリ)を修正
作成されたFactory(ファクトリ)を以下のようにします。
public function definition(): array
{
return [
'name' => 'apple',
'color' => 'red',
'price' => 100,
];
}
PHPテストを作成・修正
Factory(ファクトリ)を利用する場所としてFeatureテストを利用します。ですので、テストを作成していきます。
php artisan make:test FruitTest
Bashそして、中身を修正してFactory(ファクトリ)を利用するようにします。
public function test_example(): void
{
// Factoryにてレコード作成
Fruit::factory()->create();
// 実行結果を確認する
$fruit = Fruit::select()
->orderByDesc('id')
->first();
print_r($fruit->toArray());
}
PHPテスト実行してFactory(ファクトリ)を実行してみる
テストを実行してFactory(ファクトリ)の実行結果を見てみましょう。
php artisan test
BashArray
(
[id] => 1
[name] => apple
[color] => red
[price] => 100
[created_at] => 2023-11-15T15:10:52.000000Z
[updated_at] => 2023-11-15T15:10:52.000000Z
)
Bashちゃんとレコードが入っていますね。
テストを再度実行するとidが増えたレコードが作成されることがわかります。
ちょっと応用
しかし、これでは同じレコードが増えるだけなので、priceをランダムにして沢山生成したいと思います。
Factory(ファクトリ)を修正
priceを50から1000の間のランダムにするように修正。
public function definition(): array
{
return [
'name' => 'apple',
'color' => 'red',
'price' => mt_rand(50, 1000),
];
}
PHPテストを修正
Factory(ファクトリ)にて10件作成するように修正。
public function test_example(): void
{
// Factoryにて10件レコード作成
Fruit::factory()->count(10)->create();
// 実行結果を確認する
$fruit = Fruit::select()->get();
print_r($fruit->toArray());
}
PHP実行
php artisan make:test FruitTest
Bash以下のように10件あり、priceもランダムになっていることが確認できるかと思います。
Array
(
[0] => Array
(
[id] => 1
[name] => apple
[color] => red
[price] => 356
[created_at] => 2023-11-16T01:33:27.000000Z
[updated_at] => 2023-11-16T01:33:27.000000Z
)
[1] => Array
(
[id] => 2
[name] => apple
[color] => red
[price] => 451
[created_at] => 2023-11-16T01:33:27.000000Z
[updated_at] => 2023-11-16T01:33:27.000000Z
)
[2] => Array
(
[id] => 3
[name] => apple
[color] => red
[price] => 405
[created_at] => 2023-11-16T01:33:27.000000Z
[updated_at] => 2023-11-16T01:33:27.000000Z
)
[3] => Array
(
[id] => 4
[name] => apple
[color] => red
[price] => 856
[created_at] => 2023-11-16T01:33:27.000000Z
[updated_at] => 2023-11-16T01:33:27.000000Z
)
[4] => Array
:
:
Bashまとめ
何となく使い方はわかってきたのではないでしょうか。
Factory(ファクトリ)を利用してダミーデータを沢山作成し、テストを楽にしていきましょう。
また、今回はpriceをランダムにするのにmt_rand()を利用しましたが、個別のダミーデータを作成する専用の機能で、Fakerというものがあります。
このFakerを利用すると値や名前、色、座標など様々なものをランダムで作成できたりします。
この機能に関しては次回に解説していきます。
コメント