📘
LaravelとPHPUnitでテスト用DBを使う方法
はじめに
LaravelでPHPUnitを使用する際に、テスト用のDB(MySQL)を
使用する方法について学んだことを備忘録として残します。
テスト用DBを使用することで、テスト時のRefreshDatabase
などで
開発用DBの必要なデータも含め削除されてしまう、といったことを防ぎ
別環境のDBに影響を与えずテストを行うことができます。
環境
- PHP 8.2.7
- Laravel 10.22.0
- PHPUnit 10.3.3
設定手順
database.phpへの設定
まず、Laravelのdatabase.php
のconnections
にテスト用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.php
のconnections
に追記したmysql_test
を設定 -
APP_ENV
にtesting
がデフォルトで設定されていることを確認
この設定を行うことで、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