CakePHPでFakerを使いテスト用データを自動生成する

プログラミング

概要

CakePHPにはDBを構築するマイグレーション、ダミーデータを作成するシーダーという機能があります。さらにシーダーの応用として、Fakerというパッケージの機能を使うことで、ランダムにテストデータを自動生成することができます。
今回は、Fakerを使ったダミーデータの作成をしてみたいと思います。

環境情報

  • XAMPP 8.0.6
  • php 8.0.6(requires PHP >= 7.1.)
  • CakePHP 4.2.6
  • fakerphp/faker 1.15.0
  • MariaDB 10.4.1

CakePHPでFakerを使いテスト用データを自動生成する

composerでFakerをインストール

composer require --dev fakerphp/faker
※ --dev:開発環境のみに導入

CakePHP公式(https://book.cakephp.org/3/ja/phinx/seeding.html#faker)では「fzaninotto/faker」をインストールしていますが、Pakagist(https://packagist.org/?query=faker)では「Abandoned!」と表示されており、後継パッケージの「fakerphp/faker」を利用することが推奨されています。(2021/7/20 時点)

互換性エラーが出た場合はオプションを付けることで解決できます。

composer require --dev fakerphp/faker --with-all-dependencies

composer.json を確認

"require-dev": {
    "cakedc/cakephp-phpstan": "^1.0",
    "cakephp/bake": "^2.0.3",
    "cakephp/cakephp-codesniffer": "~4.2.0",
    "cakephp/debug_kit": "^4.1",
    "dereuromark/cakephp-ide-helper": "^1.11",
    "fakerphp/faker": "^1.15",
    "josegonzalez/dotenv": "^3.2",
    "phpstan/phpstan": "^0.12.85",
    "phpunit/phpunit": "~8.5.0",
    "psy/psysh": "@stable"
},

パッケージが追加されていることを確認できます。

マイグレーションでユーザテーブルを準備する

ユーザテーブル作成用マイグレーションファイルをbakeで生成します。

bin\cake bake migration CreateUsers

以下にファイルが作成されました。
\config\Migrations\20210720140235_CreateUsers.php
中身を以下のように書き換えます。

<?php
declare(strict_types=1);

use Migrations\AbstractMigration;

class CreateUsers extends AbstractMigration
{
    /**
     * Up Method.
     *
     * More information on this method is available here:
     * https://book.cakephp.org/phinx/0/en/migrations.html#the-up-method
     * @return void
     */
    public function up()
    {
        $table = $this->table('users');
        $table->addColumn('first_name', 'string', [
            'default' => null,
            'limit' => 30,
            'null' => false,
        ]);
        $table->addColumn('last_name', 'string', [
            'default' => null,
            'limit' => 30,
            'null' => false,
        ]);
        $table->addColumn('first_kana_name', 'string', [
            'default' => null,
            'limit' => 30,
            'null' => false,
        ]);
        $table->addColumn('last_kana_name', 'string', [
            'default' => null,
            'limit' => 30,
            'null' => false,
        ]);
        $table->addColumn('password', 'string', [
            'default' => null,
            'limit' => 30,
            'null' => false,
        ]);
        $table->addColumn('tel', 'string', [
            'default' => null,
            'limit' => 16,
            'null' => false,
        ]);
        $table->addColumn('email', 'string', [
            'default' => null,
            'limit' => 30,
            'null' => false,
        ]);
        $table->addColumn('postcode', 'string', [
            'default' => null,
            'limit' => 10,
            'null' => false,
        ]);
        $table->addColumn('address', 'string', [
            'default' => null,
            'limit' => 255,
            'null' => false,
        ]);
        $table->addColumn('memo', 'text', [
            'default' => null,
            'null' => false,
        ]);
        $table->addColumn('created', 'datetime', [
            'default' => null,
            'null' => false,
        ]);
        $table->addColumn('modified', 'datetime', [
            'default' => null,
            'null' => false,
        ]);
        $table->create();
    }

    /**
     * Down Method.
     *
     * More information on this method is available here:
     * https://book.cakephp.org/phinx/0/en/migrations.html#the-up-method
     * @return void
     */
    public function down()
    {
        $this->table('users')->drop()->save();
    }
}

マイグレーションを実行します。

bin\cake migrations migrate

ユーザテーブル用のシードファイルを準備する

ユーザテーブルシード作成用のファイルをbakeで生成します。

bin\cake bake seed FakerUsers

以下にファイルが作成されました。
\config\Seeds\FakerUsersSeed.php
中身を以下のように書き換えます。

<?php
declare(strict_types=1);

use Migrations\AbstractSeed;

/**
 * FakerUsers seed.
 */
class FakerUsersSeed extends AbstractSeed
{
    /**
     * Run Method.
     *
     * Write your database seeder using this method.
     *
     * More information on writing seeds is available here:
     * https://book.cakephp.org/phinx/0/en/seeding.html
     *
     * @return void
     */
    public function run()
    {

        $faker = Faker\Factory::create('ja_JP');
        $faker->seed(1234); // 毎回同じ順序でデータを作成したい場合はシード値をセット

        $data = [];
        for ($i = 0; $i < 100; $i++) {
            $data[] = [
                'first_name'      => $faker->firstName(),
                'last_name'       => $faker->lastName(),
                'first_kana_name' => $faker->firstKanaName(),
                'last_kana_name'  => $faker->lastKanaName(),
                'password'        => sha1($faker->password()),
                'tel'             => $faker->phoneNumber(),
                'email'           => $faker->safeEmail(),
                'postcode'        => $faker->postcode(),
                'address'         => $faker->prefecture() . $faker->city() . $faker->streetAddress(),
                'memo'            => $faker->realText(),
                'created'         => date('Y-m-d H:i:s'),
                'modified'        => date('Y-m-d H:i:s'),
            ];
        }
        $this->insert('users', $data);
    }
}

シーダーのマイグレーションを実行します。

bin\cake migrations seed

DBのUsersテーブルにレコードが挿入されていることを確認できます。
データ例は以下のとおりです。

array(12) {
    'first_name' =>
    string(6) "七夏"
    'last_name' =>
    string(6) "笹田"
    'first_kana_name' =>
    string(6) "リカ"
    'last_kana_name' =>
    string(12) "ミヤザワ"
    'password' =>
    string(40) "45e1b0e04044142e93ea0780c7012fc478a2eddc"
    'tel' =>
    string(12) "075-453-9914"
    'email' =>
    string(22) "ayamaguchi@example.com"
    'postcode' =>
    string(7) "1772694"
    'address' =>
    string(41) "新潟県大垣市鈴木町西之園5-4-2"
    'memo' =>
    string(600) "えないように立ちどまで、「どうしておりなけぁよかってさっと前のくると考えてふりかかりがやいて真珠しんば んめんまでもかけ、ある裏町うらまあおとともりがいました。私はこち歩きました。つましたらしかしなすったようか」「もう海から、ジョバンニとすれて、まるでどきちら小さな平ひらきっと双子ふたちこち見ていたのでした。「なんだかそうに、指ゆびさしなす"...
    'created' =>
    string(19) "2021-08-21 18:59:27"
    'modified' =>
    string(19) "2021-08-21 18:59:27"
  }

first_name や email など利用できるFormatters(フォーマッター)については
こちらのページでご紹介していますので、合わせてご覧いただければと思います。
FakerのFormattersを使いこなす

通常のSeedとFakerSeedを分けて管理する

本番環境でも利用するような初期マスターデータ用のSeedとダミーデータ用のFakerSeedを分けて管理したい場合はSeedsフォルダ以下にFakersフォルダを作成し、その中でFakerを管理すると大変便利です。

通常、migration seedコマンドを実行すると、すべてのSeedファイルが実行されますが、フォルダ階層を設けることで、一度に実行されないようになります。フォルダ分けをした場合は、フォルダパスを明示的に指定することで実行することができます。

FakerSeedファイルがconfig\Seeds\Fakersにある場合は、以下を実行します。

bin\cake migrations seed --source Seeds\Fakers

さらに、1ファイルずつ実行したい場合は、以下を実行します。

bin\cake migrations seed --seed FakerUsersSeed --source Seeds\Fakers

まとめ

FakerSeedを利用することで、テストデータを自動生成する方法をご紹介しました。
ループの回数を10万回などに変更すれば、負荷試験用のデータ準備もコマンド1つでできるため、とても便利です。

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