📘

LaravelとPHPUnitでテスト用DBを使う方法

2023/09/15に公開

はじめに

LaravelでPHPUnitを使用する際に、テスト用のDB(MySQL)を
使用する方法について学んだことを備忘録として残します。

テスト用DBを使用することで、テスト時のRefreshDatabaseなどで
開発用DBの必要なデータも含め削除されてしまう、といったことを防ぎ
別環境のDBに影響を与えずテストを行うことができます。

環境

  • PHP 8.2.7
  • Laravel 10.22.0
  • PHPUnit 10.3.3

設定手順

database.phpへの設定

まず、Laravelのdatabase.phpconnectionsにテスト用DBの設定を追加します。

database.php
'connections' => [
  ...
  // テスト用
  'mysql_test' => [
    'driver' => 'mysql',
    'url' => env('DATABASE_URL'),
    'host' => env('DB_HOST', '127.0.0.1'),
    'port' => env('DB_PORT', '3306'),
    'database' => env('DB_DATABASE', 'forge'),
    'username' => env('DB_USERNAME', 'forge'),
    'password' => env('DB_PASSWORD', ''),
    'unix_socket' => env('DB_SOCKET', ''),
    'charset' => 'utf8mb4',
    'collation' => 'utf8mb4_bin',
    'prefix' => '',
    'prefix_indexes' => true,
    'strict' => true,
    'engine' => null,
    'options' => extension_loaded('pdo_mysql') ? array_filter([
      PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
    ]) : [],
  ],
],

このmysql_testコネクションはmysqlの設定を基に作成し、
接続情報は後述するテスト用の.env.testingに設定します。

phpunit.xml

次に、phpunit.xmlに以下の設定を追加します。

phpunit.xml
    <php>
        <env name="APP_ENV" value="testing"/> <!-- 設定確認 -->
        <env name="BCRYPT_ROUNDS" value="4"/>
        <env name="CACHE_DRIVER" value="array"/>
        <!-- <env name="DB_CONNECTION" value="sqlite"/> -->
        <!-- <env name="DB_DATABASE" value=":memory:"/> -->
        <env name="MAIL_MAILER" value="array"/>
        <env name="QUEUE_CONNECTION" value="sync"/>
        <env name="SESSION_DRIVER" value="array"/>
        <env name="TELESCOPE_ENABLED" value="false"/>
        <env name="DB_CONNECTION" value="mysql_test"/> <!-- 追加 -->
    </php>

設定内容は以下です。

  • DB_CONNECTIONを追加し、database.phpconnectionsに追記したmysql_testを設定
  • APP_ENVtestingがデフォルトで設定されていることを確認

この設定を行うことで、PHPUnitのテスト時はmysql_testコネクションの設定を
参照し、このコネクションで使用しているenv()
.env.testingを参照するようになります。

.env.testingの設定

次に、.env.exampleをコピーし.env.testingファイルを作成し、
テスト用のDBへの接続情報を設定します。
※その他に必要な情報があれば、このファイルに設定を行います。

.env.testing
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=test_db
DB_USERNAME=testuser
DB_PASSWORD=password

この時の注意点ですが、.env.testingにはデータベース接続情報などの重要な設定が
含まれているため、.gitignore.env.testingを追加し、
バージョン管理から除外します。

テスト用DBの作成

最後に以下コマンドを実行し、テスト用DBを作成します。
--databaseオプションには、database.phpに追記した
テスト用のコネクション名を入力します。

php artisan migrate --database=mysql_test
php artisan db:seed --database=mysql_test

以上で設定は完了です。
これでPHPUnitを使用する際に、独立したテスト用のDBを利用することができます。

Discussion