ウェブ開発にはテストが不可欠です。Laravelのモデルとファクトリを使って、予測可能かつ複製可能な方法で、簡単にデータベースのレコードを定義できます。これにより、アプリのテストに一貫性がもたらされます。モデルとファクトリを活用することで、Eloquentモデルごとにデフォルトの属性を定義可能です。

例えば、ブログアプリ開発の場合を考えてみましょう。作者やモデレーターがコメントを承認/非承認できる仕組みをデプロイする前に、その機能が正しく動作するかテストする必要があります。その際には、テスト(ダミー)データが欠かせません。

上記のブログアプリの例で言えば、アプリケーションの機能を模倣してテストするためのコメントデータが求められます。Laravelでは、ファクトリとFakerを使ってテストデータを生成することで、実際のユーザーからコメントを取得することなくテストを行うことができます。

今回の記事では、実際のユーザーにコメントの投稿を求めることなく、コメントデータを自動で生成する方法をご説明します。

前提条件

この説明の前提知識として、以下を理解している必要があります。

  • XAMPP
  • Composer

XAMPPは無料で簡単にインストールできるApacheディストリビューションで、PHP、Perl、MariaDB(MySQLデータベース)がセットになっています。この記事では最新版の8.1.10を使用し、PHP 8.1.10をインストールします。MacOSでXAMPPをインストールする場合はこちらの記事を、Linuxの場合はこちらの記事をお読みください。この説明では、WindowsのXAMPPを使用します。

Composerは、ウェブアプリの開発や運用で依存するパッケージを定義、インストール、ダウンロードできるツールです。この説明では、バージョンv2.4.4のComposerを使用しており、PHPバージョン7.2+が必要です。ここでは、Composerを使ってLaravelインストーラをインストールします。

また、プロジェクトのコード一式をこちらからダウンロードして利用することもできます。

プロジェクトのセットアップ方法

このセクションでは、Laravelプロジェクトを作成しデータベースに接続します。そのために必要なことと、その方法について見ていきましょう。

Laravelインストーラをインストールする

Laravelプロジェクト作成のために、Laravelインストーラを入手します。

composer global require laravel/installer

このコードにより、Laravelインストーラをグローバルにインストールできます。

Laravelプロジェクトを作成する

次に、以下を実行してLaravelプロジェクトを作成します。

laravel new app-name

このコードにより、Laravelプロジェクトをブートストラップしてすべての依存関係をインストールできます。

Laravelプロジェクトの作成
Laravelプロジェクトの作成

Laravelをインストールするもう1つの簡単な方法として、Composerを使用することもできます。

composer create-project laravel/laravel app-name

上記の方法を使うと、Laravelインストーラを使用する必要はありません。

アプリの起動

ディレクトリをapp-nameに変更し、Laravel独自のコマンドラインインターフェース(CLI)ツール、Artisanを使ってプロジェクトを開始します。

php artisan serve

このコードでプロジェクトを開始し、localhost:8000(またはポート8000が使用中であれば他の利用可能なポート)に接続します。localhost:8000では、次のように表示されます。

Laravel
Laravel

データベースの作成

アプリをデータベースに接続するには、XAMPPのPHPMyAdminグラフィカルユーザーインターフェースを使用してデータベースを作成する必要があります。「localhost/phpmyadmin」に移動し、サイドバーの「New」をクリックします。

データベースの作成フォーム
データベースの作成フォーム

上の図は、データベース名として「app_name」を指定した「Create Database」フォームです。

Create」をクリックしてデータベースを作成します。

.envファイルの編集

アプリをデータベースに接続するには、.envファイルのDB部分を編集します。

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=app_name
DB_USERNAME=root
DB_PASSWORD=

このコードでは、データベースの認証情報にデータベース名、ユーザー名、ポート、パスワード、ホストを入力しています。これでファクトリとモデルの作成を始める準備ができました。

