ウェブ開発にはテストが不可欠です。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をインストールするもう1つの簡単な方法として、Composerを使用することもできます。
composer create-project laravel/laravel app-name
上記の方法を使うと、Laravelインストーラを使用する必要はありません。
アプリの起動
ディレクトリをapp-nameに変更し、Laravel独自のコマンドラインインターフェース(CLI)ツール、Artisanを使ってプロジェクトを開始します。
php artisan serve
このコードでプロジェクトを開始し、localhost:8000(またはポート8000が使用中であれば他の利用可能なポート)に接続します。localhost:8000では、次のように表示されます。
データベースの作成
アプリをデータベースに接続するには、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_USERNAME
とDB_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_case
(underscore_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();
});
}
このコードにより、 id
、name
、email
、body
、approved
、likes
、timestamps
というカラムを持つテーブルが(スキーマ作成を経て)生成されます。
マイグレーションの実行
マイグレーションファイルの作成と編集を行っても、コマンドラインを使って実際に実行するまでは何も起こりません。データベースマネージャを見ると、まだ空っぽであることがわかります。
そこで、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内部で定義を作成したので、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ファイルは次のようになります。
補足)ローカルデータを作成するようにFakerを設定することができます。たとえば、app/config.phpファイルでfaker_locale
をit_IT
に設定することで、ランダムな名前ではなくイタリア語の名前を生成するように設定できます。 Fakerのロケールについては、こちらのページを参照してください。
シーダーを実行する
次に、Artisanでseederファイルを実行します。
php artisan db:seed --class=CommentSeeder
すると、seederファイルが実行され、データベースに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ファイルは次のようになります。
テストの実行
テストファイルにRefreshDatabase
を追加したら、Artisanを使用してテストを実行します。
php artisan test
このコードにより、アプリ内のすべてのテストが実行され、以下の画像にあるように、テスト後にはデータベースがリセットされます。
次にデータベースをチェックして空のコメントテーブルを確認します。
まとめ
この記事では、Laravelプロジェクトの作成方法、データベースへの接続方法、データベース用のランダムデータを生成するためのモデル、マイグレーション、ファクトリ、シーダーファイルの作成と設定方法についてご説明しました。また、テスト実行後にデータベースをリセットする方法にも触れました。
LaravelのファクトリとFakerを使用することで、アプリケーションのテストやプレースホルダとして、最小限の構成で、そして数分で、任意の量のテスト(ダミー)データを簡単に生成できることがお分かりいただけたと思います。
Laravelアプリをデプロイする準備ができたら、Kinstaのアプリケーションホスティングサービスで素早く効率的なデプロイをお試しください。
コメントを残す