Laravelでテストをする前の準備、設定の事(テスト用データベースとか)

2021.01.18

見出し画像

ついにテスト実装をやってみる事にしました。w

全くの初見だったので設定や準備の段階から備忘録として残していきます。初見なのでミスがあるかもしれません。

バージョン

Laravel 7.x

PHP 7.4.8

どこまで実装する?

テスト時のデータベースはテスト用を使用できる状態にある事。

テストデータベースに値を入れたりしながらテストが正しく通る事。

大まかな流れ

.env.testingの作成

database.phpの編集

phpunitファイルの編集

テスト用データベースの作成

テストファイルの編集

テスト用データベースを正しく使用できるか確認

上記のような流れで進めていきます。

.env.testingの作成

やることはそこまで多くありません。まずは.env.testingファイルを作成します。

ファイルの中身は.envファイルのものをコピーして貼り付けます。

一箇所だけ書き換えます。test環境のファイルですよっていう意味ですね。

APP_ENV=local
下記に変更
APP_ENV=test

あとはキャッシュの削除をしないと反映されなかったりするので下記コマンドもターミナルで実行しましょう。

php artisan config:cache

テスト用データベース作成

mysqlにテスト用のデータベースを作成します。

mysql -u root

create database test_db名;

exit

database.phpの編集

こちらもコード一箇所だけ変更になります。デフォルトだとmysqlという配列があると思います。それをコピーしてmysql_testingとして新しく作成します。

データベース名もtest用のものにしていきます。先ほど作成したものですね。

'mysql_testing' => [    名前変更
   'database' => 'test_db名',             変更点
],

phpunitファイルの編集

2箇所変更点があります。phpunitを実行する際に使用するデータベースを設定します。

<php>
   <server name="APP_ENV" value="testing"/>
   <server name="BCRYPT_ROUNDS" value="4"/>
   <server name="CACHE_DRIVER" value="array"/>
   <server name="MAIL_MAILER" value="array"/>
   <server name="QUEUE_CONNECTION" value="sync"/>
   <server name="SESSION_DRIVER" value="array"/>
   <server name="TELESCOPE_ENABLED" value="false"/>
   <server name="DB_CONNECTION" value="mysql_testing"/>      変更点
   <server name="DB_DATABASE" value="test_db名"/>       変更点
   <server name="DB_HOST" value="127.0.0.1"/>
</php>

テスト用データベースを正しく使用できるか確認

まずはマイグレート情報をテスト用dbに落とし込んでいきます。完了したら実際に反映されている確認しましょう。

php artisan migrate --env=testing

laravelにはデフォルトでuserのfactoryが用意されていて、seederも実行できる状態にあります。

なので今回はテスト用dbにseederを実行して値が反映されているかみていきましょう。

テストファイルの編集

その前に1つ先に確認しておきましょう。使用するファイルは最初からあるExampleTest.phpです。

データベースと繋がっているのか確認するコードを書きます。

<?php

namespace Tests\Feature;

use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;

use App\User;
use App\Item;

class ExampleTest extends TestCase
{
   use RefreshDatabase;
   
   public function setUp(): void
   {
       dd(env('APP_ENV'), env('DB_DATABASE'), env('DB_CONNECTION'));
   }
}

上記が書けたら下記のコマンドを実行します。

php artisan config:clear  キャッシュ消してから

vendor/bin/phpunit

ファイル指定で実行したい場合は下記のコマンドで出来ます。

vendor/bin/phpunit tests/Feature/ExampleTest.php

実行すると下記のようになれば成功です。これでテスト用データベースを使用出来そうです。今まで設定したものが表記されていますね。

vendor/bin/phpunit tests/Feature/ExampleTest.php
PHPUnit 8.5.8 by Sebastian Bergmann and contributors.

^ "testing"
^ "test_nekomatch"
^ "mysql_testing"

Seederを使用できるか?

テストファイルに以下の記載を追加します。

public function setUp(): void
{
   parent::setUp();
   
   $this->seed('UserTableSeeder');

}

そして以下のコマンドを実行します。

vendor/bin/phpunit

そうすると先ほど作成したテスト用dbに値が追加されたかと思います。

追加されなかったっていう方はDatabaseSeeder.phpファイルが以下のように設定されているか確認してみてください。あとはfactoryファイルとかもですね。

<?php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
   /**
    * Seed the application's database.
    *
    * @return void
    */
   public function run()
   {
       $this->call(UserTableSeeder::class);   大事
   }
}

最後にシーダーを使ってデータベースとやり取りができる事が確認出来たのでこれで準備は行けてるかと思います。

まとめ

envのtestingファイルを作成する。

データベースもテスト用のものを準備してテストを実行する際には、それを使用出来るようにいくつかのファイルを編集する。

Seederとかを使用出来るようなところまで行ければ準備としては大丈夫な方かと思います!今回は初見なのでここはこうした方が良いなどありましたら教えていただければ嬉しいです。

次回はログイン関係のテストを書いていきます。

今回はこんな感じで!

以上!