ついにテスト実装をやってみる事にしました。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とかを使用出来るようなところまで行ければ準備としては大丈夫な方かと思います!今回は初見なのでここはこうした方が良いなどありましたら教えていただければ嬉しいです。
次回はログイン関係のテストを書いていきます。
今回はこんな感じで!
以上!