7
7

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 3 years have passed since last update.

laravelでテスト用DBを設定する手順

Posted at

ほとんどをよしなに手軽にやってくれるLaravelですが、
DBを使うphpunit設定はちょっと分かりにくいです。

SQLSTATE[HY000] [1044] Access denied for user 'user'@'%' to database 'test_db'

↑phpunitのコマンドでこんな表示があった人は、幸せにできる記事です。

※DBはmysql

設定のポイント

・テスト用のDB(スキーマ)を作る必要がある
作成したスキーマに、テスト時に使う接続設定(ユーザー権限)を加える必要がある
・phpunit側に接続情報を加える必要がある

1 テスト用のDBを作成する

ここではrootユーザーで接続している想定です。

CREATE SCEMA test_db;

2 アクセス権限の設定

laravelの接続情報(.envに書くDB_USERNAMEのとこ)がroot以外のユーザーの場合、
デフォルトではrootユーザーが作成したDBへのアクセス権限がない場合がある(rootユーザ以外でSHOW DATABASESしてもDB一覧に表示されない)。

ので、rootユーザーでGRANT文を実行、アクセス権限を与えて、テストで使えるようにしてあげる

GRANT ALL ON test_db.* TO user(ユーザー名);

もし権限を与えたいユーザー名がわからない時は、mysqlスキーマから確認

mysql> SHOW DATABASES; -- スキーマ一覧を表示

+--------------------+
| Database           |
+--------------------+
| information_schema |
| app_db             |
| mysql              |
| performance_schema |
| sys                |
| test_db            |
+--------------------+

mysql> use mysql;

mysql> select * FROM user;
-- ユーザーとHOST(どこからの接続を許容するか)、ユーザーが持つ権限も表示される

※ アプリ用DBユーザとテスト用DBユーザを分けるメリットはそれほどないと思うので、laravelの.envに書いてあるユーザーでいいと思います。

3 phpunit.xmlに接続情報を記入

あとは、.envに書いてある接続情報を、phpunit.xmlに書いてあげればOK!

.env
DB_DATABASE=db # アプリで使うDB
DB_USERNAME=user
DB_PASSWORD=pw

.envに↑みたいに書いてあったら、↓のように書く。

    <php>
        <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"/>
        <!-- テストで使うDBのスキーマ名 -->
        <server name="DB_DATABASE" value="test_db"/>
        <!-- 接続するuserの名前 -->
        <server name="DB_USERNAME" value="user"/>
        <!-- 接続するuserのパスワード -->
        <server name="DB_PASSWORD" value="pw"/>
    </php>

DBを使うテストファイルを実行してみましょう。

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

記事冒頭のエラーで困っていた人は、解決できているハズ!

その他phpunitの準備に役立ちそうな記事

PHPUnitの使い方メモ

MySQLをMacのターミナルで操作するときのメモ

おわりに

DBに接続する時の設定をする、という当然のことをしただけなんですが、人が用意してくれた自動化環境(AWSやらdocke)に慣れてしまうと、触れる機会が少なくなってしまうものです。

こういう基本的なとこに触れるのも、たまにはいいですよね。

7
7
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
7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?