ほとんどをよしなに手軽にやってくれる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!
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の準備に役立ちそうな記事
おわりに
DBに接続する時の設定をする、という当然のことをしただけなんですが、人が用意してくれた自動化環境(AWSやらdocke)に慣れてしまうと、触れる機会が少なくなってしまうものです。
こういう基本的なとこに触れるのも、たまにはいいですよね。