Laravel 6.x : UnitTest で テスト用のDBを利用

note

  1. test用のDBを作成する

    • CREATE DATABASE `xxx_testing`;
  2. test用DBの接続設定

    • phpunit.xml + .env.testing
  3. RefreshDatabase トレイトでマイグレーションを実行

  4. テスト用のレコードを作成

    • Factory + Faker
      • Factory: DBにデータを挿入する機能
      • Faker: ランダムなダミー値を生成する機能
    • (Factoryphp artisan make:factory XxxxFactory --model=Xxxx で作成)
  5. テスト実行前に config:clear Artisanコマンドで設定キャッシュをクリアする

サンプル

// phpunit.xml

    <php>
        <server name="APP_ENV" value="testing"/>
        <server name="BCRYPT_ROUNDS" value="4"/>
        <server name="CACHE_DRIVER" value="array"/>
        <server name="MAIL_DRIVER" value="array"/>
        <server name="QUEUE_CONNECTION" value="sync"/>
        <server name="SESSION_DRIVER" value="array"/>
    </php>
// .env.testing
//  PHPUnit や Artisan コマンド を --env=testing オプション付きで実行時に `.envファイル` の内容をオーバーライドする

DB_CONNECTION=xxx
DB_HOST=xxx
DB_PORT=xxx
DB_DATABASE=xxx_testing
DB_USERNAME=xxx
DB_PASSWORD=xxx
// Factory
// `databases/factories/UserFactory.php` (プロジェクト作成時に自動で生成されるサンプル)

$factory->define(User::class, function (Faker $faker) {
    return [
        'name' => $faker->name, //Faker でランダムなダミー値を設定
        'email' => $faker->unique()->safeEmail,
        'email_verified_at' => now(),
        'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
        'remember_token' => Str::random(10),
    ];
});
// UnitTest

final class XxxxTest extends TestCase
{
    // テスト実行時に自動的にマイグレーションを実行 + テスト中に変更したレコードを元に戻す
    use RefreshDatabase;

    public function setUp(): void
    {
        parent::setUp();

        // テスト実行前に config:clear Artisan コマンドで設定キャッシュをクリア
        Artisan::call('config:clear');
    }

    public function testXXX()
    {
        // テスト用のデータを 1 件生成
        //  UserFactory.php で設定した Faker でランダムなダミー値のデータが生成される
        factory(User::class)->create();

        // テストを書く
    }