##環境
Laravel Framework 5.8.38
My SQL 5.6
##テスト用データベースの作成
まずテスト用データベースを作成する必要があるので、MySQLに入ります。
$ mysql -u root;
以下のコマンドで新しいテスト用データベースを作成。
今回はデータベース名をtest_laravel_db とします。
$ create database test_laravel_db;
作成後は一旦、MYSQLから出ます。
次に中身のテーブルを作成する必要があります。
テーブルは実際に使っているデータベースをmigrateによってコピーして使います。
その前準備としてプロジェクト直下にある.envファイルを同じ階層に複製して
ファイル名を.env.testing にしてください。
このファイルを作成する事によって、テスト実行時だけDBなどの環境がこちらのテストファイルに切り替わるようになります。
.env.testingファイルの内容を一部変更します。
変更する項目は以下の通りです。
APP_ENV=test_laravel_db
APP_KEY=
(↑空にします)
DB_DATABASE=test_laravel_db
尚、.envや.env.testingファイルの内容を変更した時はターミナルにてconfigキャッシュをクリアして下さい。
$ php artisan config:clear
先ほどAPP_KEYを空にした理由は、新しいAPP_KEYを発行すると自動で入力されるからです。
新しくAPP_KEYを発行するには以下のコードをターミナルで打ちます。
$ php artisan key:generate --env=testing
後ろに --env=testing を入れないと.env.testingの方にAPP_KEYが入りません。
上記の設定が完了したら、test_laravel_dbに向けてmigrateをします。
$ php artisan migrate --env=testing
ターミナルに成功結果が表示されると思いますが、念のためMySQL内で作れているか確認しましょう。
$ mysql -u root;
$ use test_laravel_db;
$ show tables;
実際のテーブルと同じ内容だったら、テスト用のデータベースの作成が完了です。
テストを正常に作動させるにはあと2つファイルを変更します。
プロジェクト直下にある phpunit.xmlを開きます。
下記のようにコードを追加します。
<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"/>
<server name="DB_CONNECTION" value="test_laravel_db"/>
尚、開発環境によってserverタグをenvタグに変えなくてはいけないケースがあるようですが
私はserverタグのままで大丈夫でした。
次にconfig/database.phpを開きます。
'connections'の配列の中に'sqlite'や'mysql'などがありますが
'mysql'の内容を全てコピーして、'connections'内の中に以下のように収めます。
'test_laravel_db' => [
'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_unicode_ci',
'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'),
]) : [],
設定が完了したら、ターミナルでテストを動かしてみます。
$ ./vendor/bin/phpunit