補足)値はデータベースの実際の認証情報に置き換えてください。また、「Access denied for user」というエラーが発生した場合は、DB_USERNAMEDB_PASSWORDの値をダブルクォート(二重引用符)で囲んでください。

ダミーデータを生成する方法

アプリを作成し、データベースに接続したら、次はデータベースにダミーデータを生成するために必要なファイルを作成します。

コメントモデルの作成

データベースのテーブルとやり取りするためのモデルファイルを作成します。モデルを作成するには、Artisanを使用します。

php artisan make:model Comment

このコードにより、app/Modelsフォルダ内に定型コードを伴うかたちでComment.phpファイルが作成されます。use HasFactory;の下に以下のコードを追加してください。

 protected $fillable = [
      'name',
      'email',
      'body',
      'approved',
      'likes'
    ];

Laravelはデフォルトで大量割り当てからデータベースを保護する仕様です。そこで、このコードで大量割り当てを許可したいフィールドを指定します。Commentモデルファイルの中身は、結果的にこのようになります。

コメントモデルファイル
コメントモデルファイル

マイグレーションファイルの作成

モデルファイルを作成し、$fillableの配列を宣言した後には、以下のコマンドを使用してマイグレーションファイルを作成します。

php artisan make:migration create_comments_table

)Laravelでマイグレーションを作成する際の命名規則には、通常snake_caseunderscore_caseとも)が採用されています。最初の単語はアクション、2番目の単語はモデルの複数形、最後の単語はプロジェクト内で作成される機能です。つまり、Bookモデルのマイグレーションを作成するときは、create_books_tableと書くことになります。

このコードにより、database/migrationsフォルダ内にyyyy_mm_dd_hhhmmss_create_comments_tableという名前のファイルが作成されます。

次に、yyyy_mm_dd_hhmmss_create_comments_table内のup関数を編集します。

public function up()
    {
  Schema::create('comments', function (Blueprint $table) {
    $table->id();
    $table->string('name');
    $table->string('email');
    $table->longText('body');
    $table->boolean('approved');
    $table->integer('likes')->default(0);
    $table->timestamps();
    });
    }

このコードにより、 idnameemailbodyapprovedlikestimestampsというカラムを持つテーブルが(スキーマ作成を経て)生成されます。

マイグレーションの実行

マイグレーションファイルの作成と編集を行っても、コマンドラインを使って実際に実行するまでは何も起こりません。データベースマネージャを見ると、まだ空っぽであることがわかります。

そこで、Artisanを使用してマイグレーションを実行します。

php artisan migrate

このコマンドは、アプリを作成してから最初のマイグレーションとなるので、database/migrations内ですべてのマイグレーションを実行します。

マイグレーション成功
マイグレーション成功

次の画像は、実行したすべてのマイグレーションファイルを示しています。それぞれがデータベースのテーブルを表しています。

マイグレーション後のデータベース
マイグレーション後のデータベース

CommentFactoryファイルの作成

定義関数を含むファクトリファイルを作成します。このデモでは、Artisanを使用してファクトリを作ります。

php artisan make:factory CommentFactory.php

このコードにより、database/factoriesフォルダ内にCommentFactory.phpファイルが作成されます。

Definition関数

CommentFactory内の関数で、Fakerがどのようにダミーデータを生成するかを定義します。以下のように編集してください。

public function definition()
  {
   return [
     'name' => $this->faker->name(),
     'email' => $this->faker->email(),
     'body' => $this->faker->sentence(45),
     'approved' => $this->faker->boolean(),
     'likes' => $this->faker->randomNumber(5)
     ];
    }

このコードはFakerに次のように生成するよう指示します。

  • 名前
  • メールアドレス
  • 45の文章を含む段落
  • 真か偽しかありえない承認値
  • 0から9999の間の乱数

CommentモデルをCommentFactoryに接続する

定義の前でprotectedの$model変数を宣言することで、CommentモデルをCommentFactoryに接続します。

protected $model = Comment::class;

