そもそもテストって?
Laravelのドキュメントには以下のように書かれています。
機能テストでは、複数のオブジェクトが相互作用する方法や、JSONエンドポイントへの完全なHTTPリクエストなど、コードの広い部分をテストします。一般的に、ほとんどのテストは機能テストである必要があります。これらのタイプのテストは、システム全体が意図したとおりに機能しているという信頼性を一番提供します。
少し分かりづらいですが、ザックリ言うとテストは「自分が書いたコードの通りにHTTPレスポンスやDBの処理などが動いているかどうか確かめるもの」です。テストを実行するツールとしてLaravelではPHPUnitがよく用いられています。PHPUnitの内容説明は本投稿の趣旨と異なるため、また別で記事を書こうと思います。
テスト用DBを別で作る理由
理由は単純で開発用DBのデータが削除されてしまうのを防ぐためです。
テストは
1. DBをRefreshDatabase
で全テーブルを削除してから作り直す
2. それぞれのテストケース内でFactory
などを用いてテスト用のダミーデータを作成しテストを実行
ような流れで実行されるケースが多いです。なのでテストを実行するたびに上の手順1で毎回データを消していることになります。
毎回データを作ったり、php artisan migrate:fresh --seed
などのコマンドを叩いてダミーデータを入れるのもかなりしんどいので、それならもうテスト用のDBを作ろうとなるわけです。
環境構築
今回はDockerでの環境構築の工程は省略します。
DockerでLaravel環境構築を行ったリポジトリを用意しているので、こちらをクローンして確認してもらえればと思います。
バージョン
Laravel 9.45.1
PHP 8.1.9
MySQL 8.0.30
ディレクトリ構造
docker/
┣━ apache/
┣━ db/
│ ┣━ data/
│ ┣━ sql/
┗━php/
早速やってみる
早速テスト用のDBを作ります。作り方は色々ありdbコンテナの中で手動でデータベースを作ることもできますがめんどいので、今回はテスト用のDBを作るスクリプトを書く形式で進めます。
まずはコンテナ内の./docker-entrypoint-initdb.d
にスクリプトを書いたファイルを配置します。
docker/
┣━ apache/
┣━ db/
│ ┣━ data/
│ ┣━ sql/
│ ┣━ test_database.sh # 配置
┗━php/
上の場所に新しくtest_database.sh
ファイルを作成し、以下の内容を記述します。
echo "CREATE DATABASE IF NOT EXISTS \`test\` ;" | "${mysql[@]}"
echo "GRANT ALL ON \`test\`.* TO '"$MYSQL_USER"'@'%' ;" | "${mysql[@]}"
echo 'FLUSH PRIVILEGES ;' | "${mysql[@]}"
続いて.env.testing
を.env
と同じ階層に作成します。DBの内容はDB_DATABASE
以外は.env
と同じになります。
APP_ENV=testing
APP_KEY=
DB_CONNECTION=mysql
DB_HOST=
DB_PORT=
DB_DATABASE=テスト用DBの名前
DB_USERNAME=user
DB_PASSWORD=password
先程書いた.env.testing
の環境に対してAPP_KEYを作成します。
php artisan key:generate --env=testing
※設定されない場合は以下のコマンドでキャッシュクリアをして再度試してみて下さい。
php artisan config:clear
最後にマイグレーションを実行します。
php artisan migrate --env=testing
マイグレーションできました!
これでテスト用のDBの作成は完了です!
おわりに
今回はLaravelでテスト用DBの作成を行いました。
次回以降の記事でLaravelのテストの書き方を投稿しようと思います。
初めての投稿だったのですが、文章や内容の構成が冗長になったり、いい表現が見つからなかったりとアウトプットの難しさを痛感しました。定期的に投稿してトレーニングしていこうと思います。
Laravel歴5ヶ月程の初心者なので、間違っている部分があればご指摘頂けますと幸いです🙇♂