1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Laravelでテスト用DBを作る

Posted at

そもそもテストって?

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ファイルを作成し、以下の内容を記述します。

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と同じになります。

.env.testing
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

image.png

マイグレーションできました!
これでテスト用のDBの作成は完了です!

おわりに

今回はLaravelでテスト用DBの作成を行いました。

次回以降の記事でLaravelのテストの書き方を投稿しようと思います。
初めての投稿だったのですが、文章や内容の構成が冗長になったり、いい表現が見つからなかったりとアウトプットの難しさを痛感しました。定期的に投稿してトレーニングしていこうと思います。

Laravel歴5ヶ月程の初心者なので、間違っている部分があればご指摘頂けますと幸いです🙇‍♂

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?