Laravel 5.8。インメモリの SQLite で PHPUnit テストを行う設定

スポンサードリンク


設定まとめ

  • config/database.php の 'driver' => 'sqlite' の database の値として :memory: を指定する。
  • phpunit.xml の env に name="DB_CONNECTION" value="sqlite" を追加する。

具体的な変更内容

diff --git a/config/database.php b/config/database.php
index 1ba369e..6254fe3 100644
--- a/config/database.php
+++ b/config/database.php
@@ -35,7 +35,7 @@ return [

         'sqlite' => [
             'driver' => 'sqlite',
-            'database' => env('DB_DATABASE', database_path('database.sqlite')),
+            'database' => ':memory:',
             'prefix' => '',
         ],

diff --git a/phpunit.xml b/phpunit.xml
index bb9c4a7..bbec9b0 100644
--- a/phpunit.xml
+++ b/phpunit.xml
@@ -27,5 +27,6 @@
         <env name="CACHE_DRIVER" value="array"/>
         <env name="SESSION_DRIVER" value="array"/>
         <env name="QUEUE_DRIVER" value="sync"/>
+        <env name="DB_CONNECTION" value="sqlite"/>
     </php>
 </phpunit>

注意点

  • :memory ではなく、 :memory: が正しい。間違えた場合、 :memory というファイルが作成され、そこにデータベース内容が記録される。
  • 普段の開発や運用は MySQL で、ユニットテストのみ SQLite としている。このために、ユニットテストでのみマイグレーションが失敗する、という現象が起きた。よって、データベースに固有のマイグレーションを行なっている場合は、本投稿の内容は実行できないかもしれない。

おわりに

ユニットテストを最近ずうっとサボっておりました><。

そろそろやってみようと思い立ち、どうせ始めるならプロジェクトの最初のうちの方がよいので、このタイミングとしました。

普段の開発で使っているデータベースと、ユニットテストで使っているデータベース、どちらにも影響が内容にしたい。 ユニットテストのデータベースは、テストを実行するたびに作成、テスト、破棄をしたい。

何かよい方法はないかと思っておりましたら、次のページにたどり着きました。ありがとうございます!