[Laravel]Factory(ファクトリ)を使ってテストデータを作る

Laravel Laravel

この記事ではLaravelにてFactory(ファクトリ)を利用してテストで利用できるダミーデータまたは、初期データの作成の方法を解説します。

Factory(ファクトリ)とは何?

Factory(ファクトリ)と聞いてもピンとこない方や、何をするものなのか分からない方、結構いらっしゃるのではないでしょうか。

Factory(ファクトリ)とは、公式日本語版)では色々説明が書いてありますが、要するにモデルを利用したダミーデータやテストデータを作ることができる機能です。

例えば以下のようなデータを作成できたりします。

  • 在庫管理DBのとある商品レコードの名前や所持個数をランダムで作成
  • ランダムなダミーレコードを1000レコードを一気に作成
  • テスト用のクリーンなユーザーを作成

各種準備

早速Factory(ファクトリ)を作成していきましょう。

Model(モデル)を作成

Factory(ファクトリ)はModel(モデル)に対して作成するため、Model(モデル)がない場合は作成して下さい。

今回は以下のような定義のModel(モデル)を使用します。モデル名はFruits(フルーツ)です。

カラム名説明
idbigintID
namevarchar(255)名称
colorvarchar(255)
priceint価格
Modelとマイグレーションの作成方法

作成方法が分からない、コマンドを打つのが面倒、という方用に記載しておきます。

まずはファイル作成。

php artisan make:migration create_fruits_table
php artisan make:model Fruit
Bash

次にマイグレーションファイルを以下のように修正

database/migrations/20xx_xx_xx_xxxxxx_create_fruits_table.php
    /**
     * 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
Bash

Factory(ファクトリ)を作成

artisanコマンドのmake:factoryにて作成していきます。

php artisan make:factory Fruit
Bash

以下のように表示されて、ファイルが作成されたと思います。

   INFO  Factory [database/factories/FruitFactory.php] created successfully.  
Bash

Factory(ファクトリ)を修正

作成されたFactory(ファクトリ)を以下のようにします。

database/factories/FruitFactory.php
    public function definition(): array
    {
        return [
            'name' => 'apple',
            'color' => 'red',
            'price' => 100,
        ];
    }
PHP

テストを作成・修正

Factory(ファクトリ)を利用する場所としてFeatureテストを利用します。ですので、テストを作成していきます。

php artisan make:test FruitTest
Bash

そして、中身を修正してFactory(ファクトリ)を利用するようにします。

tests/Feature/FruitTest.php
    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
Bash
Array
(
    [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の間のランダムにするように修正。

database/factories/FruitFactory.php
    public function definition(): array
    {
        return [
            'name' => 'apple',
            'color' => 'red',
            'price' => mt_rand(50, 1000),
        ];
    }
PHP

テストを修正

Factory(ファクトリ)にて10件作成するように修正。

tests/Feature/FruitTest.php
    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を利用すると値や名前、色、座標など様々なものをランダムで作成できたりします。

この機能に関しては次回に解説していきます。

Follow me!

コメント

PAGE TOP
タイトルとURLをコピーしました