この記事では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次にマイグレーションファイルを以下のように修正
    /**
     * 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 artisan migrateFactory(ファクトリ)を作成
artisanコマンドのmake:factoryにて作成していきます。
php artisan make:factory Fruit以下のように表示されて、ファイルが作成されたと思います。
   INFO  Factory [database/factories/FruitFactory.php] created successfully.  Factory(ファクトリ)を修正
作成されたFactory(ファクトリ)を以下のようにします。
    public function definition(): array
    {
        return [
            'name' => 'apple',
            'color' => 'red',
            'price' => 100,
        ];
    }テストを作成・修正
Factory(ファクトリ)を利用する場所としてFeatureテストを利用します。ですので、テストを作成していきます。
php artisan make:test FruitTestそして、中身を修正してFactory(ファクトリ)を利用するようにします。
    public function test_example(): void
    {
        // Factoryにてレコード作成
        Fruit::factory()->create();
        // 実行結果を確認する
        $fruit = Fruit::select()
            ->orderByDesc('id')
            ->first();
        print_r($fruit->toArray());
    }テスト実行してFactory(ファクトリ)を実行してみる
テストを実行してFactory(ファクトリ)の実行結果を見てみましょう。
php artisan testArray
(
    [id] => 1
    [name] => apple
    [color] => red
    [price] => 100
    [created_at] => 2023-11-15T15:10:52.000000Z
    [updated_at] => 2023-11-15T15:10:52.000000Z
)ちゃんとレコードが入っていますね。
テストを再度実行するとidが増えたレコードが作成されることがわかります。
ちょっと応用
しかし、これでは同じレコードが増えるだけなので、priceをランダムにして沢山生成したいと思います。
Factory(ファクトリ)を修正
priceを50から1000の間のランダムにするように修正。
    public function definition(): array
    {
        return [
            'name' => 'apple',
            'color' => 'red',
            'price' => mt_rand(50, 1000),
        ];
    }テストを修正
Factory(ファクトリ)にて10件作成するように修正。
    public function test_example(): void
    {
        // Factoryにて10件レコード作成
        Fruit::factory()->count(10)->create();
        // 実行結果を確認する
        $fruit = Fruit::select()->get();
        print_r($fruit->toArray());
    }実行
php artisan make:test FruitTest以下のように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
:
:まとめ
何となく使い方はわかってきたのではないでしょうか。
Factory(ファクトリ)を利用してダミーデータを沢山作成し、テストを楽にしていきましょう。
また、今回はpriceをランダムにするのにmt_rand()を利用しましたが、個別のダミーデータを作成する専用の機能で、Fakerというものがあります。
このFakerを利用すると値や名前、色、座標など様々なものをランダムで作成できたりします。
この機能に関しては次回に解説していきます。
 
  
  
  
  
コメント