また、use App\Models\Comment;をファイルの依存関係に追加します。CommentFactoryファイルは以下のようになります。

CommentFactoryファイル
CommentFactoryファイル

データベースにシーダーを使ってデータを入力する

プログラミングにおけるシード(シーディング)とは、テストのためにデータベースにランダムなダミーデータを挿入することを意味します。

モデルを作成し、マイグレーションを実行し、CommentFactory内部で定義を作成したので、DatabaseSeederファイルを使ってシーダーを実行します。

CommentSeederファイルの作成

ファクトリを使用してデータを生成するseederファイルを作成します。

php artisan make:seeder CommentSeeder.php

このコードにより、database/seedersフォルダ内にCommentSeeder.phpファイルが作成されます。

Run関数の編集

CommentモデルをCommentSeederに接続します。run関数内に以下のコードを追加してください。

Comment::factory()->count(50)->create();

このコードにより、CommentSeederにCommentモデルとCommentFactoryの定義関数を使用してデータベース内に50個のコメントを生成するように指示が出されます。また、ファイルの依存関係にuse App\Models\Comment;を追加します。これでCommentSeederファイルは次のようになります。

CommentSeederファイル
CommentSeederファイル

補足)ローカルデータを作成するようにFakerを設定することができます。たとえば、app/config.phpファイルでfaker_localeit_ITに設定することで、ランダムな名前ではなくイタリア語の名前を生成するように設定できます。 Fakerのロケールについては、こちらのページを参照してください。

シーダーを実行する

次に、Artisanでseederファイルを実行します。

php artisan db:seed --class=CommentSeeder

すると、seederファイルが実行され、データベースに50行のダミーデータが生成されます。

データベースのシーディングが完了
データベースのシーディングが完了

これでデータベースで、アプリケーションの関数をテストするのに使える50行のダミーデータが確認できるはずです。

データベースに50行のデータがあることがわかる
データベースに50行のデータがあることがわかる

データベースをリセットする方法

生成したデータをテストに使う場合、テストを実行するたびにデータベースをリセットするようにしてください。例えば、コメント承認機能をテストしたいとします。テストのたびにデータベースを再読み込みして、以前に生成したデータが今後のテストに干渉しないようにしましょう。

RefreshDatabaseの使用

testファイル内でRefreshDatabaseを使用してデータベースをリセットします。

tests/Featureフォルダ内のExampleTest.phpをコメントuse Illuminate\Foundation\Testing\RefreshDatabase;に移動し、test_the_application_returns_a_successful_response関数の上に以下のコードを追加します。

use RefreshDatabase;

ExampleTest.phpファイルは次のようになります。

ExampleTestファイル
ExampleTestファイル

テストの実行

テストファイルにRefreshDatabaseを追加したら、Artisanを使用してテストを実行します。

php artisan test

このコードにより、アプリ内のすべてのテストが実行され、以下の画像にあるように、テスト後にはデータベースがリセットされます。

Artisanテストが成功
Artisanテストが成功

次にデータベースをチェックして空のコメントテーブルを確認します。

空のコメントデータベース
空のコメントデータベース

まとめ

この記事では、Laravelプロジェクトの作成方法、データベースへの接続方法、データベース用のランダムデータを生成するためのモデル、マイグレーション、ファクトリ、シーダーファイルの作成と設定方法についてご説明しました。また、テスト実行後にデータベースをリセットする方法にも触れました。

LaravelのファクトリとFakerを使用することで、アプリケーションのテストやプレースホルダとして、最小限の構成で、そして数分で、任意の量のテスト(ダミー)データを簡単に生成できることがお分かりいただけたと思います。

Laravelアプリをデプロイする準備ができたら、Kinstaのアプリケーションホスティングサービスで素早く効率的なデプロイをお試しください。

Steve Bonisteel Kinsta

Kinstaのテクニカルエディター。救急車や消防車を追いかける記者としてキャリアをスタート。1990年代後半からインターネット関連の技術情報を担当している。