JavaScriptを有効にしてください

【Laravel】phpunit 実行時にマイグレーションを1回だけ実行する

 ·  ☕ 1 分で読めます

【Laravel】phpunit 実行時に migration を1回だけ実行する

Laravel で phpunit 実行時にテスト側にマイグレーションを一々実行させると時間がかかるのでマイグレーションを1回だけ実行する

実装

実装方法。

phpunit.xml の設定

phpunit.xml に PHPUnit のフックファイルのパスを追記します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
         backupStaticAttributes="false"
         bootstrap="bootstrap/autoload.php"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false">
    <extensions>
        <!-- フック用ファイルのパス -->
        <extension class="Tests\Extension\Migration"/>
    </extensions>
    <php>
        <server name="APP_ENV" value="test"/>
        <server name="DB_CONNECTION" value="test_db"/>
        <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>
</phpunit>

PHPUnit 実行前にマイグレーションを行う

PHPUnit の BeforeFirstTestHook を利用して最初のテスト実行前にマイグレーションを行うようにします。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php

namespace Tests\Extension;

use Illuminate\Contracts\Console\Kernel;
use Illuminate\Support\Facades\Artisan;
use PHPUnit\Runner\BeforeFirstTestHook;

class Migration implements
    BeforeFirstTestHook
{
    /**
     * 最初のテスト実行前に起動
     * 
     * @return void
     */
    public function executeBeforeFirstTest(): void
    {
        // そのままLaravelの機能を使用できないため app を読み込み
        $app = require __DIR__ . '/../../bootstrap/app.php';

        // envファイル読み込み
        $envFile = '.env.' $_SERVER['APP_ENV']);
        $app->loadEnvironmentFrom($envFile);
        $app->make(Kernel::class)->bootstrap();

        // マイグレーション実行
        Artisan::call('migrate:fresh', ['--env' => $_SERVER['APP_ENV']]);
    }
}

これで起動時の最初のテスト前にマイグレーションを実行してくれて各テストの実行速度が早くなります。

共有

こぴぺたん
著者
こぴぺたん
Copy & Paste Engineer